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