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函数中实现的(当然这

static GstFlowReturn gst_qt_mux_send_moov (GstQTMux * qtmux, guint64 * _offset, guint64 padded_moov_size, gboolean mind_fast, gboolean fsync_after) { guint64 offset = 0, size = 0; guint8 *data; GstBuffer *buf; GstFlowReturn ret = GST_FLOW_OK; GList *l; guint64 current_time = atoms_get_current_qt_time (); /* update modification times */ qtmux->moov->mvhd.time_info.modification_time = current_time; GST_OBJECT_LOCK (qtmux); for (l = GST_ELEMENT_CAST (qtmux)->sinkpads; l; l = l->next) { GstQTMuxPad *qtpad = (GstQTMuxPad *) l->data; qtpad->trak->mdia.mdhd.time_info.modification_time = current_time; qtpad->trak->tkhd.modification_time = current_time; /* ohos.ext.func.0018 * add additional features to set orientationHint in mp4 file. * { 0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000 } */ #ifdef OHOS_EXT_FUNC switch (qtmux->rotation) { case 90: qtpad->trak->tkhd.matrix[0] = 0; qtpad->trak->tkhd.matrix[1] = 1 << 16; qtpad->trak->tkhd.matrix[3] = 65535 << 16; qtpad->trak->tkhd.matrix[4] = 0; break; case 180: qtpad->trak->tkhd.matrix[0] = 65535 << 16; qtpad->trak->tkhd.matrix[4] = 65535 << 16; break; case 270: qtpad->trak->tkhd.matrix[0] = 0; qtpad->trak->tkhd.matrix[1] = 65535 << 16; qtpad->trak->tkhd.matrix[3] = 1 << 16; qtpad->trak->tkhd.matrix[4] = 0; break; default: break; } #endif } /* ohos.ext.func.0016 * add additional features to set geographic location information in mp4 file * the feature is default disable. */ #ifdef OHOS_EXT_FUNC if (qtmux->enable_geolocation) { qtmux->moov->udta.set_location = TRUE; qtmux->moov->udta.latitude = qtmux->latitudex10000; qtmux->moov->udta.longitude = qtmux->longitudex10000; } #endif GST_OBJECT_UNLOCK (qtmux); /* serialize moov */ offset = size = 0; data = NULL; GST_LOG_OBJECT (qtmux, "Copying movie header into buffer"); if (!atom_moov_copy_data (qtmux->moov, &data, &size, &offset)) goto serialize_error; qtmux->last_moov_size = offset; /* Check we have enough reserved space for this and a Free atom */ if (padded_moov_size > 0 && offset + 8 > padded_moov_size) goto too_small_reserved; buf = _gst_buffer_new_take_data (data, offset); GST_DEBUG_OBJECT (qtmux, "Pushing moov atoms"); /* If at EOS, this is the final moov, put in the streamheader * (apparently used by a flumotion util) */ if (qtmux->state == GST_QT_MUX_STATE_EOS) gst_qt_mux_set_header_on_caps (qtmux, buf); if (fsync_after) GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_SYNC_AFTER); ret = gst_qt_mux_send_buffer (qtmux, buf, _offset, mind_fast); /* Write out a free atom if needed */ if (ret == GST_FLOW_OK && offset < padded_moov_size) { GST_LOG_OBJECT (qtmux, "Writing out free atom of size %u", (guint32) (padded_moov_size - offset)); ret = gst_qt_mux_send_free_atom (qtmux, _offset, padded_moov_size - offset, fsync_after); } return ret; too_small_reserved: { GST_ELEMENT_ERROR (qtmux, STREAM, MUX, ("Not enough free reserved header space"), ("Needed %" G_GUINT64_FORMAT " bytes, reserved %" G_GUINT64_FORMAT, offset + 8, padded_moov_size)); return GST_FLOW_ERROR; } serialize_error: { g_free (data); return GST_FLOW_ERROR; } }分析下这段代码
最新发布
08-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值