Allow to specify initial bitrate estimate in DefaultBandwidthMeter.

This value is logically part of the bandwidth estimation and will eventually be
moved there from the adaptive track selection.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=187597038
This commit is contained in:
tonihei 2018-03-02 02:09:40 -08:00 committed by Oliver Woodman
parent 4373e63fac
commit 5fb6fc1226

View File

@ -16,6 +16,7 @@
package com.google.android.exoplayer2.upstream;
import android.os.Handler;
import android.support.annotation.Nullable;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Clock;
import com.google.android.exoplayer2.util.SlidingPercentile;
@ -26,16 +27,94 @@ import com.google.android.exoplayer2.util.SlidingPercentile;
*/
public final class DefaultBandwidthMeter implements BandwidthMeter, TransferListener<Object> {
/**
* The default maximum weight for the sliding window.
*/
public static final int DEFAULT_MAX_WEIGHT = 2000;
/** Default initial bitrate estimate in bits per second. */
public static final long DEFAULT_INITIAL_BITRATE_ESTIMATE = BandwidthMeter.NO_ESTIMATE;
/** Default maximum weight for the sliding window. */
public static final int DEFAULT_SLIDING_WINDOW_MAX_WEIGHT = 2000;
/** Builder for a bandwidth meter. */
public static final class Builder {
private @Nullable Handler eventHandler;
private @Nullable EventListener eventListener;
private long initialBitrateEstimate;
private int slidingWindowMaxWeight;
private Clock clock;
/** Creates a builder with default parameters and without listener. */
public Builder() {
initialBitrateEstimate = DEFAULT_INITIAL_BITRATE_ESTIMATE;
slidingWindowMaxWeight = DEFAULT_SLIDING_WINDOW_MAX_WEIGHT;
clock = Clock.DEFAULT;
}
/**
* Sets an event listener for new bandwidth estimates.
*
* @param eventHandler A handler for events.
* @param eventListener A listener of events.
* @return This builder.
* @throws IllegalArgumentException If the event handler or listener are null.
*/
public Builder setEventListener(Handler eventHandler, EventListener eventListener) {
Assertions.checkArgument(eventHandler != null && eventListener != null);
this.eventHandler = eventHandler;
this.eventListener = eventListener;
return this;
}
/**
* Sets the maximum weight for the sliding window.
*
* @param slidingWindowMaxWeight The maximum weight for the sliding window.
* @return This builder.
*/
public Builder setSlidingWindowMaxWeight(int slidingWindowMaxWeight) {
this.slidingWindowMaxWeight = slidingWindowMaxWeight;
return this;
}
/**
* Sets the initial bitrate estimate in bits per second that should be assumed when a bandwidth
* estimate is unavailable.
*
* @param initialBitrateEstimate The initial bitrate estimate in bits per second.
* @return This builder.
*/
public Builder setInitialBitrateEstimate(long initialBitrateEstimate) {
this.initialBitrateEstimate = initialBitrateEstimate;
return this;
}
/**
* Sets the clock used to estimate bandwidth from data transfers. Should only be set for testing
* purposes.
*
* @param clock The clock used to estimate bandwidth from data transfers.
* @return This builder.
*/
public Builder setClock(Clock clock) {
this.clock = clock;
return this;
}
/**
* Builds the bandwidth meter.
*
* @return A bandwidth meter with the configured properties.
*/
public DefaultBandwidthMeter build() {
return new DefaultBandwidthMeter(
eventHandler, eventListener, initialBitrateEstimate, slidingWindowMaxWeight, clock);
}
}
private static final int ELAPSED_MILLIS_FOR_ESTIMATE = 2000;
private static final int BYTES_TRANSFERRED_FOR_ESTIMATE = 512 * 1024;
private final Handler eventHandler;
private final EventListener eventListener;
private final @Nullable Handler eventHandler;
private final @Nullable EventListener eventListener;
private final SlidingPercentile slidingPercentile;
private final Clock clock;
@ -47,25 +126,44 @@ public final class DefaultBandwidthMeter implements BandwidthMeter, TransferList
private long totalBytesTransferred;
private long bitrateEstimate;
/** Creates a bandwidth meter with default parameters. */
public DefaultBandwidthMeter() {
this(null, null);
this(
/* eventHandler= */ null,
/* eventListener= */ null,
DEFAULT_INITIAL_BITRATE_ESTIMATE,
DEFAULT_SLIDING_WINDOW_MAX_WEIGHT,
Clock.DEFAULT);
}
/** @deprecated Use {@link Builder} instead. */
@Deprecated
public DefaultBandwidthMeter(Handler eventHandler, EventListener eventListener) {
this(eventHandler, eventListener, DEFAULT_MAX_WEIGHT);
this(
eventHandler,
eventListener,
DEFAULT_INITIAL_BITRATE_ESTIMATE,
DEFAULT_SLIDING_WINDOW_MAX_WEIGHT,
Clock.DEFAULT);
}
/** @deprecated Use {@link Builder} instead. */
@Deprecated
public DefaultBandwidthMeter(Handler eventHandler, EventListener eventListener, int maxWeight) {
this(eventHandler, eventListener, maxWeight, Clock.DEFAULT);
this(eventHandler, eventListener, DEFAULT_INITIAL_BITRATE_ESTIMATE, maxWeight, Clock.DEFAULT);
}
public DefaultBandwidthMeter(Handler eventHandler, EventListener eventListener, int maxWeight,
private DefaultBandwidthMeter(
@Nullable Handler eventHandler,
@Nullable EventListener eventListener,
long initialBitrateEstimate,
int maxWeight,
Clock clock) {
this.eventHandler = eventHandler;
this.eventListener = eventListener;
this.slidingPercentile = new SlidingPercentile(maxWeight);
this.clock = clock;
bitrateEstimate = NO_ESTIMATE;
bitrateEstimate = initialBitrateEstimate;
}
@Override
@ -98,9 +196,7 @@ public final class DefaultBandwidthMeter implements BandwidthMeter, TransferList
slidingPercentile.addSample((int) Math.sqrt(sampleBytesTransferred), bitsPerSecond);
if (totalElapsedTimeMs >= ELAPSED_MILLIS_FOR_ESTIMATE
|| totalBytesTransferred >= BYTES_TRANSFERRED_FOR_ESTIMATE) {
float bitrateEstimateFloat = slidingPercentile.getPercentile(0.5f);
bitrateEstimate = Float.isNaN(bitrateEstimateFloat) ? NO_ESTIMATE
: (long) bitrateEstimateFloat;
bitrateEstimate = (long) slidingPercentile.getPercentile(0.5f);
}
}
notifyBandwidthSample(sampleElapsedTimeMs, sampleBytesTransferred, bitrateEstimate);
@ -120,5 +216,4 @@ public final class DefaultBandwidthMeter implements BandwidthMeter, TransferList
});
}
}
}