GstMemory结构是GStreamer暴露出来的内存接口。有点类似基类,GstMemory真正的结构是GstMemorySystem,当然这也不是绝对的(请注意这句特殊的话)。
typedef struct
{
//由于是C的写法,在内存布局上mem在内存头部
//所以通过GstMemorySystem*强制转换为GstMemory* 是没有任何问题的
GstMemory mem;
gsize slice_size;
//这个地址指向的就是我们能操作的内存地址。
guint8 *data;
gpointer user_data; //指针为空
GDestroyNotify notify;
} GstMemorySystem;
假设GstMemorySystem 20个字节(我懒得计算,随便说一个)、GstMemory占8个字节(也是随便说的),如果我们需要申请100个字节的,GStreamer 就会产生120个字节,头20个字节存储GstMemorySystem,并且这20个字节的中的头8个字节存储的是GstMemory,data 指向的就是第21个字节(懂的就懂,不懂的我也就不解释了,想了解可以了私信我)。
如果写过网络通信的人应该对这种内存布局技巧就非常悉了。
GstMemory真正的结构是GstMemorySystem,当然这也不是绝对的(请注意这句特殊的话)。
现在来解释一下这句话,创建GstMemory官方Demo使用的代码如下:
mem = gst_allocator_alloc (NULL, 100, NULL);
注意第一个和第三参数,第一个参数表示的使用alloc的类型(通俗的将就是是用new还是用malloc),第三个参数表示alloc的参数,具体的内容可以查看官方文档和看代码。这里使用null就是表示会使用默认的alloc,而默认的alloc,真正产生的就是GstMemorySystem,如果我们自己写alloc,那就随意了,想怎么写就怎么写。
GstBuffer 这个东西有点意思,按照官方文档的说法,可以添加多个GstMemory,不过这里要注意了,确实可以添加多个GstMemory,添加没有问题,但是如果要使用这些内存的时候(调用gst_buffer_map),GstBuffer会重新申请一块更大的内存,把之前add的GstMemory全部copy过去,个人感觉由点坑。
本文探讨了GStreamer中的GstMemory结构,特别关注其内部的GstMemorySystem实现细节,包括内存布局技巧和GstBuffer中内存操作的特性。理解了如何动态分配和组织内存,有助于开发者高效利用GStreamer资源。
3035

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



