mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Allow LoadControl to configure the back-buffer.
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=175833398
This commit is contained in:
parent
bd0bc03f64
commit
28693ac7d6
3 changed files with 52 additions and 3 deletions
|
|
@ -25,7 +25,7 @@ import com.google.android.exoplayer2.util.Util;
|
||||||
/**
|
/**
|
||||||
* The default {@link LoadControl} implementation.
|
* The default {@link LoadControl} implementation.
|
||||||
*/
|
*/
|
||||||
public final class DefaultLoadControl implements LoadControl {
|
public class DefaultLoadControl implements LoadControl {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The default minimum duration of media that the player will attempt to ensure is buffered at all
|
* The default minimum duration of media that the player will attempt to ensure is buffered at all
|
||||||
|
|
@ -163,6 +163,16 @@ public final class DefaultLoadControl implements LoadControl {
|
||||||
return allocator;
|
return allocator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getBackBufferDurationUs() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean retainBackBufferFromKeyframe() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldStartPlayback(long bufferedDurationUs, boolean rebuffering) {
|
public boolean shouldStartPlayback(long bufferedDurationUs, boolean rebuffering) {
|
||||||
long minBufferDurationUs = rebuffering ? bufferForPlaybackAfterRebufferUs : bufferForPlaybackUs;
|
long minBufferDurationUs = rebuffering ? bufferForPlaybackAfterRebufferUs : bufferForPlaybackUs;
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,8 @@ import java.io.IOException;
|
||||||
private final Timeline.Window window;
|
private final Timeline.Window window;
|
||||||
private final Timeline.Period period;
|
private final Timeline.Period period;
|
||||||
private final MediaPeriodInfoSequence mediaPeriodInfoSequence;
|
private final MediaPeriodInfoSequence mediaPeriodInfoSequence;
|
||||||
|
private final long backBufferDurationUs;
|
||||||
|
private final boolean retainBackBufferFromKeyframe;
|
||||||
|
|
||||||
private PlaybackInfo playbackInfo;
|
private PlaybackInfo playbackInfo;
|
||||||
private PlaybackParameters playbackParameters;
|
private PlaybackParameters playbackParameters;
|
||||||
|
|
@ -147,6 +149,9 @@ import java.io.IOException;
|
||||||
this.state = Player.STATE_IDLE;
|
this.state = Player.STATE_IDLE;
|
||||||
this.player = player;
|
this.player = player;
|
||||||
|
|
||||||
|
backBufferDurationUs = loadControl.getBackBufferDurationUs();
|
||||||
|
retainBackBufferFromKeyframe = loadControl.retainBackBufferFromKeyframe();
|
||||||
|
|
||||||
playbackInfo = new PlaybackInfo(null, null, 0, C.TIME_UNSET);
|
playbackInfo = new PlaybackInfo(null, null, 0, C.TIME_UNSET);
|
||||||
rendererCapabilities = new RendererCapabilities[renderers.length];
|
rendererCapabilities = new RendererCapabilities[renderers.length];
|
||||||
for (int i = 0; i < renderers.length; i++) {
|
for (int i = 0; i < renderers.length; i++) {
|
||||||
|
|
@ -541,7 +546,8 @@ import java.io.IOException;
|
||||||
TraceUtil.beginSection("doSomeWork");
|
TraceUtil.beginSection("doSomeWork");
|
||||||
|
|
||||||
updatePlaybackPositions();
|
updatePlaybackPositions();
|
||||||
playingPeriodHolder.mediaPeriod.discardBuffer(playbackInfo.positionUs, false);
|
playingPeriodHolder.mediaPeriod.discardBuffer(playbackInfo.positionUs - backBufferDurationUs,
|
||||||
|
retainBackBufferFromKeyframe);
|
||||||
|
|
||||||
boolean allRenderersEnded = true;
|
boolean allRenderersEnded = true;
|
||||||
boolean allRenderersReadyOrEnded = true;
|
boolean allRenderersReadyOrEnded = true;
|
||||||
|
|
@ -732,7 +738,8 @@ import java.io.IOException;
|
||||||
setPlayingPeriodHolder(newPlayingPeriodHolder);
|
setPlayingPeriodHolder(newPlayingPeriodHolder);
|
||||||
if (playingPeriodHolder.hasEnabledTracks) {
|
if (playingPeriodHolder.hasEnabledTracks) {
|
||||||
periodPositionUs = playingPeriodHolder.mediaPeriod.seekToUs(periodPositionUs);
|
periodPositionUs = playingPeriodHolder.mediaPeriod.seekToUs(periodPositionUs);
|
||||||
playingPeriodHolder.mediaPeriod.discardBuffer(periodPositionUs, false);
|
playingPeriodHolder.mediaPeriod.discardBuffer(periodPositionUs - backBufferDurationUs,
|
||||||
|
retainBackBufferFromKeyframe);
|
||||||
}
|
}
|
||||||
resetRendererPosition(periodPositionUs);
|
resetRendererPosition(periodPositionUs);
|
||||||
maybeContinueLoading();
|
maybeContinueLoading();
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,38 @@ public interface LoadControl {
|
||||||
*/
|
*/
|
||||||
Allocator getAllocator();
|
Allocator getAllocator();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the duration of media to retain in the buffer prior to the current playback position,
|
||||||
|
* for fast backward seeking.
|
||||||
|
* <p>
|
||||||
|
* Note: If {@link #retainBackBufferFromKeyframe()} is false then seeking in the back-buffer will
|
||||||
|
* only be fast if the back-buffer contains a keyframe prior to the seek position.
|
||||||
|
* <p>
|
||||||
|
* Note: Implementations should return a single value. Dynamic changes to the back-buffer are not
|
||||||
|
* currently supported.
|
||||||
|
*
|
||||||
|
* @return The duration of media to retain in the buffer prior to the current playback position,
|
||||||
|
* in microseconds.
|
||||||
|
*/
|
||||||
|
long getBackBufferDurationUs();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether media should be retained from the keyframe before the current playback position
|
||||||
|
* minus {@link #getBackBufferDurationUs()}, rather than any sample before or at that position.
|
||||||
|
* <p>
|
||||||
|
* Warning: Returning true will cause the back-buffer size to depend on the spacing of keyframes
|
||||||
|
* in the media being played. Returning true is not recommended unless you control the media and
|
||||||
|
* are comfortable with the back-buffer size exceeding {@link #getBackBufferDurationUs()} by as
|
||||||
|
* much as the maximum duration between adjacent keyframes in the media.
|
||||||
|
* <p>
|
||||||
|
* Note: Implementations should return a single value. Dynamic changes to the back-buffer are not
|
||||||
|
* currently supported.
|
||||||
|
*
|
||||||
|
* @return Whether media should be retained from the keyframe before the current playback position
|
||||||
|
* minus {@link #getBackBufferDurationUs()}, rather than any sample before or at that position.
|
||||||
|
*/
|
||||||
|
boolean retainBackBufferFromKeyframe();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by the player to determine whether sufficient media is buffered for playback to be
|
* Called by the player to determine whether sufficient media is buffered for playback to be
|
||||||
* started or resumed.
|
* started or resumed.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue