mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-26 19:51:11 +00:00
wpesrc: Implement load-bytes action signal
This commit is contained in:
parent
d7778e6a7c
commit
a40476914d
3 changed files with 70 additions and 6 deletions
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue