wpesrc: Implement load-bytes action signal

This commit is contained in:
Philippe Normand 2019-09-24 16:57:54 -07:00 committed by Thibault Saunier
parent d7778e6a7c
commit a40476914d
3 changed files with 70 additions and 6 deletions

View file

@ -241,12 +241,9 @@ bool WPEThreadedView::initialize(GstWpeSrc* src, GstGLContext* context, GstGLDis
const gchar* location; const gchar* location;
gboolean drawBackground = TRUE; gboolean drawBackground = TRUE;
g_object_get(initializeContext.src, "location", &location, "draw-background", &drawBackground, nullptr); g_object_get(initializeContext.src, "location", &location, "draw-background", &drawBackground, nullptr);
if (!location) view.setDrawBackground(drawBackground);
g_warning("Invalid location"); if (location)
else {
view.setDrawBackground(drawBackground);
view.loadUriUnlocked(location); view.loadUriUnlocked(location);
}
g_cond_signal(&view.threading.cond); g_cond_signal(&view.threading.cond);
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
}, },
@ -261,7 +258,7 @@ bool WPEThreadedView::initialize(GstWpeSrc* src, GstGLContext* context, GstGLDis
g_source_unref(source); g_source_unref(source);
if (initializeContext.result) { if (initializeContext.result && webkit.uri) {
GST_DEBUG("waiting load to finish"); GST_DEBUG("waiting load to finish");
GMutexHolder lock(threading.ready_mutex); GMutexHolder lock(threading.ready_mutex);
g_cond_wait(&threading.ready_cond, &threading.ready_mutex); g_cond_wait(&threading.ready_cond, &threading.ready_mutex);
@ -399,6 +396,40 @@ void WPEThreadedView::loadUri(const gchar* uri)
g_source_unref(source); g_source_unref(source);
} }
void WPEThreadedView::loadData(GBytes* bytes)
{
struct DataContext {
WPEThreadedView& view;
GBytes* bytes;
} dataContext { *this, g_bytes_ref(bytes) };
GSource* source = g_idle_source_new();
g_source_set_callback(source,
[](gpointer data) -> gboolean {
GST_DEBUG("on view thread");
auto& dataContext = *static_cast<DataContext*>(data);
auto& view = dataContext.view;
GMutexHolder lock(view.threading.mutex);
webkit_web_view_load_bytes(view.webkit.view, dataContext.bytes, nullptr, nullptr, nullptr);
g_bytes_unref(dataContext.bytes);
g_cond_signal(&view.threading.cond);
return G_SOURCE_REMOVE;
},
&dataContext, nullptr);
g_source_set_priority(source, WPE_GLIB_SOURCE_PRIORITY);
{
GMutexHolder lock(threading.mutex);
g_source_attach(source, glib.context);
g_cond_wait(&threading.cond, &threading.mutex);
GST_DEBUG("done");
}
g_source_unref(source);
}
void WPEThreadedView::setDrawBackground(gboolean drawsBackground) void WPEThreadedView::setDrawBackground(gboolean drawsBackground)
{ {
#if WEBKIT_CHECK_VERSION(2, 24, 0) #if WEBKIT_CHECK_VERSION(2, 24, 0)

View file

@ -40,6 +40,7 @@ public:
void resize(int width, int height); void resize(int width, int height);
void loadUri(const gchar*); void loadUri(const gchar*);
void loadData(GBytes*);
void setDrawBackground(gboolean); void setDrawBackground(gboolean);
GstEGLImage* image(); GstEGLImage* image();

View file

@ -86,6 +86,7 @@ enum
enum enum
{ {
SIGNAL_CONFIGURE_WEB_VIEW, SIGNAL_CONFIGURE_WEB_VIEW,
SIGNAL_LOAD_BYTES,
LAST_SIGNAL LAST_SIGNAL
}; };
static guint gst_wpe_src_signals[LAST_SIGNAL] = { 0 }; static guint gst_wpe_src_signals[LAST_SIGNAL] = { 0 };
@ -99,6 +100,8 @@ struct _GstWpeSrc
/* properties */ /* properties */
gchar *location; gchar *location;
gboolean draw_background; gboolean draw_background;
GBytes *bytes;
}; };
static void gst_wpe_src_uri_handler_init (gpointer iface, gpointer data); static void gst_wpe_src_uri_handler_init (gpointer iface, gpointer data);
@ -164,6 +167,13 @@ gst_wpe_src_gl_start (GstGLBaseSrc * base_src)
result = src->view->initialize (src, base_src->context, base_src->display, result = src->view->initialize (src, base_src->context, base_src->display,
GST_VIDEO_INFO_WIDTH (&base_src->out_info), GST_VIDEO_INFO_WIDTH (&base_src->out_info),
GST_VIDEO_INFO_HEIGHT (&base_src->out_info)); GST_VIDEO_INFO_HEIGHT (&base_src->out_info));
if (src->bytes != NULL) {
src->view->loadData (src->bytes);
g_bytes_unref (src->bytes);
src->bytes = NULL;
}
GST_OBJECT_UNLOCK (src); GST_OBJECT_UNLOCK (src);
if (!result) { if (!result) {
GST_ELEMENT_ERROR (src, RESOURCE, FAILED, GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
@ -229,6 +239,15 @@ gst_wpe_src_configure_web_view (GstWpeSrc * src, WebKitWebView * webview)
g_value_unset (&args[1]); g_value_unset (&args[1]);
} }
static void
gst_wpe_src_load_bytes (GstWpeSrc * src, GBytes * bytes)
{
if (src->view && GST_STATE (GST_ELEMENT_CAST (src)) > GST_STATE_NULL)
src->view->loadData (bytes);
else
src->bytes = g_bytes_ref (bytes);
}
static gboolean static gboolean
gst_wpe_src_set_location (GstWpeSrc * src, const gchar * location, gst_wpe_src_set_location (GstWpeSrc * src, const gchar * location,
GError ** error) GError ** error)
@ -485,6 +504,19 @@ gst_wpe_src_class_init (GstWpeSrcClass * klass)
g_signal_new ("configure-web-view", G_TYPE_FROM_CLASS (klass), g_signal_new ("configure-web-view", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_generic, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_generic,
G_TYPE_NONE, 1, G_TYPE_OBJECT); G_TYPE_NONE, 1, G_TYPE_OBJECT);
/**
* GstWpeSrc::load-bytes:
* @src: the object which received the signal
* @bytes: the GBytes data to load
*
* Load the specified bytes into the internal webView.
*/
gst_wpe_src_signals[SIGNAL_LOAD_BYTES] =
g_signal_new_class_handler ("load-bytes", G_TYPE_FROM_CLASS (klass),
static_cast < GSignalFlags > (G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
G_CALLBACK (gst_wpe_src_load_bytes), NULL, NULL,
g_cclosure_marshal_generic, G_TYPE_NONE, 1, G_TYPE_BYTES);
} }
static gboolean static gboolean