summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2010-04-19 17:14:56 +0200
committerBenjamin Otte <otte@redhat.com>2010-04-19 17:14:56 +0200
commitd301d3dc6e256d889beb7cb7551959fc05ad690b (patch)
tree4e13ac9cb5cebbe342e752c5d1a94830b162258f
parentcf55f8482ad42ddf7457e5fe1e845329f5de94a6 (diff)
cairoxconvert: Convert to new target API that cairoxsink uses
This way, cairoxconvert now supports OpenGL
-rw-r--r--ext/xlib/gstcairoxconvert.c49
-rw-r--r--ext/xlib/gstcairoxconvert.h6
2 files changed, 43 insertions, 12 deletions
diff --git a/ext/xlib/gstcairoxconvert.c b/ext/xlib/gstcairoxconvert.c
index e2da7e8..c33fc76 100644
--- a/ext/xlib/gstcairoxconvert.c
+++ b/ext/xlib/gstcairoxconvert.c
@@ -49,6 +49,9 @@ gst_cairo_x_convert_transform_caps (GstBaseTransform * btrans,
cairo = gst_caps_from_string ("video/x-cairo");
expand = gst_cairo_caps_expand (caps, GST_CAIRO_FORMAT_FORMAT);
+ expand = gst_cairo_caps_expand_surface_types (expand,
+ gst_cairo_x_target_get_supported_types ());
+
result = gst_caps_intersect (cairo, expand);
/* must exist, we just expanded to make sure */
g_assert (result);
@@ -73,15 +76,29 @@ gst_cairo_x_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
GST_CAIRO_FORMAT_FORMAT);
}
+static void
+gst_cairo_x_convert_close_display (void *display)
+{
+ XCloseDisplay (display);
+}
+
static gboolean
gst_cairo_x_convert_start (GstBaseTransform * btrans)
{
+ static const cairo_user_data_key_t key;
GstCairoXConvert *convert = GST_CAIRO_X_CONVERT (btrans);
+ Display *display;
- convert->display = XOpenDisplay (NULL);
- if (convert->display == NULL)
+ display = XOpenDisplay (NULL);
+ if (display == NULL)
return FALSE;
+ convert->root_window = cairo_xlib_surface_create (display,
+ DefaultRootWindow (display),
+ DefaultVisual (display, DefaultScreen (display)), 1, 1);
+ cairo_surface_set_user_data (convert->root_window, &key,
+ display, gst_cairo_x_convert_close_display);
+
return TRUE;
}
@@ -94,8 +111,13 @@ gst_cairo_x_convert_stop (GstBaseTransform * btrans)
convert->in_format = NULL;
gst_cairo_format_free (convert->out_format);
convert->out_format = NULL;
- XCloseDisplay (convert->display);
- convert->display = NULL;
+ if (convert->surface) {
+ cairo_surface_destroy (convert->surface);
+ convert->surface = NULL;
+ }
+ convert->target = NULL;
+ cairo_surface_destroy (convert->root_window);
+ convert->root_window = NULL;
return TRUE;
}
@@ -142,17 +164,22 @@ gst_cairo_x_convert_buffer_alloc (GstPad * pad, guint64 offset,
guint size, GstCaps * caps, GstBuffer ** buf)
{
GstCairoXConvert *convert = GST_CAIRO_X_CONVERT (gst_pad_get_parent (pad));
+ const GstCairoXTarget *target;
GstCairoFormat *format;
- cairo_surface_t *root;
format = gst_cairo_format_new (caps);
+ target = gst_cairo_x_target_get (gst_cairo_format_get_surface_type (format));
+ if (target != convert->target) {
+ if (convert->surface)
+ cairo_surface_destroy (convert->surface);
+ convert->target = target;
+ convert->surface = convert->target->create_window (convert->root_window);
+ }
+ if (convert->surface)
+ *buf = gst_cairo_buffer_new_similar (convert->surface, format);
+ else
+ *buf = NULL;
- root = cairo_xlib_surface_create (convert->display,
- DefaultRootWindow (convert->display),
- DefaultVisual (convert->display, DefaultScreen (convert->display)), 1, 1);
- *buf = gst_cairo_buffer_new_similar (root, format);
-
- cairo_surface_destroy (root);
gst_cairo_format_free (format);
gst_object_unref (convert);
diff --git a/ext/xlib/gstcairoxconvert.h b/ext/xlib/gstcairoxconvert.h
index d67daa4..7642fc2 100644
--- a/ext/xlib/gstcairoxconvert.h
+++ b/ext/xlib/gstcairoxconvert.h
@@ -26,6 +26,8 @@
#include <X11/Xlib.h>
+#include "gstcairoxtarget.h"
+
G_BEGIN_DECLS
#define GST_TYPE_CAIRO_X_CONVERT (gst_cairo_x_convert_get_type())
@@ -48,7 +50,9 @@ struct _GstCairoXConvert {
GstCairoFormat * in_format; /* negotiated format on the sink side */
GstCairoFormat * out_format; /* negotiated format on the source side */
- Display * display; /* connection to X server */
+ cairo_surface_t * root_window; /* the X root window */
+ const GstCairoXTarget *target; /* the target */
+ cairo_surface_t * surface; /* surface used for drawing or NULL */
};
struct _GstCairoXConvertClass