GstBuffer 中 data 实际的存储地址

本文详细解析了Gstreamer框架中如何获取GstBuffer的数据地址,包括使用gst_buffer_map接口的过程,以及深入GstMemory和GstBufferImpl结构体内部,最终找到data数据的具体位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

通常我们需要获取 GstBufferdata 数据是通过接口 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_READGST_MAP_WIRTE )来判断是否要拷贝一份数据。如果你去 GstMemory 中查找我们想要的 data,还是找不到,先别急。Gstreamer 会用 gst_memory_map 来得到对应的 data,而进入此函数,我们会发现 Gstreame r会用到 GstMemory 中的 allocator 成员的 mem_map 函数来获得 data。如果你不深入到 Gstreamer 框架是比较难找到这个 mem_map 函数指针的定义的。

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

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

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

————————————————
版权声明:本文为优快云博主「Min0401」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/hwmstudent/article/details/69946552

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值