A _query ()
-function with the GST_QUERY_CAPS query
type is called when a peer element would like to know which formats
this pad supports, and in what order of preference. The return value
should be all formats that this elements supports, taking into account
limitations of peer elements further downstream or upstream, sorted by
order of preference, highest preference first.
static gboolean gst_my_filter_query (GstPad *pad, GstObject * parent, GstQuery * query) { gboolean ret; GstMyFilter *filter = GST_MY_FILTER (parent); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CAPS { GstPad *otherpad; GstCaps *temp, *caps, *filt, *tcaps; gint i; otherpad = (pad == filter->srcpad) ? filter->sinkpad : filter->srcpad; caps = gst_pad_get_allowed_caps (otherpad); gst_query_parse_caps (query, &filt); /* We support *any* samplerate, indifferent from the samplerate * supported by the linked elements on both sides. */ for (i = 0; i < gst_caps_get_size (caps); i++) { GstStructure *structure = gst_caps_get_structure (caps, i); gst_structure_remove_field (structure, "rate"); } /* make sure we only return results that intersect our * padtemplate */ tcaps = gst_pad_get_pad_template_caps (pad); if (tcaps) { temp = gst_caps_intersect (caps, tcaps); gst_caps_unref (caps); gst_caps_unref (tcaps); caps = temp; } /* filter against the query filter when needed */ if (filt) { temp = gst_caps_intersect (caps, filt); gst_caps_unref (caps); caps = temp; } gst_query_set_caps_result (query, caps); gst_caps_unref (caps); ret = TRUE; break; } default: ret = gst_pad_query_default (pad, parent, query); break; } return ret; }