我正在用 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_map
将 GstBuffer
的信息填充到 {{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 标志)
当缓冲区可写但内存不可写时,将自动创建并返回可写副本。缓冲存储器的只读副本也将被这个可写副本替换。
即使我需要一个无法写入的内存,它也会返回内存的副本,但是如果我打印地图数据的大小,它将为零,这意味着内存空白?