通俗化理解gstreamer的调度模式
gstreamer的官方文档里,调度的英文是schedule. 什么是schedule? 它的英文解释为" to plan that something will happen at a particular time “.在gstreamer里,调度的意义跟它基本差不多。在gstreamer里,调度的目的主要有以下几个:
(1)在适当的时候通知每个元件去完成相应的任务,确保这些职责的执行。这个任务,就是数据处理。
(2)每个元件都从它的上一个源元件获取数据,并为下一个元件准备好数据。即获取输入数据,处理数据,最后输出数据给下一个元件。
在
在上图的激活函数里,会去激活demuxer 的sink pad, 它是通过遍历所有的sink pads,调用activate_pads来激活pad的。如下图所示:
在gst_pad_set_actie函数里,最后会调用(GST_PAD_ACTIVATEFUNC(pad)) (pad); 被调用这个宏函数由于在demuxer元件里设置了函数指针gst_pad_set_activate_function (avi->sinkpad, gst_xx_demux_sink_activate),于是其实对于demuxer组件来说,执行的是gst_xx_demux_sink_activate函数。
通常,这个函数会调用gst_pad_check_pull_range,并根据前面图中的element2的pad(称之为peer pad)是否实现了XX_pull_range函数,来判断demuxer 元件的sink pad应该激活在pull模式还是push模式。我们这里讨论激活在pull模式的情况。
当激活在pull模式下,我们会给demux起一个task, task函数为gst_xx_demux_loop函数。gst_avi_demux_loop函数会从peer pad 拉拽数据。拉拽完数据后,通常会把数据push 到下一个元件的sink pad.
4.调度模式是如何动态决定的
这个问题的答案可以在上面第3节找到找到。这里总结下:当一个pad被激活时,gst_element_pad_activate()函数被调用. 这个pad随后可以根据上游的能力(upstream capabilities,实际上为是否实现了XX_pull_range)来决定激活在push模式还是pull模式。如果一个pad没有activate函数,gstreamer core将默认为它激活在push模式。
5.getrange函数
当gst_pad_check_pull_range调用时,peer pad的getrange函数被调用。事实上,前面说过,一个上游pad只有实现了getrange函数,才能被下游的pad以pull的模式调用它从而拉拽数据。下游pad对getrange函数的调用,是通过以宏的形式---GST_PAD_GETRANGEFUNC (pad)来传递的。而该宏的赋值,是上游的可以支持pull模式的元件在初始化的时候,调用gst_pad_set_getrange_function 设置的。
6.chain函数(链条函数)
当上游元件的pad调用gst_pad_push函数时,下游元件pad的chain函数被调用。