summaryrefslogtreecommitdiff
path: root/ext/wpe/WPEThreadedView.cpp
diff options
context:
space:
mode:
authorPhilippe Normand <philn@igalia.com>2020-09-10 14:39:58 +0100
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>2020-09-21 16:39:57 +0000
commit8ef30a9ce59500cb1b1c644905fab05da01c221a (patch)
tree7960d773a1cadc3501a5f0bdf2dcea5c8ac774a3 /ext/wpe/WPEThreadedView.cpp
parent248d2bb79585c87cc00c598b5ece9ba4c297d57d (diff)
downloadgstreamer-plugins-bad-8ef30a9ce59500cb1b1c644905fab05da01c221a.tar.gz
wpe: Move webview load waiting to WPEView
As waiting for the load to be finished is specific to the WebView, it should be done from our WPEView, not from the WPEContextThread. This fixes issues where multiple wpesrc elements are created in sequence. Without this patch the first view might receive erroneous buffer notifications. Fixes #1386 Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1568>
Diffstat (limited to 'ext/wpe/WPEThreadedView.cpp')
-rw-r--r--ext/wpe/WPEThreadedView.cpp45
1 files changed, 26 insertions, 19 deletions
diff --git a/ext/wpe/WPEThreadedView.cpp b/ext/wpe/WPEThreadedView.cpp
index bf888350f..797751738 100644
--- a/ext/wpe/WPEThreadedView.cpp
+++ b/ext/wpe/WPEThreadedView.cpp
@@ -76,8 +76,6 @@ WPEContextThread::WPEContextThread()
{
g_mutex_init(&threading.mutex);
g_cond_init(&threading.cond);
- g_mutex_init(&threading.ready_mutex);
- g_cond_init(&threading.ready_cond);
{
GMutexHolder lock(threading.mutex);
@@ -96,8 +94,6 @@ WPEContextThread::~WPEContextThread()
g_mutex_clear(&threading.mutex);
g_cond_clear(&threading.cond);
- g_mutex_clear(&threading.ready_mutex);
- g_cond_clear(&threading.ready_cond);
}
template<typename Function>
@@ -167,7 +163,6 @@ gpointer WPEContextThread::s_viewThread(gpointer data)
WPEView* WPEContextThread::createWPEView(GstWpeSrc* src, GstGLContext* context, GstGLDisplay* display, int width, int height)
{
GST_DEBUG("context %p display %p, size (%d,%d)", context, display, width, height);
- threading.ready = FALSE;
static std::once_flag s_loaderFlag;
std::call_once(s_loaderFlag,
@@ -190,24 +185,13 @@ WPEView* WPEContextThread::createWPEView(GstWpeSrc* src, GstGLContext* context,
if (view && view->hasUri()) {
GST_DEBUG("waiting load to finish");
- GMutexHolder lock(threading.ready_mutex);
- while (!threading.ready)
- g_cond_wait(&threading.ready_cond, &threading.ready_mutex);
+ view->waitLoadCompletion();
GST_DEBUG("done");
}
return view;
}
-void WPEContextThread::notifyLoadFinished()
-{
- GMutexHolder lock(threading.ready_mutex);
- if (!threading.ready) {
- threading.ready = TRUE;
- g_cond_signal(&threading.ready_cond);
- }
-}
-
static gboolean s_loadFailed(WebKitWebView*, WebKitLoadEvent, gchar* failing_uri, GError* error, gpointer data)
{
GstWpeSrc* src = GST_WPE_SRC(data);
@@ -223,6 +207,10 @@ static gboolean s_loadFailedWithTLSErrors(WebKitWebView*, gchar* failing_uri, G
WPEView::WPEView(WebKitWebContext* web_context, GstWpeSrc* src, GstGLContext* context, GstGLDisplay* display, int width, int height)
{
+ g_mutex_init(&threading.ready_mutex);
+ g_cond_init(&threading.ready_cond);
+ threading.ready = FALSE;
+
g_mutex_init(&images_mutex);
if (context)
gst.context = GST_GL_CONTEXT(gst_object_ref(context));
@@ -282,6 +270,9 @@ WPEView::WPEView(WebKitWebContext* web_context, GstWpeSrc* src, GstGLContext* co
WPEView::~WPEView()
{
+ g_mutex_clear(&threading.ready_mutex);
+ g_cond_clear(&threading.ready_cond);
+
{
GMutexHolder lock(images_mutex);
@@ -319,6 +310,22 @@ WPEView::~WPEView()
g_mutex_clear(&images_mutex);
}
+void WPEView::notifyLoadFinished()
+{
+ GMutexHolder lock(threading.ready_mutex);
+ if (!threading.ready) {
+ threading.ready = TRUE;
+ g_cond_signal(&threading.ready_cond);
+ }
+}
+
+void WPEView::waitLoadCompletion()
+{
+ GMutexHolder lock(threading.ready_mutex);
+ while (!threading.ready)
+ g_cond_wait(&threading.ready_cond, &threading.ready_mutex);
+}
+
GstEGLImage* WPEView::image()
{
GstEGLImage* ret = nullptr;
@@ -481,7 +488,7 @@ void WPEView::handleExportedImage(gpointer image)
GST_TRACE("EGLImage %p wrapped in GstEGLImage %" GST_PTR_FORMAT, eglImage, gstImage);
egl.pending = gstImage;
- s_view->notifyLoadFinished();
+ notifyLoadFinished();
}
}
@@ -538,7 +545,7 @@ void WPEView::handleExportedBuffer(struct wpe_fdo_shm_exported_buffer* buffer)
GMutexHolder lock(images_mutex);
GST_TRACE("SHM buffer %p wrapped in buffer %" GST_PTR_FORMAT, buffer, gstBuffer);
shm.pending = gstBuffer;
- s_view->notifyLoadFinished();
+ notifyLoadFinished();
}
}
#endif