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:
Gwenole Beauchesne 2011-09-06 16:49:43 +02:00
parent f601d133cc
commit e00ec1f576
3 changed files with 47 additions and 0 deletions

View file

@ -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

View file

@ -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

View file

@ -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);