本文主要分析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 {