插件开发内存管理
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

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

被折叠的 条评论
为什么被折叠?



