mirror of
https://github.com/samsonjs/media.git
synced 2026-04-10 12:05:47 +00:00
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
(cherry picked from commit a7649b639c)
This commit is contained in:
parent
4e51ef5a2c
commit
59fbb45506
1 changed files with 4 additions and 5 deletions
|
|
@ -960,12 +960,14 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||
|
||||
private void doSomeWork() throws ExoPlaybackException, IOException {
|
||||
long operationStartTimeMs = clock.uptimeMillis();
|
||||
// Remove other pending DO_SOME_WORK requests that are handled by this invocation.
|
||||
handler.removeMessages(MSG_DO_SOME_WORK);
|
||||
|
||||
updatePeriods();
|
||||
|
||||
if (playbackInfo.playbackState == Player.STATE_IDLE
|
||||
|| playbackInfo.playbackState == Player.STATE_ENDED) {
|
||||
// Remove all messages. Prepare (in case of IDLE) or seek (in case of ENDED) will resume.
|
||||
handler.removeMessages(MSG_DO_SOME_WORK);
|
||||
// Nothing to do. Prepare (in case of IDLE) or seek (in case of ENDED) will resume.
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1088,8 +1090,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||
sleepingForOffload = !maybeScheduleWakeup(operationStartTimeMs, ACTIVE_INTERVAL_MS);
|
||||
} else if (enabledRendererCount != 0 && playbackInfo.playbackState != Player.STATE_ENDED) {
|
||||
scheduleNextWork(operationStartTimeMs, IDLE_INTERVAL_MS);
|
||||
} else {
|
||||
handler.removeMessages(MSG_DO_SOME_WORK);
|
||||
}
|
||||
if (playbackInfo.sleepingForOffload != sleepingForOffload) {
|
||||
playbackInfo = playbackInfo.copyWithSleepingForOffload(sleepingForOffload);
|
||||
|
|
@ -1125,7 +1125,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||
}
|
||||
|
||||
private void scheduleNextWork(long thisOperationStartTimeMs, long intervalMs) {
|
||||
handler.removeMessages(MSG_DO_SOME_WORK);
|
||||
handler.sendEmptyMessageAtTime(MSG_DO_SOME_WORK, thisOperationStartTimeMs + intervalMs);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue