合并多个分支(队列)时,GStreamer如何管理线程

时间:2019-04-08 12:35:34

标签: gstreamer gstreamer-1.0

我有一个GStreamer管道,它记录了三个实时摄像机,并且基本上执行以下操作:在第一个线程中捕获3个cam;然后在3个独立的线程中对3个流进行一些处理;并行地在其他3个线程中重新缩放合成器(适用于实时信号源的视频混合器)的帧;最后做作文。每个摄像机的计划如下(因此x3):

[capture] -> TEE |-> QUEUE -> [someProcessing] -> _
                 |-> QUEUE -> [rescale]        -> COMPOSITOR
gst-launch-1.0 \
${capture0} ! tee name='t0' ! queue ! ${someProcessing0} \
${capture1} ! tee name='t1' ! queue ! ${someProcessing1} \
${capture2} ! tee name='t2' ! queue ! ${someProcessing2} \
${someStuff} \
compositor name=compo ${compositorSinkProperties} \
t0. ! queue ! ${rescale0} ! compo.sink_0 \
t1. ! queue ! ${rescale1} ! compo.sink_1 \
t2. ! queue ! ${rescale2} ! compo.sink_2 \
-e 

我的管道运行良好,我只需要澄清它的内部行为:

我知道如何通过元素 queue 强制使用单独的线程。但是,我不知道将3个[重新缩放]分支合并到单个元素(例如我的 compo )中时会发生什么情况。

GStreamer是否按照要求创建3个线程?
如果是,那么合成器在哪个线程中运行?
如果没有,整个 rescaling + compositing 过程中我只有1个线程吗?

感谢您分享的任何信息!
问候

1 个答案:

答案 0 :(得分:0)

据我所知您是正确的。您将拥有下游所有队列路径的线程。我认为聚合器也有自己的线程。我缺乏证据-也许您可以在GstAggregator类中发现它。

但是一旦聚合器上的所有接收盘都具有数据,它的aggregate函数就会触发。

来自基类文档here

aggregate ()

Mandatory. Called when buffers are queued on all sinkpads. Classes should
iterate the GstElement->sinkpads and peek or steal buffers from the
GstAggregatorPads. If the subclass returns GST_FLOW_EOS, sending of the
eos event will be taken care of. Once / if a buffer has been constructed
from the aggregated buffers, the subclass should call _finish_buffer.