/** * gst_gl_window_get_context: * @window: a #GstGLWindow * * Returns: (transfer full): the #GstGLContext associated with this @window * * Since: 1.4 */ GstGLContext * gst_gl_window_get_context (GstGLWindow * window) { g_return_val_if_fail (GST_IS_GL_WINDOW (window), NULL); return (GstGLContext *) g_weak_ref_get (&window->context_ref); }
static gpointer gst_gl_window_navigation_thread (GstGLWindow * window) { GSource *source; g_return_val_if_fail (GST_IS_GL_WINDOW (window), NULL); window->priv->navigation_context = g_main_context_new (); window->priv->navigation_loop = g_main_loop_new (window->priv->navigation_context, FALSE); g_main_context_push_thread_default (window->priv->navigation_context); source = g_idle_source_new (); g_source_set_callback (source, (GSourceFunc) gst_gl_window_navigation_started, window, NULL); g_source_attach (source, window->priv->navigation_context); g_source_unref (source); g_main_loop_run (window->priv->navigation_loop); g_main_context_pop_thread_default (window->priv->navigation_context); g_main_loop_unref (window->priv->navigation_loop); g_main_context_unref (window->priv->navigation_context); window->priv->navigation_loop = NULL; window->priv->navigation_context = NULL; GST_INFO ("navigation loop exited\n"); return NULL; }
/** * gst_gl_window_show: * @window: a #GstGLWindow * * Present the window to the screen. * * Since: 1.6 */ void gst_gl_window_show (GstGLWindow * window) { GstGLWindowClass *window_class; g_return_if_fail (GST_IS_GL_WINDOW (window)); window_class = GST_GL_WINDOW_GET_CLASS (window); if (window_class->show) window_class->show (window); }
/** * gst_gl_window_set_preferred_size: * @window: a #GstGLWindow * @width: new preferred width * @height: new preferred height * * Set the preferred width and height of the window. Implementations are free * to ignore this information. * * Since: 1.6 */ void gst_gl_window_set_preferred_size (GstGLWindow * window, gint width, gint height) { GstGLWindowClass *window_class; g_return_if_fail (GST_IS_GL_WINDOW (window)); window_class = GST_GL_WINDOW_GET_CLASS (window); if (window_class->set_preferred_size) window_class->set_preferred_size (window, width, height); }
/** * gst_gl_window_handle_events: * @window: a #GstGLWindow * @handle_events: a #gboolean indicating if events should be handled or not. * * Tell a @window that it should handle events from the window system. These * events are forwarded upstream as navigation events. In some window systems * events are not propagated in the window hierarchy if a client is listening * for them. This method allows you to disable events handling completely * from the @window. */ void gst_gl_window_handle_events (GstGLWindow * window, gboolean handle_events) { GstGLWindowClass *window_class; g_return_if_fail (GST_IS_GL_WINDOW (window)); window_class = GST_GL_WINDOW_GET_CLASS (window); if (window_class->handle_events) window_class->handle_events (window, handle_events); }
/** * gst_gl_window_get_window_handle: * @window: a #GstGLWindow * * Returns: the window handle we are currently rendering into * * Since: 1.4 */ guintptr gst_gl_window_get_window_handle (GstGLWindow * window) { GstGLWindowClass *window_class; g_return_val_if_fail (GST_IS_GL_WINDOW (window), 0); window_class = GST_GL_WINDOW_GET_CLASS (window); g_return_val_if_fail (window_class->get_window_handle != NULL, 0); return window_class->get_window_handle (window); }
void gst_gl_window_resize (GstGLWindow * window, guint width, guint height) { g_return_if_fail (GST_IS_GL_WINDOW (window)); if (window->resize) window->resize (window->resize_data, width, height); window->priv->surface_width = width; window->priv->surface_height = height; }
/** * gst_gl_window_run: * @window: a #GstGLWindow * * Start the execution of the runloop. * * Since: 1.4 */ void gst_gl_window_run (GstGLWindow * window) { GstGLWindowClass *window_class; g_return_if_fail (GST_IS_GL_WINDOW (window)); window_class = GST_GL_WINDOW_GET_CLASS (window); g_return_if_fail (window_class->run != NULL); window->priv->alive = TRUE; window_class->run (window); }
void gst_gl_window_queue_resize (GstGLWindow * window) { GstGLWindowClass *window_class; g_return_if_fail (GST_IS_GL_WINDOW (window)); window_class = GST_GL_WINDOW_GET_CLASS (window); window->queue_resize = TRUE; if (window_class->queue_resize) window_class->queue_resize (window); }
/** * gst_gl_window_send_message_async: * @window: a #GstGLWindow * @callback: (scope async): function to invoke * @data: (closure): data to invoke @callback with * @destroy: called when @data is not needed anymore * * Invoke @callback with @data on the window thread. The callback may not * have been executed when this function returns. * * Since: 1.4 */ void gst_gl_window_send_message_async (GstGLWindow * window, GstGLWindowCB callback, gpointer data, GDestroyNotify destroy) { GstGLWindowClass *window_class; g_return_if_fail (GST_IS_GL_WINDOW (window)); g_return_if_fail (callback != NULL); window_class = GST_GL_WINDOW_GET_CLASS (window); g_return_if_fail (window_class->send_message_async != NULL); window_class->send_message_async (window, callback, data, destroy); }
/** * gst_gl_window_send_message: * @window: a #GstGLWindow * @callback: (scope async): function to invoke * @data: (closure): data to invoke @callback with * * Invoke @callback with data on the window thread. @callback is guarenteed to * have executed when this function returns. * * Since: 1.4 */ void gst_gl_window_send_message (GstGLWindow * window, GstGLWindowCB callback, gpointer data) { GstGLWindowClass *window_class; g_return_if_fail (GST_IS_GL_WINDOW (window)); g_return_if_fail (callback != NULL); window_class = GST_GL_WINDOW_GET_CLASS (window); g_return_if_fail (window_class->send_message != NULL); window_class->send_message (window, callback, data); }
/** * gst_gl_window_draw: * @window: a #GstGLWindow * * Redraw the window contents. Implementations should invoke the draw callback. * * Since: 1.4 */ void gst_gl_window_draw (GstGLWindow * window) { GstGLWindowClass *window_class; g_return_if_fail (GST_IS_GL_WINDOW (window)); window_class = GST_GL_WINDOW_GET_CLASS (window); g_return_if_fail (window_class->draw != NULL); /* avoid to overload the drawer */ if (window->is_drawing) { return; } window_class->draw (window); }
/** * gst_gl_window_set_close_callback: * @window: a #GstGLWindow * @callback: (scope notified): function to invoke * @data: (closure): data to invoke @callback with * @destroy_notify: called when @data is not needed any more * * Sets the callback called when the window is about to close. * * Since: 1.4 */ void gst_gl_window_set_close_callback (GstGLWindow * window, GstGLWindowCB callback, gpointer data, GDestroyNotify destroy_notify) { g_return_if_fail (GST_IS_GL_WINDOW (window)); GST_GL_WINDOW_LOCK (window); if (window->close_notify) window->close_notify (window->close_data); window->close = callback; window->close_data = data; window->close_notify = destroy_notify; GST_GL_WINDOW_UNLOCK (window); }
/** * gst_gl_window_set_render_rectangle: * @window: a #GstGLWindow * @x: x position * @y: y position * @width: width * @height: height * * Tell a @window that it should render into a specific region of the window * according to the #GstVideoOverlay interface. * * Returns: whether the specified region could be set */ gboolean gst_gl_window_set_render_rectangle (GstGLWindow * window, gint x, gint y, gint width, gint height) { GstGLWindowClass *window_class; gboolean ret = FALSE; g_return_val_if_fail (GST_IS_GL_WINDOW (window), FALSE); window_class = GST_GL_WINDOW_GET_CLASS (window); if (x < 0 || y < 0 || width <= 0 || height <= 0) return FALSE; if (window_class->set_render_rectangle) ret = window_class->set_render_rectangle (window, x, y, width, height); return ret; }
/** * gst_gl_window_quit: * @window: a #GstGLWindow * * Quit the runloop's execution. * * Since: 1.4 */ void gst_gl_window_quit (GstGLWindow * window) { GstGLWindowClass *window_class; g_return_if_fail (GST_IS_GL_WINDOW (window)); window_class = GST_GL_WINDOW_GET_CLASS (window); g_return_if_fail (window_class->quit != NULL); GST_GL_WINDOW_LOCK (window); window->priv->alive = FALSE; window_class->quit (window); GST_INFO ("quit sent to gl window loop"); GST_GL_WINDOW_UNLOCK (window); }
void gst_gl_window_resize (GstGLWindow * window, guint width, guint height) { g_return_if_fail (GST_IS_GL_WINDOW (window)); if (window->resize) { struct resize_data resize = { 0, }; resize.window = window; resize.width = width; resize.height = height; gst_gl_window_send_message (window, (GstGLWindowCB) _on_resize, &resize); } window->priv->surface_width = width; window->priv->surface_height = height; window->queue_resize = FALSE; }
/** * gst_gl_window_set_window_handle: * @window: a #GstGLWindow * @handle: handle to the window * * Sets the window that this @window should render into. Some implementations * require this to be called with a valid handle before drawing can commence. * * Since: 1.4 */ void gst_gl_window_set_window_handle (GstGLWindow * window, guintptr handle) { GstGLWindowClass *window_class; GstSetWindowHandleCb *data; g_return_if_fail (GST_IS_GL_WINDOW (window)); g_return_if_fail (handle != 0); window_class = GST_GL_WINDOW_GET_CLASS (window); g_return_if_fail (window_class->set_window_handle != NULL); data = g_slice_new (GstSetWindowHandleCb); data->window = gst_object_ref (window); data->handle = handle; /* FIXME: Move to a message which deactivates, calls implementation, activates */ gst_gl_window_send_message_async (window, (GstGLWindowCB) _set_window_handle_cb, data, (GDestroyNotify) _free_swh_cb); /* window_class->set_window_handle (window, handle); */ }