New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[GStreamer] Introduce workaround for race condition in appsink #3965
[GStreamer] Introduce workaround for race condition in appsink #3965
Conversation
EWS run on previous version of this PR (hash 3877f3f) |
The style failure is intentional, as it's a consequence of GObject class definition.
|
Usually every new GObject sub-class we add in WebCore needs to be allow-listed in the style-checker... |
I can do this. My concern with adding too many .cpp files is build times. Currently Source/platform/graphics/gstreamer is not using unified builds for some reason... which is a separate issue I think should be solved. |
3877f3f
to
b7ca045
Compare
EWS run on previous version of this PR (hash b7ca045) |
No reviewer information in commit message, blocking PR #3965 |
b7ca045
to
9e01e06
Compare
EWS run on current version of this PR (hash 9e01e06) |
Reviewed by Philippe Normand. This patch introduces a WebKit-side workaround for this GStreamer bug: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2413 appsink: Fix race condition on caps handling That race condition causes occasional crashes on MSE flushes following quality changes. The workaround consists in registering an element that is a subclass of appsink with a probe that pushes a redundant caps event if a buffer is received after a flush. This ensures appsink processes the caps so that the GstSample later pulled from appsink contains the right caps. The workaround is only installed if the version of gst-plugins-base is known to have this bug. Canonical link: https://commits.webkit.org/255431@main
9e01e06
to
8404805
Compare
Committed 255431@main (8404805): https://commits.webkit.org/255431@main Reviewed commits have been landed. Closing PR #3965 and removing active labels. |
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) WebKit#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: WebKit#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: WebKit#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
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) WebKit#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: WebKit#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: WebKit#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
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) WebKit/WebKit#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: WebKit/WebKit#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: WebKit/WebKit#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
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) WebKit/WebKit#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: WebKit/WebKit#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: WebKit/WebKit#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
8404805
9e01e06