From e00ec1f57618a9ae177548ce0f57483000567a0b Mon Sep 17 00:00:00 2001 From: Gwenole Beauchesne Date: Tue, 6 Sep 2011 16:49:43 +0200 Subject: [PATCH] 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. --- docs/reference/libs/libs-sections.txt | 1 + gst-libs/gst/vaapi/gstvaapivideobuffer.c | 43 ++++++++++++++++++++++++++++++++ gst-libs/gst/vaapi/gstvaapivideobuffer.h | 3 +++ 3 files changed, 47 insertions(+) diff --git a/docs/reference/libs/libs-sections.txt b/docs/reference/libs/libs-sections.txt index a37b457..722d6b4 100644 --- a/docs/reference/libs/libs-sections.txt +++ b/docs/reference/libs/libs-sections.txt @@ -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 diff --git a/gst-libs/gst/vaapi/gstvaapivideobuffer.c b/gst-libs/gst/vaapi/gstvaapivideobuffer.c index 912a4cd..ee7ff66 100644 --- a/gst-libs/gst/vaapi/gstvaapivideobuffer.c +++ b/gst-libs/gst/vaapi/gstvaapivideobuffer.c @@ -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; } /** @@ -233,6 +240,42 @@ gst_vaapi_video_buffer_new_from_pool(GstVaapiVideoPool *pool) } /** + * 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 * diff --git a/gst-libs/gst/vaapi/gstvaapivideobuffer.h b/gst-libs/gst/vaapi/gstvaapivideobuffer.h index b0705e6..a00df2a 100644 --- a/gst-libs/gst/vaapi/gstvaapivideobuffer.h +++ b/gst-libs/gst/vaapi/gstvaapivideobuffer.h @@ -91,6 +91,9 @@ 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); GstBuffer * -- 2.7.4