Gstreamer- Caps

Caps

Caps是描述媒体类型的轻量可引用对象。它们由一组GstStructure和GstStructure的GstCapsFeatures集(可选)组成。

Caps在GstPadTemplates上被公开来描述一个给定的pad可以处理的所有可能的类型。它们还与element的描述一起存储在注册表中。

Caps 通过 CAPS 和 ACCEPT_CAPS 查询公开在element pad上。

该函数描述了pad可以处理或产生(协商)的可能类型。

存在各种方法来处理媒体类型,例如相减或相交。

操作

固定

如果 Caps 仅包含单个结构体(structure)并且该结构体(structure )是固定的,则它们是固定的。如果结构体中的所有字段(field)都不是非固定类型(例如范围值、列表值),则该结构体是固定的。

对于固定caps只保留第一个结构体,因为它们出现的顺序是为了表达它们的优先级。之后,通过element 或 pad实现将该结构体的每个未固定字段设置为对媒体格式最有意义的值,然后将剩余的每个未固定字段设置为该未固定字段值(field value)的子集的任意值。

EMPTY caps是固定caps,ANY caps不是。具有ANY caps features 的Caps不是固定的。

子集

一个caps“A”是caps“B”的子集,如果“A”中的每个结构体在“B”都存在一个结构体与之对应,它是“A”中结构体的超集。

结构体“a”是结构体“b”的子集,如果它具有相同的结构体名称、相同的caps features 并且“b”中的每个字段在“a”中不存在,或者“a”中字段的值是“b”中字段值的子集。 “a” 不能有不在 “b” 中的其他字段。存在于“b”中但不存在于“a”(又名,空字段)中的字段始终是子集。这与直观的数学定义不同,因为空字段被定义为包含所有可能的值。这意味着空字段始终是任何其他字段的超集。

EMPTY caps是所有其他caps的子集。每个caps都是 ANY caps的一个子集。

相等性

如果“A”是“B”的子集且“B”是“A”的子集,则caps“A”和“B”相等。这意味着两个caps都表达了相同的可能性,但如果它们包含未固定的字段,它们的结构体仍然可能不同。

交集

caps“A”和caps“B”的交集是包含它们所有结构体交集的caps。

如果结构体名称或caps features 不相等,或者如果“a”和“b”包含相同字段但两个字段值的交集为空,则结构体“a”和结构体“b”的交集为空。如果一个结构体包含一个不存在于另一个结构体中的字段,它将被复制到具有相同值的交集。

与 ANY caps 的交集始终是其他 caps,与 EMPTY caps的交集始终是 EMPTY。

并集

caps“A”和caps“B”的并集是包含它们彼此之间所有结构体的并集。

如果结构体名称或 caps features不相等,则结构体“a”和结构体“b”的并集是两个结构体“a”和“b”。否则,并集是包含每个字段值并集的结构体。如果字段仅在两个结构体之一中,则它不包含在并集中。

带有 ANY caps的并集始终是 ANY,带有 EMPTY caps的并集始终是其他caps。

差集

caps“B”中caps“A”是​​“B”的最通用子集,它与“A”有一个空的交集,但只包含具有“B”中存在的名称和caps的结构体。

基本规则

caps的语义及其用法

一个caps可以包含多个结构体,在这种情况下,任何结构体都是可以接受的。结构体按照caps创建者的首选顺序排列,首选结构体在前,在caps协商期间,应考虑此顺序以选择最佳结构体。

这些结构体中的每一个都有一个指定媒体类型的名称,例如"video/x-theora" 指定 Theora 视频。结构体中的其他字段添加了有关媒体类型的其他约束和/或信息,例如视频帧的宽度和高度,或使用的编解码器配置文件。对于非固定(non-fixed )caps,这些字段可以是非固定(non-fixed)的(例如范围值),但在协商期间必须固定为固定值。如果字段包含在通过 CAPS 查询由 pad 返回的 caps 中,它会在协商期间施加额外的约束。最后的caps必须具有该字段的值,该值是非固定值的子集。在协商caps中添加的附加字段提供有关媒体的附加信息,但被视为可选。可以为每个缓冲区更改且在协商期间不相关的信息不得存储在caps内。

对于 caps 中的每个结构体,都可以存储 caps features。 caps features表示对特定结构体的附加要求,只有具有相同名称和相同 caps features的结构体才被认为是兼容的。 Caps features可用于要求在缓冲区上设置特定的内存表示或特定的元数据,例如,pad 可能需要特定结构体,将 EGLImage 内存或缓冲区与视频元数据一起传递。如果没有为结构体提供caps features,则假定需要使用系统内存,除非稍后的协商步骤(例如 ALLOCATION 查询)检测到可以使用其他东西。特殊的 ANY caps features 可用于指定任何caps features 都将被接受,例如,如果缓冲区内存完全没有被触及。

caps的兼容性

当两个pad的caps兼容时,可以链接pad。当它们的交集不为空时就是这种情况。

为了检查pad是否真的支持固定caps,一个交集是不够的。 相反,固定caps必须至少是 pad caps的一个子集,但 pad 可以引入额外的约束,这些约束将在 ACCEPT_CAPS 查询处理程序中检查。

数据流只能在 pads 决定了通用的固定caps后发生。 这些caps通过 CAPS 事件分配到两个pad。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值