Gstreamer appsink 缓冲区无法写入

时间:2021-06-10 02:22:47

标签: c++ gstreamer gstreamer-1.0

我正在用 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 标志)
当缓冲区可写但内存不可写时,将自动创建并返回可写副本。缓冲存储器的只读副本也将被这个可写副本替换。

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

0 个答案:

没有答案