Gstreamer appsink 缓冲区无法写入

问题描述

我正在用 gstreamer 开发一个应用程序。基本上,它的管道如下:
rtspsrc ! rtph264depay ! h264parse ! qtivdec ! appsink
其中 qtivdec 是硬件解码器,使用 ion 缓冲区或 gbm 缓冲区,现在不确定。 我使用完整的回调初始化 appsink 插件

GstAppSinkCallbacks callbacks = { onEOS,onpreroll,onBuffer };
gst_app_sink_set_callbacks ( GST_APP_SINK ( m_pSink ),&callbacks,reinterpret_cast<void*> ( this ),NULL );

据我所知,它会被绑定到 new_sample 函数onBuffer() 信号唤起。
onBuffer() 中,我想获取缓冲区并且它包含在 GstSample 中,因此我使用以下 api 来访问它:

GstSample *sample = gst_base_sink_get_last_sample ( GST_BASE_SINK ( appsink ) );
GstBuffer *buffer = gst_sample_get_buffer ( sample );

据我所知,GstBuffer 结构体没有指向 gstreamer 内存,所以通常我们使用 gst_buffer_mapGstBuffer 的信息填充到 {{1}并用缓冲区中所有合并的内存块填充它。

过去我们很少在appsink的回调中考虑GstMapInfo的标志,通常用gst_buffer_map设置它,因为我们总是用GST_MAP_READ进行内存复制以备下一个任务。现在我们想剪掉这个memcpy来优化我们的程序,因为我们需要修改map.data的数据,我们尝试设置标志GstBuffer

GST_MAP_WRITE

但我们得到的日志如下:

GstMapInfo map;
gst_buffer_map ( buffer,&map,GST_MAP_WRITE );

说缓冲区不可写,是不是 (drawRectOnNV12:30305): GStreamer-CRITICAL **: 02:32:35.449: write map requested on non-writable buffer 有问题,还是由 appsink 引起的?

顺便说一句,根据gstreamer wiki,这很奇怪:

布尔值 gst_buffer_map (GstBuffer * buffer,GstMapInfo * 信息, GstMapFlags 标志)
当缓冲区可写但内存不可写时,将自动创建并返回可写副本。缓冲存储器的只读副本也将被这个可写副本替换。

即使我需要一个无法写入的内存,它也会返回内存的副本,但是如果我打印地图数据的大小,它将为零,这意味着内存空白?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)