Commit f48ad85b by eguven Committed by Oliver Woodman

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
parent c096e156
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
package com.google.android.exoplayer2.trackselection; package com.google.android.exoplayer2.trackselection;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.source.chunk.MediaChunk; import com.google.android.exoplayer2.source.chunk.MediaChunk;
import com.google.android.exoplayer2.source.chunk.MediaChunkIterator; import com.google.android.exoplayer2.source.chunk.MediaChunkIterator;
...@@ -25,22 +26,22 @@ import java.util.List; ...@@ -25,22 +26,22 @@ import java.util.List;
/** A {@link TrackBitrateEstimator} which derives estimates from a window of time. */ /** A {@link TrackBitrateEstimator} which derives estimates from a window of time. */
public final class WindowedTrackBitrateEstimator implements TrackBitrateEstimator { public final class WindowedTrackBitrateEstimator implements TrackBitrateEstimator {
private final long maxFutureDurationUs;
private final long maxPastDurationUs; private final long maxPastDurationUs;
private final long maxFutureDurationUs;
private final boolean useFormatBitrateAsLowerBound; private final boolean useFormatBitrateAsLowerBound;
/** /**
* @param maxFutureDurationUs Maximum duration of future chunks to be included in average bitrate * @param maxPastDurationMs Maximum duration of past chunks to be included in average bitrate
* values, in microseconds. * values, in milliseconds.
* @param maxPastDurationUs Maximum duration of past chunks to be included in average bitrate * @param maxFutureDurationMs Maximum duration of future chunks to be included in average bitrate
* values, in microseconds. * values, in milliseconds.
* @param useFormatBitrateAsLowerBound Whether to return the estimated bitrate only if it's higher * @param useFormatBitrateAsLowerBound Whether to use the bitrate of the track's format as a lower
* than the bitrate of the track's format. * bound for the estimated bitrate.
*/ */
public WindowedTrackBitrateEstimator( public WindowedTrackBitrateEstimator(
long maxFutureDurationUs, long maxPastDurationUs, boolean useFormatBitrateAsLowerBound) { long maxPastDurationMs, long maxFutureDurationMs, boolean useFormatBitrateAsLowerBound) {
this.maxFutureDurationUs = maxFutureDurationUs; this.maxPastDurationUs = C.msToUs(maxPastDurationMs);
this.maxPastDurationUs = maxPastDurationUs; this.maxFutureDurationUs = C.msToUs(maxFutureDurationMs);
this.useFormatBitrateAsLowerBound = useFormatBitrateAsLowerBound; this.useFormatBitrateAsLowerBound = useFormatBitrateAsLowerBound;
} }
......
...@@ -35,14 +35,14 @@ import org.robolectric.RobolectricTestRunner; ...@@ -35,14 +35,14 @@ import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class WindowedTrackBitrateEstimatorTest { 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 @Test
public void getBitrates_zeroMaxDuration_returnsFormatBitrates() { public void getBitrates_zeroMaxDuration_returnsFormatBitrates() {
WindowedTrackBitrateEstimator estimator = WindowedTrackBitrateEstimator estimator =
new WindowedTrackBitrateEstimator( new WindowedTrackBitrateEstimator(
/* maxFutureDurationUs= */ 0, /* maxPastDurationMs= */ 0,
/* maxPastDurationUs= */ 0, /* maxFutureDurationMs= */ 0,
/* useFormatBitrateAsLowerBound= */ false); /* useFormatBitrateAsLowerBound= */ false);
MediaChunk chunk = createMediaChunk(/* formatBitrate= */ 5, /* actualBitrate= */ 10); MediaChunk chunk = createMediaChunk(/* formatBitrate= */ 5, /* actualBitrate= */ 10);
MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(8); MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(8);
...@@ -64,7 +64,7 @@ public class WindowedTrackBitrateEstimatorTest { ...@@ -64,7 +64,7 @@ public class WindowedTrackBitrateEstimatorTest {
public void getBitrates_futureMaxDurationSet_returnsEstimateUsingFutureChunks() { public void getBitrates_futureMaxDurationSet_returnsEstimateUsingFutureChunks() {
WindowedTrackBitrateEstimator estimator = WindowedTrackBitrateEstimator estimator =
new WindowedTrackBitrateEstimator( new WindowedTrackBitrateEstimator(
MAX_DURATION_US, /* maxPastDurationUs= */ 0, /* useFormatBitrateAsLowerBound= */ false); /* maxPastDurationMs= */ 0, MAX_DURATION_MS, /* useFormatBitrateAsLowerBound= */ false);
MediaChunk chunk = createMediaChunk(/* formatBitrate= */ 5, /* actualBitrate= */ 10); MediaChunk chunk = createMediaChunk(/* formatBitrate= */ 5, /* actualBitrate= */ 10);
MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(8); MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(8);
MediaChunkIterator iterator2 = createMediaChunkIteratorWithBitrate(16); MediaChunkIterator iterator2 = createMediaChunkIteratorWithBitrate(16);
...@@ -85,8 +85,8 @@ public class WindowedTrackBitrateEstimatorTest { ...@@ -85,8 +85,8 @@ public class WindowedTrackBitrateEstimatorTest {
public void getBitrates_pastMaxDurationSet_returnsEstimateUsingPastChunks() { public void getBitrates_pastMaxDurationSet_returnsEstimateUsingPastChunks() {
WindowedTrackBitrateEstimator estimator = WindowedTrackBitrateEstimator estimator =
new WindowedTrackBitrateEstimator( new WindowedTrackBitrateEstimator(
/* maxFutureDurationUs= */ 0, MAX_DURATION_MS,
MAX_DURATION_US, /* maxFutureDurationMs= */ 0,
/* useFormatBitrateAsLowerBound= */ false); /* useFormatBitrateAsLowerBound= */ false);
MediaChunk chunk = createMediaChunk(/* formatBitrate= */ 5, /* actualBitrate= */ 10); MediaChunk chunk = createMediaChunk(/* formatBitrate= */ 5, /* actualBitrate= */ 10);
MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(8); MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(8);
...@@ -109,7 +109,7 @@ public class WindowedTrackBitrateEstimatorTest { ...@@ -109,7 +109,7 @@ public class WindowedTrackBitrateEstimatorTest {
getBitrates_useFormatBitrateAsLowerBoundSetTrue_returnsEstimateIfOnlyHigherThanFormat() { getBitrates_useFormatBitrateAsLowerBoundSetTrue_returnsEstimateIfOnlyHigherThanFormat() {
WindowedTrackBitrateEstimator estimator = WindowedTrackBitrateEstimator estimator =
new WindowedTrackBitrateEstimator( 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); MediaChunk chunk = createMediaChunk(/* formatBitrate= */ 5, /* actualBitrate= */ 10);
MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(80); MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(80);
MediaChunkIterator iterator2 = createMediaChunkIteratorWithBitrate(16); MediaChunkIterator iterator2 = createMediaChunkIteratorWithBitrate(16);
...@@ -130,7 +130,7 @@ public class WindowedTrackBitrateEstimatorTest { ...@@ -130,7 +130,7 @@ public class WindowedTrackBitrateEstimatorTest {
public void getBitrates_bitratesArrayGiven_returnsTheSameArray() { public void getBitrates_bitratesArrayGiven_returnsTheSameArray() {
WindowedTrackBitrateEstimator estimator = WindowedTrackBitrateEstimator estimator =
new WindowedTrackBitrateEstimator( 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); MediaChunk chunk = createMediaChunk(/* formatBitrate= */ 5, /* actualBitrate= */ 10);
MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(8); MediaChunkIterator iterator1 = createMediaChunkIteratorWithBitrate(8);
MediaChunkIterator iterator2 = createMediaChunkIteratorWithBitrate(16); MediaChunkIterator iterator2 = createMediaChunkIteratorWithBitrate(16);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment