Gstreamer 内存管理

本文详细介绍了GStreamer插件的内存管理机制,包括GstMemory对象的创建、访问和拷贝,GstBuffer的使用,以及GstMeta的附加信息。GstMemory是内存访问的基础,GstBuffer用于数据交换,而GstMeta提供额外的元数据。GstBufferPool用于高效管理相同大小的缓冲区。此外,还探讨了如何自定义GstAllocator和实现内存分配器。

插件开发内存管理
Gstmemory 设计文档
Gstmemory API参考

本文讨论GStreamer插件的内存管理。包括

  • GstMemory,对内存访问的底层对象;
  • GstBuffer,它用于在插件之间和应用程序之间交换数据。
  • GstMeta。这个对象可以被放置在GstBuffer中,提供关联内存的额外信息。
  • GstBufferPool,它可以用来更有效地批量管理具有相同大小的缓冲区。
  • GstAllocator 内存分配器和自定义的实现.

1. Gstmemory

GstMemory一般是通过gst_allocator_alloc创建的一个管理内存区域的对象。这个内存对象指向一个“maxsize”大小的内存区域。该内存中可访问的区域是从“offset”和到“size”字节之间的部分。

struct _GstMemory {
   
   
  GstMiniObject   mini_object;
  GstAllocator   *allocator;

  GstMemory      *parent;
  gsize           maxsize;
  gsize           align;
  gsize           offset;
  gsize           size;
};

在创建GstMemory之后,它的maxsize不能在整个生命周期内都不能被更改,但是它的“偏移量”和“大小”可以被更改。
可以使用gsize gst_memory_get_sizes (GstMemory *mem, gsize *offset, gsize *maxsize)来获取属性。可以通过gst_memory_resize 改变其大小。
访问数据需要通过map和unmap函数来进行。
gst_memory_copy拷贝一般是相同的allocator按照自定义的方式创建一个相同类型的memory,然后复制可见的数据部分。
gst_memory_share是直接共享该内存对象,不执行内存复制,只共享内存区域。
可以使用gst_memory_new_wrapped来封装已经存在的一段内存。

[...]
  GstMemory *mem;
  GstMapInfo info;
  gint i;
  /* allocate 100 bytes */
  mem = gst_allocator_alloc (NULL, 100, NULL);
  /* get access to the memory in write mode */
  gst_memory_map (mem, &info, GST_MAP_WRITE);
  /* fill with pattern */
  for (i = 0; i < info.size; i++)
    info.data[i] = i;
  /* release memory */
  gst_memory_unmap (mem, &info);
[...]

2. GstBuffer

https://gstreamer.freedesktop.org/documentation/gstreamer/gstbuffer.html?gi-language=c
https://gstreamer.freedesktop.org/documentation/additional/design/buffer.html?gi-language=c
GstBuffer 用来在Gstreamer pipeline上下游元件相互传递数据。因此它包含两个部分:GstMemory ,以及metadata(GstMemory 对应的描述信息)。

struct _GstBuffer 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值