summaryrefslogtreecommitdiff
path: root/gst-libs
diff options
context:
space:
mode:
authorMatthew Waters <matthew@centricular.com>2015-05-29 18:06:27 +1000
committerMatthew Waters <matthew@centricular.com>2015-05-31 16:09:34 +1000
commite385adc241da19242574214d4129233098d277f8 (patch)
tree2d5d483992c03f7f7d702cc33416fab04602ea5c /gst-libs
parentfac0cdc7ac76ee50dcb8e3376923e3945af490cc (diff)
downloadgstreamer-plugins-bad-e385adc241da19242574214d4129233098d277f8.tar.gz
gl/wayland: implement setting the render rectangle
Places our subsurface at the rectangle provided position
Diffstat (limited to 'gst-libs')
-rw-r--r--gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c77
-rw-r--r--gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h1
2 files changed, 66 insertions, 12 deletions
diff --git a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c
index 519f9af4c..a8e3422e9 100644
--- a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c
+++ b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c
@@ -58,6 +58,8 @@ static void gst_gl_window_wayland_egl_close (GstGLWindow * window);
static gboolean gst_gl_window_wayland_egl_open (GstGLWindow * window,
GError ** error);
static guintptr gst_gl_window_wayland_egl_get_display (GstGLWindow * window);
+static gboolean gst_gl_window_wayland_egl_set_render_rectangle (GstGLWindow *
+ window, gint x, gint y, gint width, gint height);
#if 0
static void
@@ -282,12 +284,6 @@ create_surfaces (GstGLWindowWaylandEGL * window_egl)
window_egl->window.queue);
}
- if (gst_gl_wl_display_roundtrip_queue (display->display,
- window_egl->window.queue) < 0) {
- GST_ERROR_OBJECT (window_egl,
- "Failed to perform a roundtrip on our wl_event_queue");
- }
-
if (window_egl->window.foreign_surface) {
/* (re)parent */
if (!display->subcompositor) {
@@ -316,8 +312,8 @@ create_surfaces (GstGLWindowWaylandEGL * window_egl)
wl_shell_get_shell_surface (display->shell,
window_egl->window.surface);
if (window_egl->window.queue)
- wl_proxy_set_queue ((struct wl_proxy *) window_egl->window.
- shell_surface, window_egl->window.queue);
+ wl_proxy_set_queue ((struct wl_proxy *) window_egl->
+ window.shell_surface, window_egl->window.queue);
wl_shell_surface_add_listener (window_egl->window.shell_surface,
&shell_surface_listener, window_egl);
@@ -371,6 +367,8 @@ gst_gl_window_wayland_egl_class_init (GstGLWindowWaylandEGLClass * klass)
window_class->open = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_open);
window_class->get_display =
GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_get_display);
+ window_class->set_render_rectangle =
+ GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_set_render_rectangle);
gobject_class->finalize = gst_gl_window_wayland_egl_finalize;
}
@@ -435,10 +433,6 @@ gst_gl_window_wayland_egl_open (GstGLWindow * window, GError ** error)
window_egl->window.queue = wl_display_create_queue (display->display);
- wl_display_roundtrip (display->display);
-
- create_surfaces (window_egl);
-
window_egl->wl_source = wayland_event_source_new (display->display,
window_egl->window.queue);
@@ -585,6 +579,9 @@ draw_cb (gpointer data)
create_surfaces (window_egl);
+ if (window_egl->window.subsurface)
+ wl_subsurface_set_desync (window_egl->window.subsurface);
+
if (window->draw)
window->draw (window->draw_data);
@@ -602,6 +599,62 @@ gst_gl_window_wayland_egl_draw (GstGLWindow * window)
gst_gl_window_send_message (window, (GstGLWindowCB) draw_cb, window);
}
+struct SetRenderRectangle
+{
+ GstGLWindowWaylandEGL *window_egl;
+ GstVideoRectangle rect;
+};
+
+static void
+_free_set_render_rectangle (struct SetRenderRectangle *render)
+{
+ if (render) {
+ if (render->window_egl)
+ gst_object_unref (render->window_egl);
+ g_free (render);
+ }
+}
+
+static void
+_set_render_rectangle (gpointer data)
+{
+ struct SetRenderRectangle *render = data;
+
+ GST_LOG_OBJECT (render->window_egl, "setting render rectangle %i,%i+%ix%i",
+ render->rect.x, render->rect.y, render->rect.w, render->rect.h);
+
+ if (render->window_egl->window.subsurface) {
+ wl_subsurface_set_sync (render->window_egl->window.subsurface);
+ wl_subsurface_set_position (render->window_egl->window.subsurface,
+ render->rect.x, render->rect.y);
+ render->window_egl->window.window_x = render->rect.x;
+ render->window_egl->window.window_y = render->rect.y;
+ }
+
+ window_resize (render->window_egl, render->rect.w, render->rect.h);
+}
+
+static gboolean
+gst_gl_window_wayland_egl_set_render_rectangle (GstGLWindow * window,
+ gint x, gint y, gint width, gint height)
+{
+ GstGLWindowWaylandEGL *window_egl = GST_GL_WINDOW_WAYLAND_EGL (window);
+ struct SetRenderRectangle *render;
+
+ render = g_new0 (struct SetRenderRectangle, 1);
+ render->window_egl = gst_object_ref (window_egl);
+ render->rect.x = x;
+ render->rect.y = y;
+ render->rect.w = width;
+ render->rect.h = height;
+
+ gst_gl_window_send_message_async (window,
+ (GstGLWindowCB) _set_render_rectangle, render,
+ (GDestroyNotify) _free_set_render_rectangle);
+
+ return TRUE;
+}
+
static guintptr
gst_gl_window_wayland_egl_get_display (GstGLWindow * window)
{
diff --git a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h
index 3d08f6f98..ee23ed861 100644
--- a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h
+++ b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h
@@ -72,6 +72,7 @@ struct window {
struct wl_callback *callback;
int fullscreen, configured;
int window_width, window_height;
+ int window_x, window_y;
};
struct _GstGLWindowWaylandEGL {