1 GstCpas基本概念

  • Caps(capabilities)是描述媒体类型的轻量级引用计数对象。它们由一系列 GstStructure 组成。

  • Caps 在 GstPadTemplate 上公开,用于描述给定 pad 可以处理的所有可能类型。它们也存储在 GstRegistry 中,连同 GstElement 的描述一起。

  • Caps 通过element pads 上的 gst_pad_query_caps 函数公开。这个函数描述了 pad 在运行时可以处理或产生的可能类型。

    可以使用以下代码片段构建 GstCaps:

    GstCaps *caps = gst_caps_new_simple ("video/x-raw",
      "format", G_TYPE_STRING, "I420",
      "framerate", GST_TYPE_FRACTION, 25, 1,
      "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
      "width", G_TYPE_INT, 320,
      "height", G_TYPE_INT, 240,
      NULL);
    
  • 当 GstCaps 没有范围或列表的字段时,它是固定的。使用 gst_caps_is_fixed 来测试固定 caps。固定 caps 可以在 caps 事件中使用,以通知下游元素当前的媒体类型。

  • 存在各种方法来处理媒体类型,例如减去subtracting或交叉intersecting。

    alt text

1.1 GstCaps数据存储结构

alt text

2 GstCpas对象相关函数

2.1 GstCpas对象创建

/**
 * @param static_caps: #GstStaticCaps
 * @brief: 该函数将 #GstStaticCaps 转换为 #GstCaps
 * @return: 函数返回一个指向 GstCaps 的指针。
 * @note: 由于核心(GStreamer框架)使用了GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED标记,所以该GstCaps不可写,因此若需修改它,请使用 gst_caps_make_writable() 函数。
*/
GstCaps *
gst_static_caps_get (GstStaticCaps * static_caps);

/**
 * @brief: 从@string创建@caps
 * @note: 该@caps可写
*/
GstCaps *
gst_caps_from_string (const gchar * string);

2.2 GstCaps获取元素长度

/**
 * @brief: 其实也就是GstSructure的数量,因为使用的是GstSructure存储。
*/
guint
gst_caps_get_size (const GstCaps * caps);

2.3 GstCaps附加

/**
 * @brief: @caps2附加到@caps1中,如果caps2的长度是2,原先caps1长度是1
 *         合并后caps1中的长度 2 + 1 = 3
*/
void
gst_caps_append (GstCaps * caps1, GstCaps * caps2);

2.4 GstCaps

/**
 * @brief: 遍历GstCaps中的每个元素
*/
gboolean
gst_caps_foreach (const GstCaps * caps, 
                  GstCapsForeachFunc func,
                  gpointer user_data);