Skip to content

Conversation

@tomasz-karczewski-red
Copy link

https://bugs.webkit.org/show_bug.cgi?id=263317

Reviewed by Philippe Normand.

When issuing seeks and play or pauses close to each other, there can be race conditions. To solve then first we need to avoid changing the pipeline state while seeking. Then we need to ensure we know if the pipeline change was rejected or failed, so the function signature was changed. We also need to consider that when a pause is requested by the element and the player issues it to the pipeline, we are paused because it can take some time for the pipeline to pause and if the element queries too fast, it can lead to more race conditions.

  • LayoutTests/media/media-controller-play-then-pause-expected.txt:
  • LayoutTests/media/media-controller-play-then-pause.html:
  • LayoutTests/media/media-source/media-controller-media-source-play-then-pause-expected.txt: Added.
  • LayoutTests/media/media-source/media-controller-media-source-play-then-pause.html: Added.
  • LayoutTests/media/media-source/media-source-seek-and-play-expected.txt: Added.
  • LayoutTests/media/media-source/media-source-seek-and-play.html: Added.
  • LayoutTests/media/media-source/media-source-video-seek-pause-expected.txt: Added.
  • LayoutTests/media/media-source/media-source-video-seek-pause.html: Added.
  • LayoutTests/media/video-seek-pause-expected.txt: Added.
  • LayoutTests/media/video-seek-pause.html: Added.
  • LayoutTests/media/video-test.js: (return.new.Promise):
  • LayoutTests/platform/glib/TestExpectations:
  • LayoutTests/platform/ios/TestExpectations:
  • Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivateGStreamer::isPipelineSeeking const): (WebCore::MediaPlayerPrivateGStreamer::play):
    (WebCore::MediaPlayerPrivateGStreamer::pause):
    (WebCore::MediaPlayerPrivateGStreamer::paused const): (WebCore::MediaPlayerPrivateGStreamer::seekToTarget): (WebCore::MediaPlayerPrivateGStreamer::changePipelineState): (WebCore::MediaPlayerPrivateGStreamer::handleMessage):
  • Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
  • Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp: (WebCore::MediaPlayerPrivateGStreamerMSE::updateStates):
  • Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h:
  • Source/WebCore/testing/Internals.cpp: (WebCore::Internals::isPlayerPaused const):
  • Source/WebCore/testing/Internals.h:
  • Source/WebCore/testing/Internals.idl:

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

https://bugs.webkit.org/show_bug.cgi?id=263317

Reviewed by Philippe Normand.

When issuing seeks and play or pauses close to each other, there can be race conditions. To solve then first we need to
avoid changing the pipeline state while seeking. Then we need to ensure we know if the pipeline change was rejected or
failed, so the function signature was changed. We also need to consider that when a pause is requested by the element
and the player issues it to the pipeline, we are paused because it can take some time for the pipeline to pause and if
the element queries too fast, it can lead to more race conditions.

* LayoutTests/media/media-controller-play-then-pause-expected.txt:
* LayoutTests/media/media-controller-play-then-pause.html:
* LayoutTests/media/media-source/media-controller-media-source-play-then-pause-expected.txt: Added.
* LayoutTests/media/media-source/media-controller-media-source-play-then-pause.html: Added.
* LayoutTests/media/media-source/media-source-seek-and-play-expected.txt: Added.
* LayoutTests/media/media-source/media-source-seek-and-play.html: Added.
* LayoutTests/media/media-source/media-source-video-seek-pause-expected.txt: Added.
* LayoutTests/media/media-source/media-source-video-seek-pause.html: Added.
* LayoutTests/media/video-seek-pause-expected.txt: Added.
* LayoutTests/media/video-seek-pause.html: Added.
* LayoutTests/media/video-test.js:
(return.new.Promise):
* LayoutTests/platform/glib/TestExpectations:
* LayoutTests/platform/ios/TestExpectations:
* Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivateGStreamer::isPipelineSeeking const):
(WebCore::MediaPlayerPrivateGStreamer::play):
(WebCore::MediaPlayerPrivateGStreamer::pause):
(WebCore::MediaPlayerPrivateGStreamer::paused const):
(WebCore::MediaPlayerPrivateGStreamer::seekToTarget):
(WebCore::MediaPlayerPrivateGStreamer::changePipelineState):
(WebCore::MediaPlayerPrivateGStreamer::handleMessage):
* Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
* Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp:
(WebCore::MediaPlayerPrivateGStreamerMSE::updateStates):
* Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h:
* Source/WebCore/testing/Internals.cpp:
(WebCore::Internals::isPlayerPaused const):
* Source/WebCore/testing/Internals.h:
* Source/WebCore/testing/Internals.idl:

Canonical link: https://commits.webkit.org/273977@main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants