Get updated buffered position when calling shouldStartPlayback
The buffered position was last updated before the beginning of the renderer loop in doSomeWork. As the loading happens on a background thread, it may have progressed further already depending on how long it took to run the renderer loop. It's slightly more correct to pass in an updated value to shouldStartPlayback so that playback can start quicker if the buffering is particularly fast. PiperOrigin-RevId: 679203465
This commit is contained in:
parent
2dde824bde
commit
138a8d65ca
@ -1076,7 +1076,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
&& playbackInfo.playbackParameters.speed == 1f) {
|
&& playbackInfo.playbackParameters.speed == 1f) {
|
||||||
float adjustedSpeed =
|
float adjustedSpeed =
|
||||||
livePlaybackSpeedControl.getAdjustedPlaybackSpeed(
|
livePlaybackSpeedControl.getAdjustedPlaybackSpeed(
|
||||||
getCurrentLiveOffsetUs(), getTotalBufferedDurationUs());
|
getCurrentLiveOffsetUs(), playbackInfo.totalBufferedDurationUs);
|
||||||
if (mediaClock.getPlaybackParameters().speed != adjustedSpeed) {
|
if (mediaClock.getPlaybackParameters().speed != adjustedSpeed) {
|
||||||
setMediaClockPlaybackParameters(playbackInfo.playbackParameters.withSpeed(adjustedSpeed));
|
setMediaClockPlaybackParameters(playbackInfo.playbackParameters.withSpeed(adjustedSpeed));
|
||||||
handlePlaybackParameters(
|
handlePlaybackParameters(
|
||||||
@ -2015,19 +2015,22 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
// it is possible for playback to be stuck buffering waiting for this. Therefore, we start
|
// it is possible for playback to be stuck buffering waiting for this. Therefore, we start
|
||||||
// playback regardless of buffered duration if we are waiting for an ad media period to prepare.
|
// playback regardless of buffered duration if we are waiting for an ad media period to prepare.
|
||||||
boolean isAdPendingPreparation = loadingHolder.info.id.isAd() && !loadingHolder.prepared;
|
boolean isAdPendingPreparation = loadingHolder.info.id.isAd() && !loadingHolder.prepared;
|
||||||
return isBufferedToEnd
|
if (isBufferedToEnd || isAdPendingPreparation) {
|
||||||
|| isAdPendingPreparation
|
return true;
|
||||||
|| loadControl.shouldStartPlayback(
|
}
|
||||||
new LoadControl.Parameters(
|
// Get updated buffered duration as it may have changed since the start of the renderer loop.
|
||||||
playerId,
|
long bufferedDurationUs = getTotalBufferedDurationUs(loadingHolder.getBufferedPositionUs());
|
||||||
playbackInfo.timeline,
|
return loadControl.shouldStartPlayback(
|
||||||
playingPeriodHolder.info.id,
|
new LoadControl.Parameters(
|
||||||
playingPeriodHolder.toPeriodTime(rendererPositionUs),
|
playerId,
|
||||||
getTotalBufferedDurationUs(),
|
playbackInfo.timeline,
|
||||||
mediaClock.getPlaybackParameters().speed,
|
playingPeriodHolder.info.id,
|
||||||
playbackInfo.playWhenReady,
|
playingPeriodHolder.toPeriodTime(rendererPositionUs),
|
||||||
isRebuffering,
|
bufferedDurationUs,
|
||||||
targetLiveOffsetUs));
|
mediaClock.getPlaybackParameters().speed,
|
||||||
|
playbackInfo.playWhenReady,
|
||||||
|
isRebuffering,
|
||||||
|
targetLiveOffsetUs));
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isTimelineReady() {
|
private boolean isTimelineReady() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user