Skip to content

Commit 2b361c9

Browse files
committed
[GStreamer] Account for internal pauses because of buffering
https://bugs.webkit.org/show_bug.cgi?id=287881 Reviewed by Xabier Rodriguez-Calvar and Philippe Normand. The PlaybackRatePausedState in MediaPlayerPrivateGStreamer only accounts for different pause reasons because of manual pause and playbackRate == 0, but pauses because of low buffering level should also be accounted. Currently they aren't (but the player can get paused because of it) and that's confusing the code that deals with pauses/unpauses because of playbackRate. See: #1455 This downstream PR proposes to "abuse" PlaybackRatePausedState::RatePaused to keep tack of pauses because of buffering, but that's conceptually wrong. A new BufferingPaused state should be created to keep track of this pause reason and be able to recover from it (unpause) later. This commit creates that new BufferingPaused state and keeps track of it in a similar way to how ManuallyPaused is managed (but pauses for buffering aren't explicit manual pauses). Co-authored by: suresh-khurdiya-infosys <skhurdiya.ext@libertyglobal.com> * Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivateGStreamer::play): Also set RatePaused when we're in the BufferingPaused state and playbackRate is zero. (WebCore::MediaPlayerPrivateGStreamer::updateStates): Set m_playbackRatePausedState to RatePaused when the rate is actually zero, and to BufferingPaused when the pause happens because of buffering. * Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: Added new PlaybackRatePausedState::BufferingPaused state and explanation. Canonical link: https://commits.webkit.org/290606@main
1 parent 1e741d4 commit 2b361c9

2 files changed

Lines changed: 12 additions & 3 deletions

File tree

Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,8 @@ void MediaPlayerPrivateGStreamer::play()
434434

435435
if (!m_playbackRate) {
436436
if (m_playbackRatePausedState == PlaybackRatePausedState::InitiallyPaused
437-
|| m_playbackRatePausedState == PlaybackRatePausedState::ManuallyPaused)
437+
|| m_playbackRatePausedState == PlaybackRatePausedState::ManuallyPaused
438+
|| m_playbackRatePausedState == PlaybackRatePausedState::BufferingPaused)
438439
m_playbackRatePausedState = PlaybackRatePausedState::RatePaused;
439440
return;
440441
}
@@ -2620,8 +2621,13 @@ void MediaPlayerPrivateGStreamer::updateStates()
26202621
m_isPaused = false;
26212622

26222623
shouldPauseForBuffering = (!m_wasBuffering && m_isBuffering && !m_isLiveStream.value_or(false));
2623-
if (shouldPauseForBuffering || !m_playbackRate) {
2624-
GST_INFO_OBJECT(pipeline(), "[Buffering] Pausing stream for buffering or because of zero playback rate.");
2624+
if (!m_playbackRate) {
2625+
GST_INFO_OBJECT(pipeline(), "[Buffering] Pausing stream because of zero playback rate.");
2626+
m_playbackRatePausedState = PlaybackRatePausedState::RatePaused;
2627+
changePipelineState(GST_STATE_PAUSED);
2628+
} else if (shouldPauseForBuffering) {
2629+
GST_INFO_OBJECT(pipeline(), "[Buffering] Pausing stream for buffering.");
2630+
m_playbackRatePausedState = PlaybackRatePausedState::BufferingPaused;
26252631
changePipelineState(GST_STATE_PAUSED);
26262632
}
26272633
} else

Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,9 @@ class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateInterface
313313
ManuallyPaused,
314314
// Pipeline was playing and rate was set to zero.
315315
RatePaused,
316+
// Pipeline was playing and had to be paused for buffering reasons. This state is
317+
// like ManuallyPaused, but not requested by the user.
318+
BufferingPaused,
316319
// Pipeline was paused because of zero rate and it should be playing. This is not a
317320
// definitive state, just an operational transition from RatePaused to Playing to keep the
318321
// pipeline state changes contained in updateStates.

0 commit comments

Comments
 (0)