如何解决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_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 标志)
当缓冲区可写但内存不可写时,将自动创建并返回可写副本。缓冲存储器的只读副本也将被这个可写副本替换。
即使我需要一个无法写入的内存,它也会返回内存的副本,但是如果我打印地图数据的大小,它将为零,这意味着内存空白?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。