summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2009-07-16 21:42:21 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2009-07-16 21:42:21 +0200
commit28bee12728f4346dcf2920beb8564e3533c82158 (patch)
treea9838e1c38868b15c2f9f00b4f542cbcc8d12ba7
parent13f23f81e8157722ad91e44e46d988ef172a6058 (diff)
cairorender: Correctly set srccaps
-rw-r--r--ext/cairo/gstcairorender.c42
1 files changed, 20 insertions, 22 deletions
diff --git a/ext/cairo/gstcairorender.c b/ext/cairo/gstcairorender.c
index e2ae5c02e..4e69aa549 100644
--- a/ext/cairo/gstcairorender.c
+++ b/ext/cairo/gstcairorender.c
@@ -168,50 +168,48 @@ static gboolean
gst_cairo_render_setcaps_sink (GstPad * pad, GstCaps * caps)
{
GstCairoRender *c = GST_CAIRO_RENDER (GST_PAD_PARENT (pad));
- const GValue *value;
GstStructure *s = gst_caps_get_structure (caps, 0);
const gchar *mime = gst_structure_get_name (s);
+ gint fps_n = 0, fps_d = 1;
GST_DEBUG_OBJECT (c, "Got caps (%s).", mime);
if ((c->png = !strcmp (mime, "image/png")))
return TRUE;
/* Width and height */
- value = gst_structure_get_value (s, "width");
- if (!value || !G_VALUE_HOLDS_INT (value)) {
- GST_DEBUG_OBJECT (c, "Width is missing.");
+ if (!gst_structure_get_int (s, "width", &c->width) ||
+ !gst_structure_get_int (s, "height", &c->height)) {
+ GST_ERROR_OBJECT (c, "Invalid caps");
return FALSE;
}
- c->width = g_value_get_int (value);
- value = gst_structure_get_value (s, "height");
- if (!value || !G_VALUE_HOLDS_INT (value)) {
- GST_DEBUG_OBJECT (c, "Height is missing.");
- return FALSE;
- }
- c->height = g_value_get_int (value);
/* Colorspace
* FIXME: I couldn't figure out the right caps. The solution below
* results in a black and white result which is better than nothing.
* If you know how to fix this, please do it. */
- if (!strcmp (mime, "video/x-raw-yuv"))
+ if (!strcmp (mime, "video/x-raw-yuv")) {
c->format = CAIRO_FORMAT_A8;
- else if (!strcmp (mime, "video/x-raw-rgb"))
+ } else if (!strcmp (mime, "video/x-raw-rgb")) {
c->format = CAIRO_FORMAT_RGB24;
- else {
+ } else {
GST_DEBUG_OBJECT (c, "Unknown mime type '%s'.", mime);
return FALSE;
}
/* Framerate */
- value = gst_structure_get_value (s, "framerate");
- if (value && GST_VALUE_HOLDS_FRACTION (value)) {
- caps = gst_pad_get_allowed_caps (c->src);
- s = gst_caps_get_structure (caps, 0);
- gst_structure_set_value (s, "framerate", value);
- gst_pad_set_caps (c->src, caps);
- gst_caps_unref (caps);
- }
+ gst_structure_get_fraction (s, "framerate", &fps_n, &fps_d);
+
+ /* Create output caps */
+ caps = gst_pad_get_allowed_caps (c->src);
+ caps = gst_caps_make_writable (caps);
+ gst_caps_truncate (caps);
+ s = gst_caps_get_structure (caps, 0);
+ gst_structure_set (s, "height", G_TYPE_INT, c->height, "width", G_TYPE_INT,
+ c->width, "framerate", GST_TYPE_FRACTION, fps_n, fps_d, NULL);
+ GST_DEBUG_OBJECT (c, "Setting src caps %" GST_PTR_FORMAT, caps);
+ gst_pad_set_caps (c->src, caps);
+ gst_caps_unref (caps);
+
return TRUE;
}