英文原文:https://gstreamer.freedesktop.org/documentation/plugin-development/basics/queryfn.html
通过query函数,你的element将收到必须被回复的queries。这些queries是一些如播放位置、持续时间等,但是也包含所支持的格式和你的element所支持的时间安排模式。queries能向上游传送,也能够向下游传送,所以你能够在sink pads和source pads中接收到它们。
下面是一个非常简单的query函数,我们可以在我们element中的source pad上安装它:
static gboolean gst_my_filter_src_query (GstPad *pad,
GstObject *parent,
GstQuery *query);
[..]
static void
gst_my_filter_init (GstMyFilter * filter)
{
[..]
/* configure event function on the pad before adding
* the pad to the element */
gst_pad_set_query_function (filter->srcpad,
gst_my_filter_src_query);
[..]
}
static gboolean
gst_my_filter_src_query (GstPad *pad,
GstObject *parent,
GstQuery *query)
{
gboolean ret;
GstMyFilter *filter = GST_MY_FILTER (parent);
switch (GST_QUERY_TYPE (query)) {
case GST_QUERY_POSITION:
/* we should report the current position */
[...]
break;
case GST_QUERY_DURATION:
/* we should report the duration here */
[...]
break;
case GST_QUERY_CAPS:
/* we should report the supported caps here */
[...]
break;
default:
/* just call the default handler */
ret = gst_pad_query_default (pad, parent, query);
break;
}
return ret;
}
对于未知的queries,调用默认的query函数
gst_pad_query_default()是一个不错的主意。根据query的类型,默认的处理函数将向前传送query或简单的unref它。