2

我正在写一个gstreamer源元素。为此,我研究了类似于我需要的 v4l2src 之类的资源。看完之后,我想知道里面的set_caps函数什么时候调用这个函数?我知道set_caps当上游元素执行 a时会调用它gst_pad_set_caps,但是谁会为没有 a 的源元素执行此调用sinkpad

我对此很感兴趣,因为在 v4l2src 中,宽度、高度和帧率等流参数都是从这个set_caps函数中获取的。所以我想知道这些值在哪里设置?

请尽快回复。

4

1 回答 1

4

首先,我假设您使用的是 gstreamer 0.10。gstreamer 0.10 不再开发,请考虑迁移到 1.0

好的,现在回答:大写字母与元素无关,大写字母被设置为衬垫。因此,对于源元素或任何元素都不会调用它。发生的事情是它被设置为一个元素的垫。具有 sinkpad(或多个)的元素将根据上游元素的缓冲区的媒体类型设置此上限。当缓冲区流过焊盘时,焊盘会检查缓冲帽,如果它是新的上限,则将其设置到焊盘。在这种情况下,将调用 pad 的 set_caps 回调。也可能发生元素在推送缓冲区之前在其焊盘上显式调用 gst_pad_set_caps 的情况,无论哪种方式都是正确的。

通常的方法是元素在其接收垫上接收一些上限(来自上游产生的媒体),然后他们对它们应该为下游生产的内容进行一些转换/决定,并将其放在其缓冲区或设置在其源垫上。当他们推动缓冲区时,此上限将设置在其源垫和下游元素的接收垫上。这样,每个元素上的每个焊盘都会调用其“set_caps”,元素知道它们正在处理的媒体类型,并决定生产什么以及如何配置自己。

源元素位于管道的顶部,它们在管道上注入数据并且没有接收垫。所以他们检查下游可以使用 get_caps 调用处理什么,他们可以决定在其启动时生成什么媒体(准备暂停状态更改)。当他们决定上限时,将在缓冲区/焊盘上设置上限并调用 set_caps(针对它们的源焊盘和下一个元素的接收焊盘)。

检查 v4l2src 及其基类 (basesrc) 以了解此“上限协商”是如何工作的。IIRC 它应该从一些“开始”函数回调中处理。请参阅https://developer.gnome.org/gstreamer-libs/0.10/GstBaseSrc.html以了解 BaseSrc 的工作原理,并参阅 gstreamer 手册(您的案例为 0.10)以阅读有关“上限协商”的信息。

于 2013-09-24T18:12:35.623 回答