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
This commit is contained in:
parent
c096e156b1
commit
f48ad85b19
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user