mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
plugins: add gst_vaapi_copy_va_buffer()
This helper function aims to copy buffers with VA memory to dumb buffers, when GstVideoMeta is not available dowstream. https://bugzilla.gnome.org/show_bug.cgi?id=785054
This commit is contained in:
parent
5842e9cf87
commit
2c36610748
2 changed files with 72 additions and 0 deletions
|
@ -34,6 +34,7 @@
|
||||||
# include <gst/gl/gl.h>
|
# include <gst/gl/gl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
GST_DEBUG_CATEGORY_STATIC (CAT_PERFORMANCE);
|
||||||
/* Default debug category is from the subclass */
|
/* Default debug category is from the subclass */
|
||||||
#define GST_CAT_DEFAULT (plugin->debug_category)
|
#define GST_CAT_DEFAULT (plugin->debug_category)
|
||||||
|
|
||||||
|
@ -1374,3 +1375,68 @@ gst_vaapi_plugin_base_set_srcpad_can_dmabuf (GstVaapiPluginBase * plugin,
|
||||||
"EGL_EXT_image_dma_buf_import"));
|
"EGL_EXT_image_dma_buf_import"));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_init_performance_debug (void)
|
||||||
|
{
|
||||||
|
#ifndef GST_DISABLE_GST_DEBUG
|
||||||
|
static volatile gsize _init = 0;
|
||||||
|
|
||||||
|
if (g_once_init_enter (&_init)) {
|
||||||
|
GST_DEBUG_CATEGORY_GET (CAT_PERFORMANCE, "GST_PERFORMANCE");
|
||||||
|
g_once_init_leave (&_init, 1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vaapi_plugin_copy_va_buffer:
|
||||||
|
* @plugin: a #GstVaapiPluginBase
|
||||||
|
* @inbuf: a #GstBuffer with VA memory type
|
||||||
|
* @outbuf: a #GstBuffer with system allocated memory
|
||||||
|
*
|
||||||
|
* Copy @inbuf to @outbuf. This if required when downstream doesn't
|
||||||
|
* support GstVideoMeta, and since VA memory may have custom strides a
|
||||||
|
* frame copy is required.
|
||||||
|
*
|
||||||
|
* Returns: %FALSE if the copy failed, otherwise %TRUE. Also returns
|
||||||
|
* %TRUE if it is not required to do the copy
|
||||||
|
**/
|
||||||
|
gboolean
|
||||||
|
gst_vaapi_plugin_copy_va_buffer (GstVaapiPluginBase * plugin,
|
||||||
|
GstBuffer * inbuf, GstBuffer * outbuf)
|
||||||
|
{
|
||||||
|
GstVideoMeta *vmeta;
|
||||||
|
GstVideoFrame src_frame, dst_frame;
|
||||||
|
gboolean success;
|
||||||
|
|
||||||
|
if (!plugin->copy_output_frame)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* inbuf shall have video meta */
|
||||||
|
vmeta = gst_buffer_get_video_meta (inbuf);
|
||||||
|
if (!vmeta)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
_init_performance_debug ();
|
||||||
|
GST_CAT_INFO (CAT_PERFORMANCE, "copying VA buffer to system memory buffer");
|
||||||
|
|
||||||
|
if (!gst_video_frame_map (&src_frame, &plugin->srcpad_info, inbuf,
|
||||||
|
GST_MAP_READ))
|
||||||
|
return FALSE;
|
||||||
|
if (!gst_video_frame_map (&dst_frame, &plugin->srcpad_info, outbuf,
|
||||||
|
GST_MAP_WRITE)) {
|
||||||
|
gst_video_frame_unmap (&src_frame);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
success = gst_video_frame_copy (&dst_frame, &src_frame);
|
||||||
|
gst_video_frame_unmap (&dst_frame);
|
||||||
|
gst_video_frame_unmap (&src_frame);
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
gst_buffer_copy_into (outbuf, inbuf, GST_BUFFER_COPY_TIMESTAMPS
|
||||||
|
| GST_BUFFER_COPY_FLAGS, 0, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
|
@ -258,6 +258,12 @@ void
|
||||||
gst_vaapi_plugin_base_set_srcpad_can_dmabuf (GstVaapiPluginBase * plugin,
|
gst_vaapi_plugin_base_set_srcpad_can_dmabuf (GstVaapiPluginBase * plugin,
|
||||||
GstObject * object);
|
GstObject * object);
|
||||||
|
|
||||||
|
G_GNUC_INTERNAL
|
||||||
|
gboolean
|
||||||
|
gst_vaapi_plugin_copy_va_buffer (GstVaapiPluginBase * plugin,
|
||||||
|
GstBuffer * inbuf, GstBuffer * outbuf);
|
||||||
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* GST_VAAPI_PLUGIN_BASE_H */
|
#endif /* GST_VAAPI_PLUGIN_BASE_H */
|
||||||
|
|
Loading…
Reference in a new issue