gstBuffer的 data 和 meta

本文主要分析gsbuffer的创建,memory,meta的分配。

一 分析gstBuffer

gstBuffer

typedef struct _GstBuffer GstBuffer;

struct _GstBuffer {

  GstMiniObject          mini_object;

  /* timestamp */

  GstClockTime           pts;    //时间戳

  GstClockTime           dts;

.....

};

typedef struct

{

  GstBuffer buffer;

  gsize slice_size;

  /* the memory blocks */

  guint len;  //mem的当前的个数

  GstMemory *mem[GST_BUFFER_MEM_MAX];   //存储数据,GST_BUFFER_MEM_MAX为16

  /* memory of the buffer when allocated from 1 chunk */

  GstMemory *bufmem;

  /* FIXME, make metadata allocation more efficient by using part of the

   * GstBufferImpl */

  GstMetaItem *item;           //头指针

  GstMetaItem *tail_item;    //尾指针

} GstBufferImpl;

可以看到GstBuffer包含时间戳等成员。GstBufferImpl继承自GstBuffer,包含GstMemory, GstMetaItem等成员,GstMemory用来装数据,GstMeta用来装meta数据,GstMetaItem是个链表,可以为GstBuffer添加,删除GstMeta。

这里有一些操作的宏:

#define GST_BUFFER_SLICE_SIZE(b)   (((GstBufferImpl *)(b))->slice_size)

#define GST_BUFFER_MEM_LEN(b)      (((GstBufferImpl *)(b))->len)

#define GST_BUFFER_MEM_ARRAY(b)    (((GstBufferImpl *)(b))->mem)

#define GST_BUFFER_MEM_PTR(b,i)    (((GstBufferImpl *)(b))->mem[i])

#define GST_BUFFER_BUFMEM(b)       (((GstBufferImpl *)(b))->bufmem)

#define GST_BUFFER_META(b)         (((GstBufferImpl *)(b))->item)

#define GST_BUFFER_TAIL_META(b)    (((GstBufferImpl *)(b))->tail_item)

gst_buffer_new

GstBuffer *   gst_buffer_new (void)

{

  GstBufferImpl *newbuf;

  newbuf = g_slice_new (GstBufferImpl);

  GST_CAT_LOG (GST_CAT_BUFFER, "new %p", newbuf);

  gst_buffer_init (newbuf, sizeof (GstBufferImpl));

  return GST_BUFFER_CAST (newbuf);

}

如上函数,可以看到创建一个GstBuffer,就是创建一个GstBufferImpl。

gst_buffer_new_allocate{

  GstBuffer *newbuf;

  GstMemory *mem;

    mem = gst_allocator_alloc (allocator, size, params);

  newbuf = gst_buffer_new ();

    _memory_add (newbuf, -1, mem); //-1表示加到数组的最后一个空位。

  return newbuf;

}

在gst_buffer_new_allocate里,可以看到先创建GstBuffer,再创建GstMemory,再将GstMemory添加到GstBuffer。

GstMeta

定义在gstmeta.h

typedef struct _GstMeta GstMeta;
struct _GstMeta {
  GstMetaFlags       flags;
  const GstMetaInfo *info;
};

GstMetaItem定义在gst_private.h

typedef struct _GstMetaItem GstMetaItem;

struct _GstMetaItem {

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山西茄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值