如何在gstreamer的自定义插件中处理EOS?

时间:2015-01-05 13:29:21

标签: plugins processing pipeline gstreamer

我正在尝试开发自己的自定义插件,其中包含N个请求接收器垫和M个有时src垫。水槽垫被添加到GstCollectPads对象。我设法制作了插件&运行时,它接收缓冲区并在gst_my_plugin_collected(GstCollectPads * pads)回调中以正确的方式处理它们,而不是将缓冲区推送到所选src pad的对等方。

这是我的* _collected(...)实现中的最后一行。

281     GSList *it = pads->data;
282     for( it; it != NULL; it=it->next ) {
283         cdata = (GstCollectData*)(it->data);
284         outbuf = gst_collect_pads_peek( pads, cdata );
295         gst_pad_push( elem->srcpads[i++], outbuf );               
298 } 
299 return GST_FLOW_OK;

示例管道: gst-ndl-launch filesrc location = in.log! myplugin! filesink location = out.log 在无限循环中运行处理,始终将in.log文件中的相同数据写入out.log文件,就像它不知道何时到达文件结尾一样。

我的猜测是,我不知何故需要告诉我的插件处理应该停止,也许是以某种方式发送EOS消息,但是我不知道该怎么做。因此我的问题是: 我应该在插件中做什么才能在文件结束时停止处理?

//更新: 看来我的管道只处理无限循环中的第一个缓冲区。 所以我之前关于发送EOS消息的想法是无效的,相反我必须以某种方式删除 处理缓冲区以便接收下一个缓冲区。仍然不知道如何做到这一点,所以任何帮助将不胜感激。

从GstCollectData处理缓冲区后我该怎么做才能不会一次又一次地处理同一个缓冲区?

2 个答案:

答案 0 :(得分:1)

好吧也许更简单的回答:

gst_collect_pads_pop()而不是gst_collect_pads_peek()?

请务必检查是否为空。

http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstCollectPads.html#gst-collect-pads-pop

答案 1 :(得分:0)

事实证明,这正是我在开始时所怀疑的,而不是处理EOS事件。 为了解决我的问题,我必须实现gst_collect_pads_event函数, 虽然在GstCollectPads参考页面中没有关于此的单词,但它很奇怪。

(问题解决了)