diff options
author | Thibault Saunier <tsaunier@igalia.com> | 2021-04-19 20:46:46 -0400 |
---|---|---|
committer | GStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2021-05-19 13:41:15 +0000 |
commit | a92d4373ad7efa4dd65feb755ecacdb52e5fbdfc (patch) | |
tree | 7c4d58e69347b2deb9871b6f20dc9f9b4c183132 /ext/wpe/WPEThreadedView.cpp | |
parent | 81ced7932f7e98e1dda50b1959cda17991bc676c (diff) | |
download | gstreamer-plugins-bad-a92d4373ad7efa4dd65feb755ecacdb52e5fbdfc.tar.gz |
wpe: Base wpe audio implementation on a web extension
This makes the implementation simpler and enable us to map
webviews and audio stream much more easily
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2252>
Diffstat (limited to 'ext/wpe/WPEThreadedView.cpp')
-rw-r--r-- | ext/wpe/WPEThreadedView.cpp | 96 |
1 files changed, 85 insertions, 11 deletions
diff --git a/ext/wpe/WPEThreadedView.cpp b/ext/wpe/WPEThreadedView.cpp index 93f97e342..5dcb21603 100644 --- a/ext/wpe/WPEThreadedView.cpp +++ b/ext/wpe/WPEThreadedView.cpp @@ -22,6 +22,8 @@ #endif #include "WPEThreadedView.h" +#include "gstwpe.h" +#include "gstwpesrcbin.h" #include <gst/gl/gl.h> #include <gst/gl/egl/gsteglimage.h> @@ -165,6 +167,56 @@ gpointer WPEContextThread::s_viewThread(gpointer data) return nullptr; } +#ifdef G_OS_UNIX +static void +initialize_web_extensions (WebKitWebContext *context) +{ + webkit_web_context_set_web_extensions_directory (context, gst_wpe_get_extension_path ()); +} + +static gboolean +webkit_extension_msg_received (WebKitWebContext *context, + WebKitUserMessage *message, + GstWpeSrc *src) +{ + const gchar *name = webkit_user_message_get_name (message); + GVariant *params = webkit_user_message_get_parameters (message); + gboolean res = TRUE; + + if (!g_strcmp0(name, "gstwpe.new_stream")) { + guint32 id = g_variant_get_uint32 (g_variant_get_child_value (params, 0)); + const gchar *capsstr = g_variant_get_string (g_variant_get_child_value (params, 1), NULL); + GstCaps *caps = gst_caps_from_string (capsstr); + const gchar *stream_id = g_variant_get_string (g_variant_get_child_value (params, 2), NULL); + gst_wpe_src_new_audio_stream(src, id, caps, stream_id); + gst_caps_unref (caps); + } else if (!g_strcmp0(name, "gstwpe.set_shm")) { + auto fdlist = webkit_user_message_get_fd_list (message); + gint id = g_variant_get_uint32 (g_variant_get_child_value (params, 0)); + gst_wpe_src_set_audio_shm (src, fdlist, id); + } else if (!g_strcmp0(name, "gstwpe.new_buffer")) { + guint32 id = g_variant_get_uint32 (g_variant_get_child_value (params, 0)); + guint64 size = g_variant_get_uint64 (g_variant_get_child_value (params, 1)); + gst_wpe_src_push_audio_buffer (src, id, size); + + webkit_user_message_send_reply(message, webkit_user_message_new ("gstwpe.buffer_processed", NULL)); + } else if (!g_strcmp0(name, "gstwpe.pause")) { + guint32 id = g_variant_get_uint32 (params); + + gst_wpe_src_pause_audio_stream (src, id); + } else if (!g_strcmp0(name, "gstwpe.stop")) { + guint32 id = g_variant_get_uint32 (params); + + gst_wpe_src_stop_audio_stream (src, id); + } else { + res = FALSE; + g_error("Unknown event: %s", name); + } + + return res; +} +#endif + WPEView* WPEContextThread::createWPEView(GstWpeVideoSrc* src, GstGLContext* context, GstGLDisplay* display, int width, int height) { GST_DEBUG("context %p display %p, size (%d,%d)", context, display, width, height); @@ -179,13 +231,11 @@ WPEView* WPEContextThread::createWPEView(GstWpeVideoSrc* src, GstGLContext* cont WPEView* view = nullptr; dispatch([&]() mutable { - if (!glib.web_context) { - auto* manager = webkit_website_data_manager_new_ephemeral(); - glib.web_context = webkit_web_context_new_with_website_data_manager(manager); - g_object_unref(manager); - } + auto* manager = webkit_website_data_manager_new_ephemeral(); + auto web_context = webkit_web_context_new_with_website_data_manager(manager); + g_object_unref(manager); - view = new WPEView(glib.web_context, src, context, display, width, height); + view = new WPEView(web_context, src, context, display, width, height); }); if (view && view->hasUri()) { @@ -233,6 +283,26 @@ static void s_loadProgressChaned(GObject* object, GParamSpec*, gpointer data) WPEView::WPEView(WebKitWebContext* web_context, GstWpeVideoSrc* src, GstGLContext* context, GstGLDisplay* display, int width, int height) { +#ifdef G_OS_UNIX +{ + GstObject *parent = gst_object_get_parent (GST_OBJECT (src)); + + if (parent && GST_IS_WPE_SRC (parent)) { + audio.init_ext_sigid = g_signal_connect (web_context, + "initialize-web-extensions", + G_CALLBACK (initialize_web_extensions), + NULL); + audio.extension_msg_sigid = g_signal_connect (web_context, + "user-message-received", + G_CALLBACK (webkit_extension_msg_received), + parent); + GST_INFO_OBJECT (parent, "Enabled audio"); + } + + gst_clear_object (&parent); +} +#endif // G_OS_UNIX + g_mutex_init(&threading.ready_mutex); g_cond_init(&threading.ready_cond); threading.ready = FALSE; @@ -353,6 +423,15 @@ WPEView::~WPEView() if (shm_committed) gst_buffer_unref (shm_committed); + if (audio.init_ext_sigid) { + WebKitWebContext* web_context = webkit_web_view_get_context (webkit.view); + + g_signal_handler_disconnect(web_context, audio.init_ext_sigid); + g_signal_handler_disconnect(web_context, audio.extension_msg_sigid); + audio.init_ext_sigid = 0; + audio.extension_msg_sigid = 0; + } + WPEContextThread::singleton().dispatch([&]() { if (webkit.view) { g_object_unref(webkit.view); @@ -523,11 +602,6 @@ void WPEView::setDrawBackground(gboolean drawsBackground) webkit_web_view_set_background_color(webkit.view, &color); } -void WPEView::registerAudioReceiver(const struct wpe_audio_receiver* audioReceiver, gpointer userData) -{ - wpe_audio_register_receiver(audioReceiver, userData); -} - void WPEView::releaseImage(gpointer imagePointer) { s_view->dispatch([&]() { |