Clear pending doSomeWork messages when sleeping for offload
The offload sleeping stops as soon as a new DO_SOME_WORK message is handled (because this indicates an expected change in rendering and we want to stop sleeping until we know it's safe to do so). Every exit path from doSomeWork needs to clear other pending DO_SOME_WORK messages as these requests have already been handled by the current method invocation. This currently doesn't happen from the offload sleeping return path and a previously queued DO_SOME_WORK message can immediately wake up the rendering loop again. Fix this by moving the message removal to the beginning of the doSomeWork method (as it prevents forgetting it in one of the exit paths later). PiperOrigin-RevId: 456259715
This commit is contained in:
parent
6dc85dc241
commit
a7649b639c
@ -960,12 +960,14 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
|
|
||||||
private void doSomeWork() throws ExoPlaybackException, IOException {
|
private void doSomeWork() throws ExoPlaybackException, IOException {
|
||||||
long operationStartTimeMs = clock.uptimeMillis();
|
long operationStartTimeMs = clock.uptimeMillis();
|
||||||
|
// Remove other pending DO_SOME_WORK requests that are handled by this invocation.
|
||||||
|
handler.removeMessages(MSG_DO_SOME_WORK);
|
||||||
|
|
||||||
updatePeriods();
|
updatePeriods();
|
||||||
|
|
||||||
if (playbackInfo.playbackState == Player.STATE_IDLE
|
if (playbackInfo.playbackState == Player.STATE_IDLE
|
||||||
|| playbackInfo.playbackState == Player.STATE_ENDED) {
|
|| playbackInfo.playbackState == Player.STATE_ENDED) {
|
||||||
// Remove all messages. Prepare (in case of IDLE) or seek (in case of ENDED) will resume.
|
// Nothing to do. Prepare (in case of IDLE) or seek (in case of ENDED) will resume.
|
||||||
handler.removeMessages(MSG_DO_SOME_WORK);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1088,8 +1090,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
sleepingForOffload = !maybeScheduleWakeup(operationStartTimeMs, ACTIVE_INTERVAL_MS);
|
sleepingForOffload = !maybeScheduleWakeup(operationStartTimeMs, ACTIVE_INTERVAL_MS);
|
||||||
} else if (enabledRendererCount != 0 && playbackInfo.playbackState != Player.STATE_ENDED) {
|
} else if (enabledRendererCount != 0 && playbackInfo.playbackState != Player.STATE_ENDED) {
|
||||||
scheduleNextWork(operationStartTimeMs, IDLE_INTERVAL_MS);
|
scheduleNextWork(operationStartTimeMs, IDLE_INTERVAL_MS);
|
||||||
} else {
|
|
||||||
handler.removeMessages(MSG_DO_SOME_WORK);
|
|
||||||
}
|
}
|
||||||
if (playbackInfo.sleepingForOffload != sleepingForOffload) {
|
if (playbackInfo.sleepingForOffload != sleepingForOffload) {
|
||||||
playbackInfo = playbackInfo.copyWithSleepingForOffload(sleepingForOffload);
|
playbackInfo = playbackInfo.copyWithSleepingForOffload(sleepingForOffload);
|
||||||
@ -1125,7 +1125,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void scheduleNextWork(long thisOperationStartTimeMs, long intervalMs) {
|
private void scheduleNextWork(long thisOperationStartTimeMs, long intervalMs) {
|
||||||
handler.removeMessages(MSG_DO_SOME_WORK);
|
|
||||||
handler.sendEmptyMessageAtTime(MSG_DO_SOME_WORK, thisOperationStartTimeMs + intervalMs);
|
handler.sendEmptyMessageAtTime(MSG_DO_SOME_WORK, thisOperationStartTimeMs + intervalMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user