mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +00:00
Add gst_vaapi_video_buffer_new_from_buffer().
Add helper function to bind a foreign buffer into a GstVaapiVideoBuffer. Any image, surface or surface proxy will be inherited from the source buffer if it is a GstVaapiVideoBuffer.
This commit is contained in:
parent
f601d133cc
commit
e00ec1f576
3 changed files with 47 additions and 0 deletions
|
@ -187,6 +187,7 @@ GstVaapiVideoBuffer
|
|||
GstVaapiVideoBufferClass
|
||||
gst_vaapi_video_buffer_new
|
||||
gst_vaapi_video_buffer_new_from_pool
|
||||
gst_vaapi_video_buffer_new_from_buffer
|
||||
gst_vaapi_video_buffer_new_with_image
|
||||
gst_vaapi_video_buffer_new_with_surface
|
||||
gst_vaapi_video_buffer_new_with_surface_proxy
|
||||
|
|
|
@ -47,6 +47,7 @@ struct _GstVaapiVideoBufferPrivate {
|
|||
GstVaapiVideoPool *surface_pool;
|
||||
GstVaapiSurface *surface;
|
||||
GstVaapiSurfaceProxy *proxy;
|
||||
GstBuffer *buffer;
|
||||
};
|
||||
|
||||
static void
|
||||
|
@ -118,6 +119,11 @@ gst_vaapi_video_buffer_destroy_surface(GstVaapiVideoBuffer *buffer)
|
|||
g_object_unref(priv->surface_pool);
|
||||
priv->surface_pool = NULL;
|
||||
}
|
||||
|
||||
if (priv->buffer) {
|
||||
gst_buffer_unref(priv->buffer);
|
||||
priv->buffer = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -159,6 +165,7 @@ gst_vaapi_video_buffer_init(GstVaapiVideoBuffer *buffer)
|
|||
priv->surface_pool = NULL;
|
||||
priv->surface = NULL;
|
||||
priv->proxy = NULL;
|
||||
priv->buffer = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -232,6 +239,42 @@ gst_vaapi_video_buffer_new_from_pool(GstVaapiVideoPool *pool)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_vaapi_video_buffer_new_from_buffer:
|
||||
* @buffer: a #GstBuffer
|
||||
*
|
||||
* Creates a #GstBuffer with video objects bound to @buffer video
|
||||
* objects, if any.
|
||||
*
|
||||
* Return value: the newly allocated #GstBuffer, or %NULL on error
|
||||
*/
|
||||
GstBuffer *
|
||||
gst_vaapi_video_buffer_new_from_buffer(GstBuffer *buffer)
|
||||
{
|
||||
GstVaapiVideoBuffer *inbuf, *outbuf;
|
||||
|
||||
if (!GST_VAAPI_IS_VIDEO_BUFFER(buffer)) {
|
||||
if (!buffer->parent || !GST_VAAPI_IS_VIDEO_BUFFER(buffer->parent))
|
||||
return NULL;
|
||||
buffer = buffer->parent;
|
||||
}
|
||||
inbuf = GST_VAAPI_VIDEO_BUFFER(buffer);
|
||||
|
||||
outbuf = _gst_vaapi_video_buffer_new();
|
||||
if (!outbuf)
|
||||
return NULL;
|
||||
|
||||
if (inbuf->priv->image)
|
||||
gst_vaapi_video_buffer_set_image(outbuf, inbuf->priv->image);
|
||||
if (inbuf->priv->surface)
|
||||
gst_vaapi_video_buffer_set_surface(outbuf, inbuf->priv->surface);
|
||||
if (inbuf->priv->proxy)
|
||||
gst_vaapi_video_buffer_set_surface_proxy(outbuf, inbuf->priv->proxy);
|
||||
|
||||
outbuf->priv->buffer = gst_buffer_ref(buffer);
|
||||
return GST_BUFFER(outbuf);
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_vaapi_video_buffer_new_with_image:
|
||||
* @image: a #GstVaapiImage
|
||||
|
|
|
@ -90,6 +90,9 @@ gst_vaapi_video_buffer_new(GstVaapiDisplay *display);
|
|||
GstBuffer *
|
||||
gst_vaapi_video_buffer_new_from_pool(GstVaapiVideoPool *pool);
|
||||
|
||||
GstBuffer *
|
||||
gst_vaapi_video_buffer_new_from_buffer(GstBuffer *buffer);
|
||||
|
||||
GstBuffer *
|
||||
gst_vaapi_video_buffer_new_with_image(GstVaapiImage *image);
|
||||
|
||||
|
|
Loading…
Reference in a new issue