linux - 何时调用源元素的 set_caps ?

标签 linux fedora gstreamer

我正在编写一个 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/

相关文章:

linux - 通过 Gmail SMTP 中继发送邮件

c++ - 如何在 fork 的帮助下并行搜索文件中的字符串? (GNU Linux/g++)

linux - 基于两个共同列连接两个文件

linux - 将 bash 脚本中的时间与 ± x 分钟进行比较

networking - 在有损网络上流式传输视频

fedora - Kubernetes 依赖 kubelet 和 master 进程

debugging - 如何修改 Fedora 软件包并修复错误

ant - "fork: Resource temporarily unavailable"是什么原因

ios - 通过GStreamer将文件保存到iOS目录中

windows - gst-inspect 未找到 xvimagesink