[webkit-changes] [WebKit/WebKit] 86301d: [GStreamer] Rework playback rates handling

Xabier Rodríguez noreply at github.com
Wed Sep 27 10:34:36 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 86301d12f31fa6659af3ee6fc5c0ac8be73b73a7
      https://github.com/WebKit/WebKit/commit/86301d12f31fa6659af3ee6fc5c0ac8be73b73a7
  Author: Xabier Rodriguez-Calvar <calvaris at igalia.com>
  Date:   2023-09-27 (Wed, 27 Sep 2023)

  Changed paths:
    M LayoutTests/TestExpectations
    A LayoutTests/media/media-source/media-source-play-zero-playbackrate-expected.txt
    A LayoutTests/media/media-source/media-source-play-zero-playbackrate.html
    M LayoutTests/platform/glib/TestExpectations
    M Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
    M Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h
    M Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp

  Log Message:
  -----------
  [GStreamer] Rework playback rates handling
https://bugs.webkit.org/show_bug.cgi?id=259732

Reviewed by Alicia Boya Garcia.

There were some use cases in MSE where playback rate change was not working properly and it was decided that a better
idea would be to do a rework of the playback rate handling in the base class. The idea was to not do playback rate state
changes out of the updateStates functions (both regular and MSE) because calling that function should do what is
expected at any moment. In order to do that, we needed to switch the boolean variable representing if pipeline was
paused because of rate into something more reflecting the different states we could be in. We created a self explanatory
enum class (that also was comments to make it even more clear) and set that state when needed for updateStates to move
the pipeline if needed.

A fly-by fix was to make the paused function to return true when we are also moving to paused during an async state
change because the test we are introducing here arose this flaky bug more clearly. The bug was that the media element
went bananas could not realize the player was paused (or on its way to pause) and it was skipping state changes and
playback rate changes.

* LayoutTests/TestExpectations:
* LayoutTests/media/media-source/media-source-play-zero-playbackrate-expected.txt: Added.
* LayoutTests/media/media-source/media-source-play-zero-playbackrate.html: Added.
* LayoutTests/platform/glib/TestExpectations:
* Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivateGStreamer::play):
(WebCore::MediaPlayerPrivateGStreamer::pause):
(WebCore::MediaPlayerPrivateGStreamer::paused const):
(WebCore::MediaPlayerPrivateGStreamer::updatePlaybackRate):
(WebCore::MediaPlayerPrivateGStreamer::setRate):
(WebCore::MediaPlayerPrivateGStreamer::updateStates):
* Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
* Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp:
(WebCore::MediaPlayerPrivateGStreamerMSE::play):
(WebCore::MediaPlayerPrivateGStreamerMSE::pause):
(WebCore::MediaPlayerPrivateGStreamerMSE::updateStates):

Canonical link: https://commits.webkit.org/268518@main




More information about the webkit-changes mailing list