我正在编写一个 gstreamer
源元素。为此,我研究了像 v4l2src 这样的资源,它们与我需要的类似。看完之后,我想知道其中的 set_caps
函数,这个函数什么时候被调用?我知道当上游元素执行 gst_pad_set_caps
时,set_caps
就会被调用,但是谁会对没有 sinkpad
的源元素执行此调用>。
我对此很感兴趣,因为在 v4l2src 中,宽度、高度和帧速率等流参数是从此 set_caps
函数获取的。所以我想知道这些值是在哪里设置的?
请尽快回复。
最佳答案
首先,我假设您使用的是 gstreamer 0.10。 gstreamer 0.10 不再开发,请考虑迁移到 1.0
好的,现在回答一下:大写字母与元素无关,大写字母设置在焊盘中。因此,源元素或任何元素都不会调用它。发生的情况是它被设置为元素的垫。具有接收器(或多个)的元素将从上游元素的缓冲区的媒体类型设置此上限。当缓冲区流经焊盘时,焊盘会检查缓冲区帽,如果是新帽,则将其设置到焊盘。在这种情况下,将调用 pad 的 set_caps 回调。也可能发生元素在推送缓冲区之前在其焊盘上显式调用 gst_pad_set_caps 的情况,无论哪种方式都是正确的。
通常的方法是,元素在其接收垫上接收一些上限(来自上游产生的媒体),然后它们对应该为下游产生什么进行一些转换/决定,并将其放在其缓冲区上或设置在其上源焊盘。当他们推送缓冲区时,该上限将设置在其源焊盘和下游元件的接收焊盘上。这样,每个元素上的每个 pad 都会调用其“set_caps”,并且元素知道它们正在处理的媒体类型,并决定生成什么以及如何配置自身。
源元素位于管道的顶部,它们在管道上注入(inject)数据并且没有接收器垫。因此,他们使用 get_caps 调用检查下游可以处理哪些内容,并且可以决定在启动时生成哪些媒体(准备暂停状态更改)。当他们决定上限时,上限将设置在缓冲区/焊盘上,并调用 set_caps(针对其源焊盘和下一个元素的接收焊盘)。
检查 v4l2src 及其基类 (basesrc) 以了解此“上限协商”的工作原理。 IIRC 它应该从一些“开始”函数回调中处理。引用https://developer.gnome.org/gstreamer-libs/0.10/GstBaseSrc.html 用于了解 BaseSrc 的工作原理,以及 gstreamer 手册(适合您的情况为 0.10)用于阅读“上限协商”。
关于linux - 何时调用源元素的 set_caps ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18972921/