From f48ad85b196a9adab622bd4185d5073c01416cd9 Mon Sep 17 00:00:00 2001 From: eguven Date: Mon, 19 Nov 2018 06:18:55 -0800 Subject: [PATCH] Add experiment to use WindowedTrackBitrateEstimator WindowedTrackBitrateEstimator, uses future and past chunks in a window of time to estimate track bitrate values. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=222065409 --- .../WindowedTrackBitrateEstimator.java | 21 ++++++++++--------- .../WindowedTrackBitrateEstimatorTest.java | 16 +++++++------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/WindowedTrackBitrateEstimator.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/WindowedTrackBitrateEstimator.java index 960b22e83b..0def71c800 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/WindowedTrackBitrateEstimator.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/WindowedTrackBitrateEstimator.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.trackselection; import android.support.annotation.Nullable; +import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.source.chunk.MediaChunk; import com.google.android.exoplayer2.source.chunk.MediaChunkIterator; @@ -25,22 +26,22 @@ import java.util.List; /** A {@link TrackBitrateEstimator} which derives estimates from a window of time. */ public final class WindowedTrackBitrateEstimator implements TrackBitrateEstimator { - private final long maxFutureDurationUs; private final long maxPastDurationUs; + private final long maxFutureDurationUs; private final boolean useFormatBitrateAsLowerBound; /** - * @param maxFutureDurationUs Maximum duration of future chunks to be included in average bitrate - * values, in microseconds. - * @param maxPastDurationUs Maximum duration of past chunks to be included in average bitrate - * values, in microseconds. - * @param useFormatBitrateAsLowerBound Whether to return the estimated bitrate only if it's higher - * than the bitrate of the track's format. + * @param maxPastDurationMs Maximum duration of past chunks to be included in average bitrate + * values, in milliseconds. + * @param maxFutureDurationMs Maximum duration of future chunks to be included in average bitrate + * values, in milliseconds. + * @param useFormatBitrateAsLowerBound Whether to use the bitrate of the track's format as a lower + * bound for the estimated bitrate. */ public WindowedTrackBitrateEstimator( - long maxFutureDurationUs, long maxPastDurationUs, boolean useFormatBitrateAsLowerBound) { - this.maxFutureDurationUs = maxFutureDurationUs; - this.maxPastDurationUs = maxPastDurationUs; + long maxPastDurationMs, long maxFutureDurationMs, boolean useFormatBitrateAsLowerBound) { + this.maxPastDurationUs = C.msToUs(maxPastDurationMs); + this.maxFutureDurationUs = C.msToUs(maxFutureDurationMs); this.useFormatBitrateAsLowerBound = useFormatBitrateAsLowerBound; } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/WindowedTrackBitrateEstimatorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/WindowedTrackBitrateEstimatorTest.java index 59c5092fc0..52b52e1df4 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/WindowedTrackBitrateEstimatorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/WindowedTrackBitrateEstimatorTest.java @@ -35,14 +35,14 @@ import org.robolectric.RobolectricTestRunner; @RunWith(RobolectricTestRunner.class) public class WindowedTrackBitrateEstimatorTest { - private static final long MAX_DURATION_US = 30 * C.MICROS_PER_SECOND; + private static final long MAX_DURATION_MS = 30_000; @Test public void getBitrates_zeroMaxDuration_returnsFormatBitrates() { WindowedTrackBitrateEstimator estimator = new WindowedTrackBitrateEstimator( - /* maxFutureDurationUs= */ 0, - /* maxPastDurationUs= */ 0, + /* maxPastDurationMs= */ 0, + /* maxFutureDurationMs= */ 0, /* useFormatBitrateAsLowerBound= */ false); MediaChunk chunk = createMediaChunk(/* formatBitrate= */ 5, /* actualBitrate= */ 10); MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(8); @@ -64,7 +64,7 @@ public class WindowedTrackBitrateEstimatorTest { public void getBitrates_futureMaxDurationSet_returnsEstimateUsingFutureChunks() { WindowedTrackBitrateEstimator estimator = new WindowedTrackBitrateEstimator( - MAX_DURATION_US, /* maxPastDurationUs= */ 0, /* useFormatBitrateAsLowerBound= */ false); + /* maxPastDurationMs= */ 0, MAX_DURATION_MS, /* useFormatBitrateAsLowerBound= */ false); MediaChunk chunk = createMediaChunk(/* formatBitrate= */ 5, /* actualBitrate= */ 10); MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(8); MediaChunkIterator iterator2 = createMediaChunkIteratorWithBitrate(16); @@ -85,8 +85,8 @@ public class WindowedTrackBitrateEstimatorTest { public void getBitrates_pastMaxDurationSet_returnsEstimateUsingPastChunks() { WindowedTrackBitrateEstimator estimator = new WindowedTrackBitrateEstimator( - /* maxFutureDurationUs= */ 0, - MAX_DURATION_US, + MAX_DURATION_MS, + /* maxFutureDurationMs= */ 0, /* useFormatBitrateAsLowerBound= */ false); MediaChunk chunk = createMediaChunk(/* formatBitrate= */ 5, /* actualBitrate= */ 10); MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(8); @@ -109,7 +109,7 @@ public class WindowedTrackBitrateEstimatorTest { getBitrates_useFormatBitrateAsLowerBoundSetTrue_returnsEstimateIfOnlyHigherThanFormat() { WindowedTrackBitrateEstimator estimator = new WindowedTrackBitrateEstimator( - MAX_DURATION_US, MAX_DURATION_US, /* useFormatBitrateAsLowerBound= */ true); + MAX_DURATION_MS, MAX_DURATION_MS, /* useFormatBitrateAsLowerBound= */ true); MediaChunk chunk = createMediaChunk(/* formatBitrate= */ 5, /* actualBitrate= */ 10); MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(80); MediaChunkIterator iterator2 = createMediaChunkIteratorWithBitrate(16); @@ -130,7 +130,7 @@ public class WindowedTrackBitrateEstimatorTest { public void getBitrates_bitratesArrayGiven_returnsTheSameArray() { WindowedTrackBitrateEstimator estimator = new WindowedTrackBitrateEstimator( - MAX_DURATION_US, MAX_DURATION_US, /* useFormatBitrateAsLowerBound= */ true); + MAX_DURATION_MS, MAX_DURATION_MS, /* useFormatBitrateAsLowerBound= */ true); MediaChunk chunk = createMediaChunk(/* formatBitrate= */ 5, /* actualBitrate= */ 10); MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(8); MediaChunkIterator iterator2 = createMediaChunkIteratorWithBitrate(16);