[webkit-changes] [WebKit/WebKit] 3e5ad5: [MSE][GStreamer] Actually do flushes, unify m_hasA...

Alicia Boya García noreply at github.com
Thu May 25 03:48:40 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 3e5ad5ea060bfc76de9b71e81a4f4cde51a871e9
      https://github.com/WebKit/WebKit/commit/3e5ad5ea060bfc76de9b71e81a4f4cde51a871e9
  Author: Alicia Boya Garcia <aboya at igalia.com>
  Date:   2023-05-25 (Thu, 25 May 2023)

  Changed paths:
    M Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp
    M Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h
    M Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.cpp
    M Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.h
    M Source/WebCore/platform/graphics/gstreamer/mse/SourceBufferPrivateGStreamer.cpp

  Log Message:
  -----------
  [MSE][GStreamer] Actually do flushes, unify m_hasAllTracks
https://bugs.webkit.org/show_bug.cgi?id=257035

Reviewed by Xabier Rodriguez-Calvar.

Before this patch, there were two classes having a m_hasAllTracks field:
MediaSourcePrivateGStreamer and MediaPlayerPrivateGStreamerMSE.

This redundancy lead to non-synchronization, and in consequence this was
making flushes not occur on MSE, as
SourceBufferPrivateGStreamer::flush() checked for the one in
MediaPlayerPrivateGStreamerMSE which no code ever set to true.

A visible consequence of this was video was being repeated on quality
changes, due to the lack of flush of old frames.

This patch fixes the issue by keeping the `hasAllTracks` state in one
single place, in MediaSourcePrivateGStreamer.

Note:

The triggering of MSE flushes exposed several bugs on the handling of
flushes in other parts of the code. It's important these are addressed
to avoid regressions in behavior when incorporating this patch:

(1) https://github.com/WebKit/WebKit/pull/3802
    [GStreamer] MediaPlayerPrivateGStreamer: Abort stale tasks on flushes

    Without this patch, MSE flushes can deadlock.

(2) https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2413
    appsink: Fix race condition on caps handling

    appsink used to have a race condition on the handling of caps after
    a flush that can cause crashes. A fix is present in GStreamer 1.20.3+.

    A workaround in the WebKit side is possible and desirable to avoid
    headaches in Linux distros, and has been uploaded as:

    https://github.com/WebKit/WebKit/pull/3965
    [GStreamer] Introduce workaround for race condition in appsink

(3) https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3471
    basesink: Support position queries after non-resetting flushes

    basesink doesn't answer position queries between a FLUSH_STOP with
    reset_time=FALSE and a SEGMENT event until GStreamer 1.24.0, which
    incorporates that patch.

    For backwards-compatibility -- and present-compatibility for that matter
    since GStreamer 1.24.0 has not been released yet, a workaround has been
    Proposed for WebKit:

    https://github.com/WebKit/WebKit/pull/14082
    [MSE][GStreamer] Workaround basesink's lack of support for position queries
    between a non-resetting flush and a pre-roll

* Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp:
(WebCore::MediaPlayerPrivateGStreamerMSE::sourceSetup):
* Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h:
(WebCore::MediaPlayerPrivateGStreamerMSE::hasAllTracks const): Deleted.
* Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.cpp:
(WebCore::MediaSourcePrivateGStreamer::addSourceBuffer):
* Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.h:
* Source/WebCore/platform/graphics/gstreamer/mse/SourceBufferPrivateGStreamer.cpp:
(WebCore::SourceBufferPrivateGStreamer::flush):

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




More information about the webkit-changes mailing list