我正在尝试开发自己的自定义插件,其中包含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处理缓冲区后我该怎么做才能不会一次又一次地处理同一个缓冲区?
答案 0 :(得分:1)
好吧也许更简单的回答:
gst_collect_pads_pop()而不是gst_collect_pads_peek()?
请务必检查是否为空。
答案 1 :(得分:0)
事实证明,这正是我在开始时所怀疑的,而不是处理EOS事件。 为了解决我的问题,我必须实现gst_collect_pads_event函数, 虽然在GstCollectPads参考页面中没有关于此的单词,但它很奇怪。
(问题解决了)