diff options
author | Benjamin Otte <otte@redhat.com> | 2010-04-19 17:14:56 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2010-04-19 17:14:56 +0200 |
commit | d301d3dc6e256d889beb7cb7551959fc05ad690b (patch) | |
tree | 4e13ac9cb5cebbe342e752c5d1a94830b162258f | |
parent | cf55f8482ad42ddf7457e5fe1e845329f5de94a6 (diff) |
cairoxconvert: Convert to new target API that cairoxsink uses
This way, cairoxconvert now supports OpenGL
-rw-r--r-- | ext/xlib/gstcairoxconvert.c | 49 | ||||
-rw-r--r-- | ext/xlib/gstcairoxconvert.h | 6 |
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 |