GstBuffer中data实际的存储地址

GstBuffer中data实际的存储地址

前段时间刚开始学Gstreamer,还没学多少就要干活了,最近想用gdb查看GstBuffer的data地址是总很麻烦,要先用gst_buffer_map先获得data,所以就深入的了解了一下GstBuffer中data所存放的地方。下面就和大家分享一下吧!

通常我们需要获取GstBuffer的data数据是通过接口gst_buffer_map得到的,进入gst_buffer_map接口的具体实现,我们可以发现,Gstreamer通过_get_merged_memory函数得到GstBuffer所对应的GstMemory,再深入后,我们可以发现GstBuffer只是暴露给我们用户的信息(通过GstBuffer是找不到我们想要的data的),真正的信息是存储在GstBufferImpl这个结构体中的,此结构体第一个成员即GstBuffer,而后会包含一个GstMemory指针数组(大小为16),我们想要的data就存储在这里面(通常我们只用到了mem[0])。

_get_merged_memory函数是根据你传的flag(即GST_MAP_READ或GST_MAP_WIRTE)来判断是否要拷贝一份数据。如果你去GstMemory中查找我们想要的data,还是找不到,先别急。Gstreamer会用gst_memory_map来得到对应的data,而进入此函数,我们会发现Gstreamer会用到GstMemory中的allocator成员的mem_map函数来获得data。如果你不深入到Gstreamer框架是比较难找到这个mem_map函数指针的定义的。

不过,没事,你有我,这部分工作我帮你做吧!在Gstreamer中,我们发现其实GstMemory和GstBuffer一样,只暴露了一部分的信息,具体的信息是存储在GstMemorySystem这个结构体里。而GstMemory所对应的GstAllocator中的函数指针是在gst_allocator_sysmem_init函数中实现的(当然这个函数是可以覆盖的,如gst_xvimage_allocator_init中就覆写了),其中mem_map函数指针指针向的是_sysmem_map函数,在此函数中,我们要以看到,我们最终获取的信息是GstMemorySystem结构体中的data。

通过上面的分析,你应该清楚了Gstreamer是如何获得GstBuffer的data的了吧。所以,在用gdb调试的时候,假如我们想要打印buffer的data地址,可以这样:

p ((GstMemorySystem *)((GstBufferImpl *)buffer)->mem[0])->data

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值