if(format->bpp){
caps = GST_CAPS_NEW ("videofilter", "video/x-raw-rgb",
- "format", GST_PROPS_FOURCC (fourcc),
"depth", GST_PROPS_INT(format->bpp),
"bpp", GST_PROPS_INT(format->depth),
"endianness", GST_PROPS_INT(format->endianness),
return capslist;
}
+static GstCaps* gst_videofilter_caps_add_variable_part (GstCaps *caps)
+{
+ GstCaps *yuv, *rgb;
+
+ if (caps == NULL)
+ return NULL;
+
+ yuv = GST_CAPS_NEW("videofilter_size","video/x-raw-yuv",
+ "width", GST_PROPS_INT_RANGE (0, G_MAXINT),
+ "height", GST_PROPS_INT_RANGE (0, G_MAXINT),
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT));
+ rgb = GST_CAPS_NEW("videofilter_size","video/x-raw-rgb",
+ "width", GST_PROPS_INT_RANGE (0, G_MAXINT),
+ "height", GST_PROPS_INT_RANGE (0, G_MAXINT),
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT));
+ yuv = gst_caps_intersect (yuv, caps);
+ rgb = gst_caps_intersect (rgb, caps);
+ if (yuv) {
+ gst_caps_append (yuv, rgb);
+ } else {
+ g_assert (rgb);
+ yuv = rgb;
+ }
+ gst_caps_unref (caps);
+
+ return yuv;
+}
+
static GstCaps *
gst_videofilter_sink_getcaps (GstPad *pad, GstCaps *caps)
{
GstVideofilterClass *klass;
GstCaps *capslist = NULL;
GstCaps *peercaps;
- GstCaps *sizecaps;
int i;
GST_DEBUG("gst_videofilter_sink_getcaps");
}
gst_caps_unref (peercaps);
- sizecaps = GST_CAPS_NEW("videofilter_size","video/x-raw-yuv",
- "width", GST_PROPS_INT_RANGE (0, G_MAXINT),
- "height", GST_PROPS_INT_RANGE (0, G_MAXINT),
- "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT));
-
- caps = gst_caps_intersect(capslist, sizecaps);
- gst_caps_unref (sizecaps);
+ capslist = gst_videofilter_caps_add_variable_part (capslist);
- return caps;
+ return capslist;
}
static GstPadLinkReturn
srccaps = gst_caps_copy(gst_pad_get_caps(videofilter->srcpad));
if(!GST_CAPS_IS_FIXED(srccaps)){
+ gst_caps_unref (srccaps);
return;
}
GstCaps *caps;
GstElementClass *element_class = GST_ELEMENT_CLASS (videofilter_class);
- caps = GST_CAPS_NEW("src","video/x-raw-yuv",
- "width", GST_PROPS_INT_RANGE (0, G_MAXINT),
- "height", GST_PROPS_INT_RANGE (0, G_MAXINT),
- "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT));
-
+ caps = gst_videofilter_class_get_capslist (videofilter_class);
+ caps = gst_videofilter_caps_add_variable_part (caps);
+
gst_element_class_add_pad_template (element_class,
- GST_PAD_TEMPLATE_NEW("src", GST_PAD_SRC, GST_PAD_ALWAYS,
- gst_caps_intersect(caps,
- gst_videofilter_class_get_capslist (videofilter_class))));
+ GST_PAD_TEMPLATE_NEW("src", GST_PAD_SRC, GST_PAD_ALWAYS, gst_caps_copy (caps)));
gst_element_class_add_pad_template (element_class,
- GST_PAD_TEMPLATE_NEW("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
- gst_caps_intersect(caps,
- gst_videofilter_class_get_capslist (videofilter_class))));
+ GST_PAD_TEMPLATE_NEW("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps));
}
static gboolean