Skip to content

Commit

Permalink
KUX-1451: [Audit] Set initial playback bitrate (#815)
Browse files Browse the repository at this point in the history
* KUX-1451: [Audit] Set initial playback bitrate

* KUX-1451: [Audit] Set initial playback bitrate
  • Loading branch information
volodymyr-bondarenko85 authored May 13, 2024
1 parent 3abe388 commit 53ffec6
Show file tree
Hide file tree
Showing 4 changed files with 177 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.kaltura.android.exoplayer2.upstream;

public interface KBandwidthMeter extends BandwidthMeter {
void resetBitrateEstimate();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package com.kaltura.android.exoplayer2.upstream;

import android.content.Context;
import android.os.Handler;

import androidx.annotation.Nullable;

import com.google.errorprone.annotations.CanIgnoreReturnValue;
import com.kaltura.android.exoplayer2.util.Clock;


public class KDefaultBandwidthMeter implements KBandwidthMeter, TransferListener {

private final DefaultBandwidthMeter wrappedDefaultBandwidthMeter;

@Nullable
private final Long initialBitrateEstimate;

@Nullable
private Long bitrateEstimate;

private KDefaultBandwidthMeter(DefaultBandwidthMeter defaultBandwidthMeter, @Nullable Long initialBitrateEstimate) {
this.wrappedDefaultBandwidthMeter = defaultBandwidthMeter;
this.initialBitrateEstimate = initialBitrateEstimate;
bitrateEstimate = null;
}

public void resetBitrateEstimate() {
bitrateEstimate = initialBitrateEstimate;
}

@Override
public long getBitrateEstimate() {
if (bitrateEstimate != null) {
return bitrateEstimate;
}
return wrappedDefaultBandwidthMeter.getBitrateEstimate();
}

@Nullable
@Override
public TransferListener getTransferListener() {
return this;
}

@Override
public void addEventListener(Handler handler, EventListener eventListener) {
wrappedDefaultBandwidthMeter.addEventListener(handler, eventListener);
}

@Override
public void removeEventListener(EventListener eventListener) {
wrappedDefaultBandwidthMeter.removeEventListener(eventListener);
}

@Override
public void onTransferInitializing(DataSource dataSource, DataSpec dataSpec, boolean b) {
wrappedDefaultBandwidthMeter.onTransferInitializing(dataSource, dataSpec, b);
}

@Override
public void onTransferStart(DataSource dataSource, DataSpec dataSpec, boolean b) {
wrappedDefaultBandwidthMeter.onTransferStart(dataSource, dataSpec, b);
}

@Override
public void onBytesTransferred(DataSource dataSource, DataSpec dataSpec, boolean b, int i) {
wrappedDefaultBandwidthMeter.onBytesTransferred(dataSource, dataSpec, b, i);
}

@Override
public void onTransferEnd(DataSource dataSource, DataSpec dataSpec, boolean b) {
wrappedDefaultBandwidthMeter.onTransferEnd(dataSource, dataSpec, b);
bitrateEstimate = null;
}

public static final class Builder {
private final DefaultBandwidthMeter.Builder wrappedBuilder;

@Nullable
private Long initialBitrateEstimate = null;

public Builder(Context context) {
wrappedBuilder = new DefaultBandwidthMeter.Builder(context);
}

@CanIgnoreReturnValue
public KDefaultBandwidthMeter.Builder setSlidingWindowMaxWeight(int slidingWindowMaxWeight) {
wrappedBuilder.setSlidingWindowMaxWeight(slidingWindowMaxWeight);
return this;
}

@CanIgnoreReturnValue
public KDefaultBandwidthMeter.Builder setInitialBitrateEstimate(long initialBitrateEstimate) {
this.initialBitrateEstimate = initialBitrateEstimate;
wrappedBuilder.setInitialBitrateEstimate(initialBitrateEstimate);
return this;
}

@CanIgnoreReturnValue
public KDefaultBandwidthMeter.Builder setInitialBitrateEstimate(int networkType, long initialBitrateEstimate) {
wrappedBuilder.setInitialBitrateEstimate(networkType, initialBitrateEstimate);
return this;
}

@CanIgnoreReturnValue
public KDefaultBandwidthMeter.Builder setInitialBitrateEstimate(String countryCode) {
wrappedBuilder.setInitialBitrateEstimate(countryCode);
return this;
}

@CanIgnoreReturnValue
public KDefaultBandwidthMeter.Builder setClock(Clock clock) {
wrappedBuilder.setClock(clock);
return this;
}

@CanIgnoreReturnValue
public KDefaultBandwidthMeter.Builder setResetOnNetworkTypeChange(boolean resetOnNetworkTypeChange) {
wrappedBuilder.setResetOnNetworkTypeChange(resetOnNetworkTypeChange);
return this;
}

public KDefaultBandwidthMeter build() {
return new KDefaultBandwidthMeter(wrappedBuilder.build(), initialBitrateEstimate);
}
}
}
31 changes: 31 additions & 0 deletions playkit/src/main/java/com/kaltura/playkit/player/ABRSettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@

public class ABRSettings {

public enum InitialBitrateEstimatePolicy {
INITIAL_SETUP_ONLY,
RESET_ON_MEDIA_CHANGE
}

private Long initialBitrateEstimate = null;
private InitialBitrateEstimatePolicy initialBitrateEstimatePolicy = InitialBitrateEstimatePolicy.INITIAL_SETUP_ONLY;
private Long maxVideoBitrate = Long.MAX_VALUE;
private Long minVideoBitrate = Long.MIN_VALUE;
private Long maxVideoHeight = Long.MAX_VALUE;
Expand Down Expand Up @@ -43,6 +49,27 @@ public ABRSettings setInitialBitrateEstimate(Long initialBitrateEstimate) {
return this;
}

/**
* Sets the initial bitrate estimate policy.
*
* <br>
* <br>
* Using {@link ABRSettings.InitialBitrateEstimatePolicy#INITIAL_SETUP_ONLY}
* will set the provided initial bitrate only on start on playback
* <br>
* Using {@link ABRSettings.InitialBitrateEstimatePolicy#RESET_ON_MEDIA_CHANGE}
* will set the provided initial bitrate on each media change
* <br>
* Default is {@link ABRSettings.InitialBitrateEstimatePolicy#INITIAL_SETUP_ONLY}
*
* @param initialBitrateEstimatePolicy The initial bitrate estimate policy.
* @return ABRSettings
*/
public ABRSettings setInitialBitrateEstimatePolicy(InitialBitrateEstimatePolicy initialBitrateEstimatePolicy) {
this.initialBitrateEstimatePolicy = initialBitrateEstimatePolicy;
return this;
}

/**
* Set minVideoBitrate in ABR
*
Expand Down Expand Up @@ -139,6 +166,10 @@ public Long getInitialBitrateEstimate() {
return initialBitrateEstimate;
}

public InitialBitrateEstimatePolicy getAbrInitialBitrateEstimatePolicy() {
return initialBitrateEstimatePolicy;
}

public Long getMaxVideoHeight() {
return maxVideoHeight;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@
import com.kaltura.android.exoplayer2.upstream.DefaultDataSource;
import com.kaltura.android.exoplayer2.upstream.DefaultHttpDataSource;
import com.kaltura.android.exoplayer2.upstream.HttpDataSource;
import com.kaltura.android.exoplayer2.upstream.KBandwidthMeter;
import com.kaltura.android.exoplayer2.upstream.KDefaultBandwidthMeter;
import com.kaltura.android.exoplayer2.upstream.TeeDataSource;
import com.kaltura.android.exoplayer2.upstream.TransferListener;
import com.kaltura.android.exoplayer2.upstream.UdpDataSource;
Expand Down Expand Up @@ -205,7 +207,7 @@ public interface LoadControlStrategy {
if (customLoadControlStrategy != null && customLoadControlStrategy.getCustomBandwidthMeter() != null) {
bandwidthMeter = customLoadControlStrategy.getCustomBandwidthMeter();
} else {
DefaultBandwidthMeter.Builder bandwidthMeterBuilder = new DefaultBandwidthMeter.Builder(context);
KDefaultBandwidthMeter.Builder bandwidthMeterBuilder = new KDefaultBandwidthMeter.Builder(context);

Long initialBitrateEstimate = playerSettings.getAbrSettings().getInitialBitrateEstimate();

Expand Down Expand Up @@ -1121,6 +1123,8 @@ public void load(PKMediaSourceConfig mediaSourceConfig) {
// for change media case need to verify if surface swap is needed
maybeChangePlayerRenderView();

maybeResetBitrateEstimate();

// for change speed adjustment case need to verify if re-init is required
maybeReInitPlayerOnSpeedAdjustmentChange(mediaSourceConfig.mediaSource.getMediaFormat());
}
Expand Down Expand Up @@ -1160,6 +1164,14 @@ private void maybeReInitPlayerOnSpeedAdjustmentChange(PKMediaFormat format) {
this.useSpeedAdjustingRenderer = useSpeedAdjustingRenderer;
}

private void maybeResetBitrateEstimate() {
if (playerSettings.getAbrSettings().getAbrInitialBitrateEstimatePolicy() == ABRSettings.InitialBitrateEstimatePolicy.RESET_ON_MEDIA_CHANGE) {
if (bandwidthMeter instanceof KBandwidthMeter) {
((KBandwidthMeter)bandwidthMeter).resetBitrateEstimate();
}
}
}

@Override
public PlayerView getView() {
return exoPlayerView;
Expand Down

0 comments on commit 53ffec6

Please sign in to comment.