Bug 241549 - [GStreamer][MediaStream] Capture pipeline remains active after track was stopped
Summary: [GStreamer][MediaStream] Capture pipeline remains active after track was stopped
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: WPE WebKit (show other bugs)
Version: WebKit Nightly Build
Hardware: Other Linux
: P2 Normal
Assignee: Nobody
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2022-06-13 06:41 PDT by James Hilliard
Modified: 2022-08-07 09:27 PDT (History)
4 users (show)

See Also:


Attachments
WPEWebkit debug logs. (2.30 MB, text/plain)
2022-06-13 06:41 PDT, James Hilliard
no flags Details
reproducer(react.js based component) (3.94 KB, application/x-javascript)
2022-06-13 14:37 PDT, James Hilliard
no flags Details
with null pipeline patch (2.09 MB, text/plain)
2022-06-14 02:23 PDT, James Hilliard
no flags Details
full debug enabled logs (99.32 MB, text/plain)
2022-06-14 03:27 PDT, James Hilliard
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description James Hilliard 2022-06-13 06:41:40 PDT
Created attachment 460198 [details]
WPEWebkit debug logs.

On an updated latest WPE WebKit with pipewire I'm seeing that MediaStream close() fails to properly stop a camera stream, the pipeline appears to pause and then restart in the background eating up resources. Logs attached.

Some potentially relevant FIXME's I'm seeing:
0:00:00.584451289  5339 0x55eb0d384580 FIXME                default gstutils.c:4025:gst_pad_create_stream_id_internal:<Video_0x7f765925ae00:src> Creating random stream-id, consider implementing a deterministic way of creating a stream-id
0:00:00.703271418  5339 0x55eb0d384580 FIXME             decodebin3 gstdecodebin3.c:1226:update_requested_selection:<decodebin3-0> Implement EXPOSE_ALL_MODE
0:00:00.896543034  5339 0x55eb0d75ac00 FIXME                default gstutils.c:4025:gst_pad_create_stream_id_internal:<videosrc:src> Creating random stream-id, consider implementing a deterministic way of creating a stream-id
0:00:01.044883717  5339 0x55eb0d384580 FIXME             decodebin3 gstdecodebin3-parse.c:436:unblock_pending_input:<decodebin3-0> Re-use existing input streams if/when possible
0:00:01.077272968  5339 0x7f763c016c00 FIXME             decodebin3 gstdecodebin3.c:1753:get_output_for_slot:<decodebin3-0> emit autoplug-continue
0:00:01.077492259  5339 0x7f763c016c00 FIXME             decodebin3 gstdecodebin3.c:1756:get_output_for_slot:<decodebin3-0> Handle EXPOSE_ALL_MODE
0:00:01.270496174  5339 0x7f763c016c00 FIXME           videodecoder gstvideodecoder.c:1193:gst_video_decoder_drain_out:<jpegdec0> Sub-class should implement drain()
0:00:01.315239328  5339 0x55eb0d75ac00 FIXME             decodebin3 gstdecodebin3.c:1226:update_requested_selection:<decodebin3-1> Implement EXPOSE_ALL_MODE
0:00:01.321216104  5339 0x55eb0d75ac00 FIXME             decodebin3 gstdecodebin3-parse.c:436:unblock_pending_input:<decodebin3-1> Re-use existing input streams if/when possible
0:00:01.356439505  5339 0x7f764c01cd80 FIXME             decodebin3 gstdecodebin3.c:1753:get_output_for_slot:<decodebin3-1> emit autoplug-continue
0:00:01.356643290  5339 0x7f764c01cd80 FIXME             decodebin3 gstdecodebin3.c:1756:get_output_for_slot:<decodebin3-1> Handle EXPOSE_ALL_MODE
0:00:06.362283274  5339 0x55eb0d211810 FIXME               playbin3 gstplaybin3.c:3227:reconfigure_output:<mediastream-media-player-0> Release combiner
0:00:06.405355883  5339 0x7f764c01cd80 FIXME             decodebin3 gstdecodebin3.c:2064:multiqueue_src_probe:<multiqueue1:src_0> EOS on multiqueue source pad. input:0x7f7648012fd0
0:00:06.410205056  5339 0x55eb0d211810 FIXME             decodebin3 gstdecodebin3-parse.c:151:check_all_streams_for_eos:<multiqueue1:sink_0> Remove input stream
Comment 1 Philippe Normand 2022-06-13 10:44:11 PDT
I can't find a `close()` method in MediaStream.idl. Can you share the test-case you're using?

In case the stream is rendered to a <video>, are you pausing it and clearing its src?
Comment 2 James Hilliard 2022-06-13 14:37:28 PDT
Created attachment 460216 [details]
reproducer(react.js based component)
Comment 3 James Hilliard 2022-06-13 14:38:19 PDT
Oh, wasn't close(), I'm calling stop() on the tracks like this when closing the component:
if (stream) {
    stream.getTracks().forEach((track) => {
        track.stop();
    });
}
Comment 4 James Hilliard 2022-06-13 15:38:55 PDT
Probably easiest way to reproduce is just by toggling the opening and stopping the camera in:
https://mozilla.github.io/webrtc-landing/gum_test.html
Comment 5 Philippe Normand 2022-06-14 00:18:12 PDT
Checking the log, I suspect the capturer pipeline is not stopped indeed. In GStreamerCapturer::~GStreamerCapturer() I think we should set the pipeline to null state. Can you try this?

diff --git a/Source/WebCore/platform/mediastream/gstreamer/GStreamerCapturer.cpp b/Source/WebCore/platform/mediastream/gstreamer/GStreamerCapturer.cpp
index 9e008d8f46a6..fe30d7f06ce9 100644
--- a/Source/WebCore/platform/mediastream/gstreamer/GStreamerCapturer.cpp
+++ b/Source/WebCore/platform/mediastream/gstreamer/GStreamerCapturer.cpp
@@ -67,8 +67,11 @@ GStreamerCapturer::GStreamerCapturer(const char* sourceFactory, GRefPtr<GstCaps>
 
 GStreamerCapturer::~GStreamerCapturer()
 {
-    if (m_pipeline)
-        disconnectSimpleBusMessageCallback(pipeline());
+    if (!m_pipeline)
+        return;
+
+    gst_element_set_state(m_pipeline.get(), GST_STATE_NULL);
+    disconnectSimpleBusMessageCallback(m_pipeline.get());
 }
 
 GStreamerCapturer::Observer::~Observer()
Comment 6 James Hilliard 2022-06-14 02:23:57 PDT
Created attachment 460227 [details]
with null pipeline patch

Doesn't seem to have fixed it, added new log with patch applied.
Comment 7 Philippe Normand 2022-06-14 02:34:35 PDT
OK then this will need further investigation.
Comment 8 James Hilliard 2022-06-14 03:06:20 PDT
I wonder if the gst_element_set_state call isn't propagating properly due to the gst_bin_remove call:
https://github.com/WebKit/WebKit/blob/dd956d5e74249681ddf904e0bbe401f308b65e0f/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp#L796-L797
Comment 9 James Hilliard 2022-06-14 03:27:52 PDT
Created attachment 460229 [details]
full debug enabled logs
Comment 10 Philippe Normand 2022-06-14 03:48:35 PDT
(In reply to James Hilliard from comment #8)
> I wonder if the gst_element_set_state call isn't propagating properly due to
> the gst_bin_remove call:
> https://github.com/WebKit/WebKit/blob/
> dd956d5e74249681ddf904e0bbe401f308b65e0f/Source/WebCore/platform/mediastream/
> gstreamer/GStreamerMediaStreamSource.cpp#L796-L797

I don't think so. There are 2 pipelines basically, the first feeds the second.

first is capturer, ending in an appsink. Then when a frame reaches that sink, it is dispatched to clients observing the capturer.

second is for the <video> playback, where the source is a mediastreamsrc, that is observing the capturer and getting its frames from it.
Comment 11 James Hilliard 2022-06-15 05:18:51 PDT
Thinking this might be at least partially a gstreamer issue with decodebin3/multiqueue as some of the errors I'm seeing appear to reproduce outside of webkit:
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1283
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1281
Comment 12 James Hilliard 2022-06-17 02:07:55 PDT
So I noticed that this never appears in the logs which I assume means the MediaPlayerPrivateGStreamer destructor never gets called at all:
https://github.com/WebKit/WebKit/blob/a01fcdab792edb2611f5122ba599c3648fc158ec/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp#L211

What should normally be triggering that destructor here?
Comment 13 James Hilliard 2022-06-21 03:16:00 PDT
Maybe the state isn't getting synced for the pad-added callback?

https://gstreamer.freedesktop.org/documentation/application-development/basics/elements.html?gi-language=c#element-states

> However, when adding elements dynamically to an already-running pipeline, e.g. from within a "pad-added" signal callback, you need to set it to the desired target state yourself using gst_element_set_state () or gst_element_sync_state_with_parent ().

https://github.com/WebKit/WebKit/blob/11f2fe2dbfa3c3891870bbdddb225318d3ab3b28/Source/WebCore/platform/mediastream/gstreamer/GStreamerVideoCapturer.cpp#L95
Comment 14 James Hilliard 2022-06-22 03:15:50 PDT
This playbin3 issue looks like it might be related:
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/915

One of the threads seems to be stuck in a similar place:
Thread 24 (Thread 0x7ff0b6ffd640 (LWP 904) "Video_0x7ff0c5a"):
#0  syscall () at ../sysdeps/unix/sysv/linux/x86_64/syscall.S:38
#1  0x00007ff13d8c3ec0 in g_cond_wait (cond=cond@entry=0x56278a240aa0, mutex=mutex@entry=0x56278a240a78) at ../glib/gthread-posix.c:1574
#2  0x00007ff13a8dbaf3 in gst_data_queue_push (queue=0x56278a240ad0 [GstDataQueue], item=item@entry=0x7ff0a800c240) at ../libs/gst/base/gstdataqueue.c:521
#3  0x00007ff0f0cbf4eb in gst_multi_queue_chain (pad=<optimized out>, parent=<optimized out>, buffer=<optimized out>) at ../plugins/elements/gstmultiqueue.c:2494
#4  0x00007ff13d6a63cd in gst_pad_chain_data_unchecked (pad=pad@entry=0x56278a237110 [GstMultiQueuePad|sink_0], type=type@entry=4112, data=data@entry=0x7ff0b000b7e0) at ../gst/gstpad.c:4444
#5  0x00007ff13d6a8c05 in gst_pad_push_data (pad=pad@entry=0x7ff0ac0121e0 [GstParsePad|src_0], type=type@entry=4112, data=data@entry=0x7ff0b000b7e0) at ../gst/gstpad.c:4708
#6  0x00007ff13d6b1759 in gst_pad_push (pad=pad@entry=0x7ff0ac0121e0 [GstParsePad|src_0], buffer=buffer@entry=0x7ff0b000b7e0 [GstBuffer]) at ../gst/gstpad.c:4827
#7  0x00007ff13d690698 in gst_proxy_pad_chain_default (pad=<optimized out>, parent=<optimized out>, buffer=0x7ff0b000b7e0 [GstBuffer]) at ../gst/gstghostpad.c:127
#8  0x00007ff13d6a63cd in gst_pad_chain_data_unchecked (pad=pad@entry=0x56278a22b3b0 [GstProxyPad|proxypad4], type=type@entry=4112, data=data@entry=0x7ff0b000b7e0) at ../gst/gstpad.c:4444
#9  0x00007ff13d6a8c05 in gst_pad_push_data (pad=pad@entry=0x56278a21b7e0 [GstPad|src], type=type@entry=4112, data=data@entry=0x7ff0b000b7e0) at ../gst/gstpad.c:4708
#10 0x00007ff13d6b1759 in gst_pad_push (pad=0x56278a21b7e0 [GstPad|src], buffer=buffer@entry=0x7ff0b000b7e0 [GstBuffer]) at ../gst/gstpad.c:4827
#11 0x00007ff0f0cdf746 in gst_type_find_element_chain (pad=<optimized out>, parent=<optimized out>, buffer=0x7ff0b000b7e0 [GstBuffer]) at ../plugins/elements/gsttypefindelement.c:920
#12 0x00007ff13d6a63cd in gst_pad_chain_data_unchecked (pad=pad@entry=0x56278a21b590 [GstPad|sink], type=type@entry=4112, data=data@entry=0x7ff0b000b7e0) at ../gst/gstpad.c:4444
#13 0x00007ff13d6a8c05 in gst_pad_push_data (pad=pad@entry=0x56278a22a310 [GstProxyPad|proxypad1], type=type@entry=4112, data=data@entry=0x7ff0b000b7e0) at ../gst/gstpad.c:4708
#14 0x00007ff13d6b1759 in gst_pad_push (pad=pad@entry=0x56278a22a310 [GstProxyPad|proxypad1], buffer=buffer@entry=0x7ff0b000b7e0 [GstBuffer]) at ../gst/gstpad.c:4827
#15 0x00007ff13d690698 in gst_proxy_pad_chain_default (pad=<optimized out>, parent=<optimized out>, buffer=0x7ff0b000b7e0 [GstBuffer]) at ../gst/gstghostpad.c:127
#16 0x00007ff13d6a63cd in gst_pad_chain_data_unchecked (pad=pad@entry=0x56278a2282c0 [GstGhostPad|sink], type=type@entry=4112, data=data@entry=0x7ff0b000b7e0) at ../gst/gstpad.c:4444
#17 0x00007ff13d6a8c05 in gst_pad_push_data (pad=pad@entry=0x56278a22a0b0 [GstProxyPad|proxypad0], type=type@entry=4112, data=data@entry=0x7ff0b000b7e0) at ../gst/gstpad.c:4708
#18 0x00007ff13d6b1759 in gst_pad_push (pad=pad@entry=0x56278a22a0b0 [GstProxyPad|proxypad0], buffer=buffer@entry=0x7ff0b000b7e0 [GstBuffer]) at ../gst/gstpad.c:4827
#19 0x00007ff13d690698 in gst_proxy_pad_chain_default (pad=<optimized out>, parent=<optimized out>, buffer=0x7ff0b000b7e0 [GstBuffer]) at ../gst/gstghostpad.c:127
#20 0x00007ff13d6a63cd in gst_pad_chain_data_unchecked (pad=pad@entry=0x56278a228050 [GstGhostPad|sink], type=type@entry=4112, data=data@entry=0x7ff0b000b7e0) at ../gst/gstpad.c:4444
#21 0x00007ff13d6a8c05 in gst_pad_push_data (pad=pad@entry=0x56278a21b340 [GstPad|src], type=type@entry=4112, data=data@entry=0x7ff0b000b7e0) at ../gst/gstpad.c:4708
#22 0x00007ff13d6b1759 in gst_pad_push (pad=0x56278a21b340 [GstPad|src], buffer=0x7ff0b000b7e0 [GstBuffer]) at ../gst/gstpad.c:4827
#23 0x00007ff13a8c648c in gst_base_transform_chain (pad=<optimized out>, parent=0x56278a2241b0 [GstCapsFilter|mimetype-filter], buffer=<optimized out>) at ../libs/gst/base/gstbasetransform.c:2381
#24 0x00007ff13d6a63cd in gst_pad_chain_data_unchecked (pad=pad@entry=0x56278a21b0f0 [GstPad|sink], type=type@entry=4112, data=data@entry=0x7ff0b000b7e0) at ../gst/gstpad.c:4444
#25 0x00007ff13d6a8c05 in gst_pad_push_data (pad=pad@entry=0x56278a22a570 [GstProxyPad|proxypad2], type=type@entry=4112, data=data@entry=0x7ff0b000b7e0) at ../gst/gstpad.c:4708
#26 0x00007ff13d6b1759 in gst_pad_push (pad=pad@entry=0x56278a22a570 [GstProxyPad|proxypad2], buffer=buffer@entry=0x7ff0b000b7e0 [GstBuffer]) at ../gst/gstpad.c:4827
#27 0x00007ff13d690698 in gst_proxy_pad_chain_default (pad=<optimized out>, parent=<optimized out>, buffer=0x7ff0b000b7e0 [GstBuffer]) at ../gst/gstghostpad.c:127
#28 0x00007ff13d6a63cd in gst_pad_chain_data_unchecked (pad=pad@entry=0x56278a228530 [GstGhostPad|sink], type=type@entry=4112, data=data@entry=0x7ff0b000b7e0) at ../gst/gstpad.c:4444
#29 0x00007ff13d6a8c05 in gst_pad_push_data (pad=pad@entry=0x56278a21a0c0 [GstPad|src], type=type@entry=4112, data=data@entry=0x7ff0b000b7e0) at ../gst/gstpad.c:4708
#30 0x00007ff13d6b1759 in gst_pad_push (pad=pad@entry=0x56278a21a0c0 [GstPad|src], buffer=0x7ff0b000b7e0 [GstBuffer]) at ../gst/gstpad.c:4827
#31 0x00007ff13a8c08d0 in gst_base_src_loop (pad=0x56278a21a0c0 [GstPad|src]) at ../libs/gst/base/gstbasesrc.c:3030
#32 0x00007ff13d6e7cac in gst_task_func (task=task@entry=0x56278a233290 [GstTask|Video_0x7ff0c5a0c380:src]) at ../gst/gsttask.c:384
#33 0x00007ff13d6e8e2d in default_func (tdata=<optimized out>, pool=<optimized out>) at ../gst/gsttaskpool.c:70
#34 0x00007ff13d89ac59 in g_thread_pool_thread_proxy (data=<optimized out>) at ../glib/gthreadpool.c:354
#35 0x00007ff13d89a29c in g_thread_proxy (data=0x56278a241180) at ../glib/gthread.c:827
#36 0x00007ff13d8c32d1 in linux_pthread_proxy (data=0x56278a241180) at ../glib/gthread-posix.c:1268
#37 0x00007ff13d1b4dc3 in start_thread (arg=<optimized out>) at pthread_create.c:442
#38 0x00007ff13d22e51c in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81
Comment 15 James Hilliard 2022-06-27 05:48:26 PDT
Oh, pretty sure it's this pipewire renegotiation bug, the problem seems to be that the isCapturingDisplay() doesn't actually catch the usage of pipewiresrc properly so a renegotiation occurs even when pipewiresrc is in use.
https://github.com/WebKit/WebKit/commit/5e80996639ec4af8fe9a0828feda7f2b374f9106#diff-5050ca37bb2b1d47f49b0053a59bb6de270064f69dcd55525b2612f28084b91fR262-R266

The bug in pipewiresrc seems to be that the plugin will call pw_stream_connect(which AFAIU is only designed to be called once here) for each negotiate call:
https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/0.3.52/src/gst/gstpipewiresrc.c#L810-815
Comment 16 James Hilliard 2022-07-09 16:29:09 PDT
Seeing an Conditional jump or move depends on uninitialised value relating to MediaPlayerPrivateGStreamer that may be related:

https://bugs.webkit.org/show_bug.cgi?id=242561
Comment 17 James Hilliard 2022-07-10 09:00:20 PDT
I'm seeing an assert getting hit in the call stack for webkitMediaStreamSrcTrackEnded.

ASSERTION FAILED: !isMainThread()
/app/webkit/Source/WebCore/platform/AbortableTaskQueue.h(124) : void WebCore::AbortableTaskQueue::enqueueTask(WTF::Function<void()>&&)
1   0x10f16c73 WTFCrash
2   0xd923126 /app/webkit/WebKitBuild/Debug/lib/libWPEWebKit-1.1.so.0(+0x90d0126) [0xd923126]
3   0x1122626e /app/webkit/WebKitBuild/Debug/lib/libWPEWebKit-1.1.so.0(+0xc9d326e) [0x1122626e]
4   0x112a7b79 /app/webkit/WebKitBuild/Debug/lib/libWPEWebKit-1.1.so.0(+0xca54b79) [0x112a7b79]
5   0x112a7bbd /app/webkit/WebKitBuild/Debug/lib/libWPEWebKit-1.1.so.0(+0xca54bbd) [0x112a7bbd]
6   0x19839fef g_closure_invoke
7   0x1984cf16 /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0(+0x28f16) [0x1984cf16]
8   0x19853c0c g_signal_emit_valist
9   0x19853d63 g_signal_emit
10  0x1983ed84 /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0(+0x1ad84) [0x1983ed84]
11  0x16150c08 /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0x44c08) [0x16150c08]
12  0x19840f1a g_object_notify_by_pspec
13  0x4063c688 /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstplayback.so(+0x43688) [0x4063c688]
14  0x1619a126 /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0x8e126) [0x1619a126]
15  0x15f41896 g_hook_list_marshal
16  0x16199895 /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0x8d895) [0x16199895]
17  0x1619c68d /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0x9068d) [0x1619c68d]
18  0x1619d26e /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0x9126e) [0x1619d26e]
19  0x1619d728 /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0x91728) [0x1619d728]
20  0x1619b000 /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0x8f000) [0x1619b000]
21  0x161a6780 gst_pad_push_event
22  0x1619cbec /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0x90bec) [0x1619cbec]
23  0x1619d26e /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0x9126e) [0x1619d26e]
24  0x1619d728 /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0x91728) [0x1619d728]
25  0x1619b000 /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0x8f000) [0x1619b000]
26  0x161a6780 gst_pad_push_event
27  0x161a6d62 /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0x9ad62) [0x161a6d62]
28  0x161a2d6e gst_pad_forward
29  0x161a2eb5 gst_pad_event_default
30  0x1619cbec /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0x90bec) [0x1619cbec]
31  0x1619d26e /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0(+0x9126e) [0x1619d26e]
==74== Invalid write of size 4
==74==    at 0x10F16C78: WTFCrash (Assertions.cpp:328)
==74==    by 0xD923125: WTFCrashWithInfo(int, char const*, char const*, int) (Assertions.h:754)
==74==    by 0x1122626D: WebCore::AbortableTaskQueue::enqueueTask(WTF::Function<void ()>&&) (AbortableTaskQueue.h:124)
==74==    by 0x112A7B78: WebCore::VideoTrackPrivateGStreamer::VideoTrackPrivateGStreamer(WTF::WeakPtr<WebCore::MediaPlayerPrivateGStreamer, WTF::EmptyCounter>, unsigned int, _GstStream*)::{lambda(WebCore::VideoTrackPrivateGStreamer*)#2}::operator()(WebCore::VideoTrackPrivateGStreamer*) const (VideoTrackPrivateGStreamer.cpp:60)
==74==    by 0x112A7BBC: WebCore::VideoTrackPrivateGStreamer::VideoTrackPrivateGStreamer(WTF::WeakPtr<WebCore::MediaPlayerPrivateGStreamer, WTF::EmptyCounter>, unsigned int, _GstStream*)::{lambda(WebCore::VideoTrackPrivateGStreamer*)#2}::_FUN(WebCore::VideoTrackPrivateGStreamer*) (VideoTrackPrivateGStreamer.cpp:60)
==74==    by 0x19839FEE: g_closure_invoke (gclosure.c:830)
==74==    by 0x1984CF15: signal_emit_unlocked_R (gsignal.c:3742)
==74==    by 0x19853C0B: g_signal_emit_valist (gsignal.c:3497)
==74==    by 0x19853D62: g_signal_emit (gsignal.c:3553)
==74==    by 0x1983ED83: g_object_dispatch_properties_changed (gobject.c:1212)
==74==    by 0x16150C07: gst_object_dispatch_properties_changed (gstobject.c:455)
==74==    by 0x19840F19: g_object_notify_by_spec_internal (gobject.c:1305)
==74==    by 0x19840F19: g_object_notify_by_pspec (gobject.c:1415)
==74==    by 0x4063C687: gst_parse_pad_update_tags (gstparsebin.c:3961)
==74==    by 0x4063C687: gst_parse_pad_event (gstparsebin.c:4060)
==74==    by 0x1619A125: probe_hook_marshal (gstpad.c:3664)
==74==    by 0x15F41895: g_hook_list_marshal (ghook.c:672)
==74==    by 0x16199894: do_probe_callbacks (gstpad.c:3848)
==74==    by 0x1619C68C: gst_pad_send_event_unchecked (gstpad.c:5872)
==74==    by 0x1619D26D: gst_pad_push_event_unchecked (gstpad.c:5544)
==74==    by 0x1619D727: push_sticky (gstpad.c:4047)
==74==    by 0x1619AFFF: events_foreach (gstpad.c:608)
==74==    by 0x161A677F: check_sticky (gstpad.c:4106)
==74==    by 0x161A677F: gst_pad_push_event (gstpad.c:5675)
==74==    by 0x1619CBEB: gst_pad_send_event_unchecked (gstpad.c:5900)
==74==    by 0x1619D26D: gst_pad_push_event_unchecked (gstpad.c:5544)
==74==    by 0x1619D727: push_sticky (gstpad.c:4047)
==74==    by 0x1619AFFF: events_foreach (gstpad.c:608)
==74==    by 0x161A677F: check_sticky (gstpad.c:4106)
==74==    by 0x161A677F: gst_pad_push_event (gstpad.c:5675)
==74==    by 0x161A6D61: event_forward_func (gstpad.c:3125)
==74==    by 0x161A2D6D: gst_pad_forward (gstpad.c:3079)
==74==    by 0x161A2EB4: gst_pad_event_default (gstpad.c:3176)
==74==    by 0x1619CBEB: gst_pad_send_event_unchecked (gstpad.c:5900)
==74==    by 0x1619D26D: gst_pad_push_event_unchecked (gstpad.c:5544)
==74==    by 0x1619D727: push_sticky (gstpad.c:4047)
==74==    by 0x1619AFFF: events_foreach (gstpad.c:608)
==74==    by 0x161A677F: check_sticky (gstpad.c:4106)
==74==    by 0x161A677F: gst_pad_push_event (gstpad.c:5675)
==74==    by 0x161A6D61: event_forward_func (gstpad.c:3125)
==74==    by 0x161A2D6D: gst_pad_forward (gstpad.c:3079)
==74==    by 0x161A2EB4: gst_pad_event_default (gstpad.c:3176)
==74==    by 0x1619CBEB: gst_pad_send_event_unchecked (gstpad.c:5900)
==74==    by 0x1619D26D: gst_pad_push_event_unchecked (gstpad.c:5544)
==74==    by 0x1619D727: push_sticky (gstpad.c:4047)
==74==    by 0x1619AFFF: events_foreach (gstpad.c:608)
==74==    by 0x161A677F: check_sticky (gstpad.c:4106)
==74==    by 0x161A677F: gst_pad_push_event (gstpad.c:5675)
==74==    by 0x161A6D61: event_forward_func (gstpad.c:3125)
==74==    by 0x161A2D6D: gst_pad_forward (gstpad.c:3079)
==74==    by 0x161A2EB4: gst_pad_event_default (gstpad.c:3176)
==74==    by 0x1619CBEB: gst_pad_send_event_unchecked (gstpad.c:5900)
==74==    by 0x1619D26D: gst_pad_push_event_unchecked (gstpad.c:5544)
==74==    by 0x1619D727: push_sticky (gstpad.c:4047)
==74==    by 0x1619AFFF: events_foreach (gstpad.c:608)
==74==    by 0x161A677F: check_sticky (gstpad.c:4106)
==74==    by 0x161A677F: gst_pad_push_event (gstpad.c:5675)
==74==    by 0x1619CBEB: gst_pad_send_event_unchecked (gstpad.c:5900)
==74==    by 0x1619D26D: gst_pad_push_event_unchecked (gstpad.c:5544)
==74==    by 0x1619D727: push_sticky (gstpad.c:4047)
==74==    by 0x1619AFFF: events_foreach (gstpad.c:608)
==74==    by 0x161A677F: check_sticky (gstpad.c:4106)
==74==    by 0x161A677F: gst_pad_push_event (gstpad.c:5675)
==74==    by 0x11310D74: webkitMediaStreamSrcTrackEnded(_WebKitMediaStreamSrc*, InternalSource&) (GStreamerMediaStreamSource.cpp:791)
==74==    by 0x11310F79: InternalSource::trackEnded(WebCore::MediaStreamTrackPrivate&) (GStreamerMediaStreamSource.cpp:812)
==74==    by 0x14A385B6: auto WebCore::MediaStreamTrackPrivate::endTrack()::{lambda(auto:1&)#1}::operator()<WebCore::MediaStreamTrackPrivate::Observer>(WebCore::MediaStreamTrackPrivate::Observer&) const (MediaStreamTrackPrivate.cpp:155)
==74==    by 0x14A385E9: WTF::Detail::CallableWrapper<WebCore::MediaStreamTrackPrivate::endTrack()::{lambda(auto:1&)#1}, void, WebCore::MediaStreamTrackPrivate::Observer&>::call(WebCore::MediaStreamTrackPrivate::Observer&) (Function.h:53)
==74==    by 0x14A3EFE4: WTF::Function<void (WebCore::MediaStreamTrackPrivate::Observer&)>::operator()(WebCore::MediaStreamTrackPrivate::Observer&) const (Function.h:82)
==74==    by 0x14A3C417: WTF::WeakHashSet<WebCore::MediaStreamTrackPrivate::Observer, WTF::EmptyCounter, (WTF::EnableWeakPtrThreadingAssertions)1>::forEach(WTF::Function<void (WebCore::MediaStreamTrackPrivate::Observer&)> const&) (WeakHashSet.h:147)
==74==    by 0x14A2E45A: WebCore::MediaStreamTrackPrivate::forEachObserver(WTF::Function<void (WebCore::MediaStreamTrackPrivate::Observer&)> const&) (MediaStreamTrackPrivate.cpp:89)
==74==    by 0x14A2E898: WebCore::MediaStreamTrackPrivate::endTrack() (MediaStreamTrackPrivate.cpp:154)
==74==    by 0x12D950F7: WebCore::MediaStreamTrack::stopTrack(WebCore::MediaStreamTrack::StopMode) (MediaStreamTrack.cpp:244)
==74==    by 0x12D97482: WebCore::MediaStreamTrack::suspend(WebCore::ReasonForSuspension) (MediaStreamTrack.cpp:653)
==74==    by 0x13A576A8: auto WebCore::ScriptExecutionContext::suspendActiveDOMObjects(WebCore::ReasonForSuspension)::{lambda(auto:1&)#1}::operator()<WebCore::ActiveDOMObject>(WebCore::ActiveDOMObject&) const (ScriptExecutionContext.cpp:302)
==74==    by 0x13A576DF: WTF::Detail::CallableWrapper<WebCore::ScriptExecutionContext::suspendActiveDOMObjects(WebCore::ReasonForSuspension)::{lambda(auto:1&)#1}, WebCore::ScriptExecutionContext::ShouldContinue, WebCore::ActiveDOMObject&>::call(WebCore::ActiveDOMObject&) (Function.h:53)
==74==    by 0x13A5AA4E: WTF::Function<WebCore::ScriptExecutionContext::ShouldContinue (WebCore::ActiveDOMObject&)>::operator()(WebCore::ActiveDOMObject&) const (Function.h:82)
==74==    by 0x13A4EFE5: WebCore::ScriptExecutionContext::forEachActiveDOMObject(WTF::Function<WebCore::ScriptExecutionContext::ShouldContinue (WebCore::ActiveDOMObject&)> const&) const (ScriptExecutionContext.cpp:273)
==74==    by 0x13A4F157: WebCore::ScriptExecutionContext::suspendActiveDOMObjects(WebCore::ReasonForSuspension) (ScriptExecutionContext.cpp:301)
==74==    by 0x1388F5B8: WebCore::Document::suspendActiveDOMObjects(WebCore::ReasonForSuspension) (Document.cpp:2824)
==74==    by 0x138A3FEB: WebCore::Document::suspendScheduledTasks(WebCore::ReasonForSuspension) (Document.cpp:6788)
==74==    by 0x1389EDEB: WebCore::Document::suspend(WebCore::ReasonForSuspension) (Document.cpp:5774)
==74==    by 0x13C36554: WebCore::CachedFrame::CachedFrame(WebCore::Frame&) (CachedFrame.cpp:169)
==74==    by 0x13C3CC95: std::_MakeUniq<WebCore::CachedFrame>::__single_object std::make_unique<WebCore::CachedFrame, WebCore::Frame&>(WebCore::Frame&) (unique_ptr.h:962)
==74==    by 0x13C3B58B: decltype(auto) WTF::makeUnique<WebCore::CachedFrame, WebCore::Frame&>(WebCore::Frame&) (StdLibExtras.h:540)
==74==    by 0x13C37214: WebCore::CachedPage::CachedPage(WebCore::Page&) (CachedPage.cpp:61)
==74==    by 0x13C3BF15: std::_MakeUniq<WebCore::CachedPage>::__single_object std::make_unique<WebCore::CachedPage, WebCore::Page&>(WebCore::Page&) (unique_ptr.h:962)
==74==    by 0x13C3B305: decltype(auto) WTF::makeUnique<WebCore::CachedPage, WebCore::Page&>(WebCore::Page&) (StdLibExtras.h:540)
==74==    by 0x13C34450: WebCore::BackForwardCache::trySuspendPage(WebCore::Page&, WebCore::BackForwardCache::ForceSuspension) (BackForwardCache.cpp:460)
==74==    by 0x13C344EE: WebCore::BackForwardCache::addIfCacheable(WebCore::HistoryItem&, WebCore::Page*) (BackForwardCache.cpp:471)
==74==    by 0x142BFF6C: WebCore::FrameLoader::commitProvisionalLoad() (FrameLoader.cpp:2040)
==74==    by 0x142665F2: WebCore::DocumentLoader::commitIfReady() (DocumentLoader.cpp:412)
==74==    by 0x1426C200: WebCore::DocumentLoader::commitLoad(WebCore::SharedBuffer const&) (DocumentLoader.cpp:1178)
==74==    by 0x1426D388: WebCore::DocumentLoader::dataReceived(WebCore::SharedBuffer const&) (DocumentLoader.cpp:1373)
==74==    by 0x1426D0E7: WebCore::DocumentLoader::dataReceived(WebCore::CachedResource&, WebCore::SharedBuffer const&) (DocumentLoader.cpp:1347)
==74==    by 0x143A2A52: WebCore::CachedRawResource::notifyClientsDataWasReceived(WebCore::SharedBuffer const&) (CachedRawResource.cpp:145)
==74==    by 0x143A252A: WebCore::CachedRawResource::updateBuffer(WebCore::FragmentedSharedBuffer const&) (CachedRawResource.cpp:81)
==74==    by 0x1433945C: WebCore::SubresourceLoader::didReceiveBuffer(WebCore::FragmentedSharedBuffer const&, long long, WebCore::DataPayloadType) (SubresourceLoader.cpp:559)
==74==    by 0x14323A3F: WebCore::ResourceLoader::didReceiveData(WebCore::SharedBuffer const&, long long, WebCore::DataPayloadType) (ResourceLoader.cpp:560)
==74==    by 0xED59FD9: WebKit::WebResourceLoader::didReceiveData(IPC::SharedBufferReference&&, long) (WebResourceLoader.cpp:243)
==74==    by 0xDF022C8: void IPC::callMemberFunctionImpl<WebKit::WebResourceLoader, void (WebKit::WebResourceLoader::*)(IPC::SharedBufferReference&&, long), std::tuple<IPC::SharedBufferReference, long>, 0ul, 1ul>(WebKit::WebResourceLoader*, void (WebKit::WebResourceLoader::*)(IPC::SharedBufferReference&&, long), std::tuple<IPC::SharedBufferReference, long>&&, std::integer_sequence<unsigned long, 0ul, 1ul>) (HandleMessage.h:131)
==74==    by 0xDF01053: void IPC::callMemberFunction<WebKit::WebResourceLoader, void (WebKit::WebResourceLoader::*)(IPC::SharedBufferReference&&, long), std::tuple<IPC::SharedBufferReference, long>, std::integer_sequence<unsigned long, 0ul, 1ul> >(std::tuple<IPC::SharedBufferReference, long>&&, WebKit::WebResourceLoader*, void (WebKit::WebResourceLoader::*)(IPC::SharedBufferReference&&, long)) (HandleMessage.h:137)
==74==    by 0xDF00255: void IPC::handleMessage<Messages::WebResourceLoader::DidReceiveData, WebKit::WebResourceLoader, void (WebKit::WebResourceLoader::*)(IPC::SharedBufferReference&&, long)>(IPC::Connection&, IPC::Decoder&, WebKit::WebResourceLoader*, void (WebKit::WebResourceLoader::*)(IPC::SharedBufferReference&&, long)) (HandleMessage.h:259)
==74==    by 0xDEFF838: WebKit::WebResourceLoader::didReceiveWebResourceLoaderMessage(IPC::Connection&, IPC::Decoder&) (WebResourceLoaderMessageReceiver.cpp:76)
==74==    by 0xED50A06: WebKit::NetworkProcessConnection::didReceiveMessage(IPC::Connection&, IPC::Decoder&) (NetworkProcessConnection.cpp:102)
==74==    by 0xE5537A5: IPC::Connection::dispatchMessage(IPC::Decoder&) (Connection.cpp:1108)
==74==    by 0xE553A3C: IPC::Connection::dispatchMessage(std::unique_ptr<IPC::Decoder, std::default_delete<IPC::Decoder> >) (Connection.cpp:1153)
==74==    by 0xE553FE3: IPC::Connection::dispatchOneIncomingMessage() (Connection.cpp:1222)
==74==    by 0xE5534B5: IPC::Connection::enqueueIncomingMessage(std::unique_ptr<IPC::Decoder, std::default_delete<IPC::Decoder> >)::{lambda()#1}::operator()() (Connection.cpp:1072)
==74==    by 0xE55A599: WTF::Detail::CallableWrapper<IPC::Connection::enqueueIncomingMessage(std::unique_ptr<IPC::Decoder, std::default_delete<IPC::Decoder> >)::{lambda()#1}, void>::call() (Function.h:53)
==74==    by 0xD99E63C: WTF::Function<void ()>::operator()() const (Function.h:82)
==74==    by 0x10F6D6C2: WTF::RunLoop::performWork() (RunLoop.cpp:133)
==74==    by 0x11018C67: WTF::RunLoop::RunLoop()::{lambda(void*)#1}::operator()(void*) const (RunLoopGLib.cpp:80)
==74==    by 0x11018C8B: WTF::RunLoop::RunLoop()::{lambda(void*)#1}::_FUN(void*) (RunLoopGLib.cpp:82)
==74==    by 0x11018BFA: WTF::RunLoop::{lambda(_GSource*, int (*)(void*), void*)#1}::operator()(_GSource*, int (*)(void*), void*) const (RunLoopGLib.cpp:53)
==74==    by 0x11018C48: WTF::RunLoop::{lambda(_GSource*, int (*)(void*), void*)#1}::_FUN(_GSource*, int (*)(void*), void*) (RunLoopGLib.cpp:56)
==74==    by 0x15F52293: g_main_dispatch (gmain.c:3381)
==74==    by 0x15F52293: g_main_context_dispatch (gmain.c:4099)
==74==    by 0x15F52637: g_main_context_iterate.constprop.0 (gmain.c:4175)
==74==    by 0x15F52942: g_main_loop_run (gmain.c:4373)
==74==    by 0x110192B3: WTF::RunLoop::run() (RunLoopGLib.cpp:108)
==74==    by 0xEFB8674: WebKit::AuxiliaryProcessMainBase<WebKit::WebProcess, true>::run(int, char**) (AuxiliaryProcessMain.h:70)
==74==    by 0xEFB5D26: int WebKit::AuxiliaryProcessMain<WebKit::WebProcessMainWPE>(int, char**) (AuxiliaryProcessMain.h:96)
==74==    by 0xEFB227E: WebKit::WebProcessMain(int, char**) (WebProcessMainWPE.cpp:75)
==74==    by 0x109908: main (WebProcessMain.cpp:31)
==74==  Address 0xbbadbeef is not stack'd, malloc'd or (recently) free'd
==74==
Comment 18 James Hilliard 2022-07-20 19:13:54 PDT
Pull request: https://github.com/WebKit/WebKit/pull/2605
Comment 19 EWS 2022-08-07 09:27:10 PDT
Committed 253192@main (a4d18a005735): <https://commits.webkit.org/253192@main>

Reviewed commits have been landed. Closing PR #2605 and removing active labels.