我正在撰写gstreamer
源元素。为此,我研究了类似于我需要的v4l2src等源代码。经过这个,我想知道它的set_caps
函数是什么时候调用这个函数的?我知道当上游元素执行set_caps
时会调用gst_pad_set_caps
,但是谁会调用没有sinkpad
的源元素。
我对此感兴趣,因为在v4l2src中,从set_caps
函数中获取宽度,高度和帧速率等流参数。所以我想知道这些值在哪里设置?
请尽快回复。
答案 0 :(得分:4)
首先,我假设你正在使用gstreamer 0.10。 gstreamer 0.10不再开发,请考虑转移到1.0
好的,现在回答:大写字母与元素没有关联,大写字母被设置为填充。因此,不会要求源元素或任何元素。会发生什么是它被设置为元素的填充。具有sinkpad(或多个)的元素将从上游元素的缓冲区的媒体类型设置此上限。当缓冲区流过焊盘时,焊盘会检查缓冲区大写并将其设置为焊盘(如果它是新的大写字母)。在这种情况下,调用pad的set_caps回调。在推送缓冲区之前,元素显然会在其焊盘上显式调用gst_pad_set_caps,这两种方式都是正确的。
通常的方法是元素在其接收器上接收一些上限(来自上游产生的介质),然后他们对下游产生的内容进行一些转换/决定,并将其放在缓冲区或设置在其上源垫。当他们推动缓冲器时,这个帽子将被设置在其源垫和下游元件的接收垫上。这样,每个元素上的每个pad都会调用它的'set_caps',并且元素知道它们正在处理的媒体类型,并决定生成什么以及如何配置它们。
源元素位于管道的顶部,它们在管道上注入数据并且没有接收器垫。因此,他们使用get_caps调用检查下游可以处理的内容,并且可以决定在启动时生成哪些媒体(准备暂停状态更改)。当他们决定使用大写字母时,大写字母设置在缓冲区/焊盘上,并调用set_caps(用于其源焊盘和下一个元素的接收区)。
检查v4l2src及其基类(basesrc)以了解这种“限制协商”的工作原理。 IIRC应该从一些'start'函数回调中处理。请参阅https://developer.gnome.org/gstreamer-libs/0.10/GstBaseSrc.html了解BaseSrc的工作原理以及gstreamer手册(对于您的案例为0.10),以了解有关'大写谈判'的内容。