[prev in list] [next in list] [prev in thread] [next in thread]
List: gstreamer-cvs
Subject: gst-plugins-bad: glwindow: handle gst_video_overlay_set_render_rectangle
From: ystreet () kemper ! freedesktop ! org (Matthew Waters)
Date: 2015-05-31 6:33:29
Message-ID: 20150531063329.C2081761E8 () kemper ! freedesktop ! org
[Download RAW message or body]
Module: gst-plugins-bad
Branch: master
Commit: fac0cdc7ac76ee50dcb8e3376923e3945af490cc
URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-bad/commit/?id=fac0cdc7ac76ee50dcb8e3376923e3945af490cc
Author: Matthew Waters <matthew@centricular.com>
Date: Fri May 29 18:03:52 2015 +1000
glwindow: handle gst_video_overlay_set_render_rectangle
---
ext/gl/gstglimagesink.c | 32 +++++++++++++++++++++++++++++---
ext/gl/gstglimagesink.h | 6 ++++++
gst-libs/gst/gl/gstglwindow.c | 32 ++++++++++++++++++++++++++++++++
gst-libs/gst/gl/gstglwindow.h | 6 ++++++
4 files changed, 73 insertions(+), 3 deletions(-)
diff --git a/ext/gl/gstglimagesink.c b/ext/gl/gstglimagesink.c
index 648b8da..30ff74f 100644
--- a/ext/gl/gstglimagesink.c
+++ b/ext/gl/gstglimagesink.c
@@ -351,9 +351,9 @@ static void gst_glimage_sink_video_overlay_init \
(GstVideoOverlayInterface * static void gst_glimage_sink_set_window_handle \
(GstVideoOverlay * overlay, guintptr id);
static void gst_glimage_sink_expose (GstVideoOverlay * overlay);
-
-static void
-gst_glimage_sink_handle_events (GstVideoOverlay * overlay,
+static void gst_glimage_sink_set_render_rectangle (GstVideoOverlay * overlay,
+ gint x, gint y, gint width, gint height);
+static void gst_glimage_sink_handle_events (GstVideoOverlay * overlay,
gboolean handle_events);
static GstStaticPadTemplate gst_glimage_sink_template =
@@ -761,6 +761,12 @@ _ensure_gl_setup (GstGLImageSink * gl_sink)
g_signal_connect (window, "mouse-event",
G_CALLBACK (gst_glimage_sink_mouse_event_cb), gl_sink);
+ if (gl_sink->x >= 0 && gl_sink->y >= 0 && gl_sink->width > 0 &&
+ gl_sink->height > 0) {
+ gst_gl_window_set_render_rectangle (window, gl_sink->x, gl_sink->y,
+ gl_sink->width, gl_sink->height);
+ }
+
if (other_context)
gst_object_unref (other_context);
gst_object_unref (window);
@@ -1234,6 +1240,7 @@ static void
gst_glimage_sink_video_overlay_init (GstVideoOverlayInterface * iface)
{
iface->set_window_handle = gst_glimage_sink_set_window_handle;
+ iface->set_render_rectangle = gst_glimage_sink_set_render_rectangle;
iface->handle_events = gst_glimage_sink_handle_events;
iface->expose = gst_glimage_sink_expose;
}
@@ -1288,6 +1295,25 @@ gst_glimage_sink_handle_events (GstVideoOverlay * overlay,
}
}
+static void
+gst_glimage_sink_set_render_rectangle (GstVideoOverlay * overlay,
+ gint x, gint y, gint width, gint height)
+{
+ GstGLImageSink *glimage_sink = GST_GLIMAGE_SINK (overlay);
+
+ if (G_LIKELY (glimage_sink->context)) {
+ GstGLWindow *window;
+ window = gst_gl_context_get_window (glimage_sink->context);
+ gst_gl_window_set_render_rectangle (window, x, y, width, height);
+ gst_object_unref (window);
+ }
+
+ glimage_sink->x = x;
+ glimage_sink->y = y;
+ glimage_sink->width = width;
+ glimage_sink->height = height;
+}
+
static gboolean
gst_glimage_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
{
diff --git a/ext/gl/gstglimagesink.h b/ext/gl/gstglimagesink.h
index 52db017..03e8136 100644
--- a/ext/gl/gstglimagesink.h
+++ b/ext/gl/gstglimagesink.h
@@ -56,6 +56,12 @@ struct _GstGLImageSink
gulong mouse_sig_id;
gulong key_sig_id;
+ /* GstVideoOverlay::set_render_rectangle() cache */
+ gint x;
+ gint y;
+ gint width;
+ gint height;
+
//caps
GstVideoInfo info;
GstCaps *caps;
diff --git a/gst-libs/gst/gl/gstglwindow.c b/gst-libs/gst/gl/gstglwindow.c
index 347781f..8682b1c 100644
--- a/gst-libs/gst/gl/gstglwindow.c
+++ b/gst-libs/gst/gl/gstglwindow.c
@@ -1094,3 +1094,35 @@ gst_gl_window_handle_events (GstGLWindow * window, gboolean \
handle_events) if (window_class->handle_events)
window_class->handle_events (window, handle_events);
}
+
+/**
+ * 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_if_fail (GST_GL_IS_WINDOW (window));
+ 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;
+}
diff --git a/gst-libs/gst/gl/gstglwindow.h b/gst-libs/gst/gl/gstglwindow.h
index f12a317..b7c5a76 100644
--- a/gst-libs/gst/gl/gstglwindow.h
+++ b/gst-libs/gst/gl/gstglwindow.h
@@ -142,6 +142,7 @@ struct _GstGLWindowClass {
void (*handle_events) (GstGLWindow *window, gboolean handle_events);
void (*set_preferred_size) (GstGLWindow *window, gint width, gint height);
void (*show) (GstGLWindow *window);
+ gboolean (*set_render_rectangle)(GstGLWindow *window, gint x, gint y, gint width, \
gint height);
/*< private >*/
gpointer _reserved[GST_PADDING];
@@ -221,6 +222,11 @@ void gst_gl_window_set_preferred_size (GstGLWindow * \
window, void gst_gl_window_get_surface_dimensions (GstGLWindow * window,
guint * width,
guint * height);
+gboolean gst_gl_window_set_render_rectangle (GstGLWindow * window,
+ gint x,
+ gint y,
+ gint width,
+ gint height);
GstGLContext * gst_gl_window_get_context (GstGLWindow *window);
guintptr gst_gl_window_get_display (GstGLWindow *window);
_______________________________________________
gstreamer-commits mailing list
gstreamer-commits@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/gstreamer-commits
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic