GStreamer 内存学习笔记

本文探讨了GStreamer中的GstMemory结构,特别关注其内部的GstMemorySystem实现细节,包括内存布局技巧和GstBuffer中内存操作的特性。理解了如何动态分配和组织内存,有助于开发者高效利用GStreamer资源。

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过去,个人感觉由点坑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值