前段时间刚开始学 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
,而进入此函数,我们会发现 Gstreame r会用到 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
————————————————
版权声明:本文为优快云博主「Min0401」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/hwmstudent/article/details/69946552