此次所述有关pad功能。关于pad,前面已有简单介绍,pad功能是GStreamer的一个基本元素,由于框架会自动处理他们,所以大多数时候它们是不可见的。本次主要了解的是关于pad功能的检索。
基本概念
Pads
之前已经说过,pad相当于一个接口,允许信息通过或者离开一个元素。Pad的功能(Capabilities或者简写为Cap)指定哪种信息可以通过pad。例如“分辨率为320x200像素,每秒30帧的RGB视频”,或“每采样音频16位,每秒44100采样率的5.1声道”,甚至压缩格式如mp3或h264等。
Pad可以支持多种功能(如一个video sink可以支持不同类型的RGB或者YUV格式的视频),而且功能也可以指定范围(如一个audio sink可以支持每秒1-48000个采样的采样率)。但从pad到pad的实际信息必须仅有一个明确指定的类型。两个相连的pad通过一个协商过程达到一个共同的类型,从而使其pad功能变得固定(仅有一种类型,不包含范围)。
要让两个元素连接在一起,他们的能力必须有一个公共子集,否则不可能相互理解。这也是能力的主要目标。
应用程序开发人员通常会通过将元素连接到一起来构建管道(如果使用playbin之类的全部元素,则程度较低)。在这种情况下需要知道元素的Pad Caps,或者至少知道当GStreamer拒绝连接两个协商错误的元素时它们的Caps是什么。
Pad templates
Pad是从pad模板创建的,pad模板表示了pad可能具有的所有功能。模板可用于创建一些相似的pad,并且允许早期拒绝元素之间的连接:如果其pad模板的功能没有公共子集(相交为空),则无需进一步协商。
pad模板可视为协商过程第一步。随着过程的演变,实际的Pads被实例化并且其能力被提炼,直到它们被固定(或者协商失败)。
Capabilities examples
一个能力的例子如下:
如代码中所示,该pad是一个接收端(sink),且一直可用。它支持两种媒体,包括整数格式的原始音频(audio/x-raw):带符号的16位小端 1和无符号8位。 方括号表示一个范围:例如,通道数从1到2不等。
video/x-raw表示这个信号源输出原始视频。它支持多种尺寸和帧率,以及一组YUV格式(大括号列表表示)。所有这些格式都表示图像平面的不同的填充和下采样。
Last remarks
可以使用gst-inspect-1.0
工具了解所有GStreamer元素的Caps。
一些元素查询底层硬件支持的格式,并相应地提供他们的pad功能(通常进入READY或更高状态时在这样做)。 因此,显示的能力可能因平台而异,也可能从一次执行到下一次执行就变了(即使这种情况很少)。
本次将会实例化两个元素(这次通过其工厂函数),显示其pad模板,连接它们并设置管道播放。 在每次状态改变时,sink元素的Pad的功能会被显示,所以可以观察到协商如何进行直到Pad Caps固定。
Pad功能实例
一个普通的有关pad caps的例子如下:
所需要的库只有gstreamer-1.0
。
代码分析
print_field
, print_caps
和print_pad_templates
简单的以友好的格式显示了caps的结构,更多的GstCaps内部结构组织可以阅读GStreamer的关于Pad Caps的文档。
gst_element_get_static_pad
函数从给定的元素中检索命名的pad。这个pad是静态的,因为它总是存在于元素中。有关Pad可用性的更多信息,可以阅读有关Pads的GStreamer文档。
然后调用gst_pad_get_current_caps
来检索pad的当前caps,它可以是固定的或不固定的,具体取决于协商过程的状态。甚至可能不存在,这种情况下调用gst_pad_query_caps
来检索当前可接受的pad caps。当前可接受的caps将成为处于NULL状态的pad模板的caps,但可能会在以后的状态中更改,因为可能会查询实际的硬件功能。
然后将这些功能打印出来:
之前直接使用gst_element_factory_make
函数创建了元素,并跳过了关于工厂的讨论。GstElementFactory负责实例化由其工厂名称标识的特定类型的元素。
可以使用gst_element_factory_find
来创建一个类型为“videotestsrc”的工厂,然后通过gst_element_factory_create
使用它实例化多个“videotestsrc”元素。gst_element_factory_make
实际上是gst_element_factory_find
+gst_element_factory_create
的快捷方式。
Pad模板已经可以通过工厂来访问,所以一旦工厂被创建,它们就会被打印出来。
跳过管道的创建以及开始,转到State-Changed消息处理:
该段代码在每次Pipeline状态发生改变时简单的打印出当前的pad caps。可以在输出中看到初始caps(pad模板的caps)是如何逐步完善直至完全固定(包含无范围单一类型)。
- 1.对于整型/长整型等数据类型,小端与大端相反,按照从低地址到高地址的顺序存放数据的高位字节到低位字节。 ↩