Add gst_vaapi_video_buffer_new_from_buffer().
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Tue, 6 Sep 2011 14:49:43 +0000 (16:49 +0200)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Tue, 6 Sep 2011 16:37:11 +0000 (18:37 +0200)
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
gst-libs/gst/vaapi/gstvaapivideobuffer.c
gst-libs/gst/vaapi/gstvaapivideobuffer.h

index a37b457..722d6b4 100644 (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
index 912a4cd..ee7ff66 100644 (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;
 }
 
 /**
@@ -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
  *
index b0705e6..a00df2a 100644 (file)
@@ -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 *