Add gst_vaapi_{get,put}_image() API.
authorgb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Mon, 15 Mar 2010 11:49:03 +0000 (11:49 +0000)
committergb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Mon, 15 Mar 2010 11:49:03 +0000 (11:49 +0000)
gst-libs/gst/vaapi/gstvaapiimage.c
gst-libs/gst/vaapi/gstvaapiimage.h
gst-libs/gst/vaapi/gstvaapisurface.c
gst-libs/gst/vaapi/gstvaapisurface.h

index 52ad804..d84b894 100644 (file)
@@ -319,6 +319,19 @@ gst_vaapi_image_get_height(GstVaapiImage *image)
     return image->priv->height;
 }
 
+void
+gst_vaapi_image_get_size(GstVaapiImage *image, guint *pwidth, guint *pheight)
+{
+    g_return_val_if_fail(GST_VAAPI_IS_IMAGE(image), 0);
+    g_return_val_if_fail(image->priv->is_constructed, FALSE);
+
+    if (pwidth)
+        *pwidth = image->priv->width;
+
+    if (pheight)
+        *pheight = image->priv->height;
+}
+
 guint
 gst_vaapi_image_get_format(GstVaapiImage *image)
 {
index 237e8c5..eb8f37b 100644 (file)
@@ -90,6 +90,9 @@ gst_vaapi_image_get_width(GstVaapiImage *image);
 guint
 gst_vaapi_image_get_height(GstVaapiImage *image);
 
+void
+gst_vaapi_image_get_size(GstVaapiImage *image, guint *pwidth, guint *pheight);
+
 guint
 gst_vaapi_image_get_format(GstVaapiImage *image);
 
index dc41495..4f859f0 100644 (file)
@@ -336,3 +336,63 @@ gst_vaapi_surface_get_size(
         *pheight = gst_vaapi_surface_get_height(surface);
 }
 
+gboolean
+gst_vaapi_surface_get_image(GstVaapiSurface *surface, GstVaapiImage *image)
+{
+    VAImageID image_id;
+    VAStatus status;
+    guint width, height;
+
+    g_return_val_if_fail(GST_VAAPI_IS_SURFACE(surface), FALSE);
+    g_return_val_if_fail(GST_VAAPI_IS_IMAGE(image), FALSE);
+
+    gst_vaapi_image_get_size(image, &width, &height);
+    if (width != surface->priv->width || height != surface->priv->height)
+        return FALSE;
+
+    image_id = gst_vaapi_image_get_id(image);
+    if (image_id == VA_INVALID_ID)
+        return FALSE;
+
+    status = vaGetImage(
+        gst_vaapi_display_get_display(surface->priv->display),
+        surface->priv->surface_id,
+        0, 0, width, height,
+        image_id
+    );
+    if (!vaapi_check_status(status, "vaGetImage()"))
+        return FALSE;
+
+    return TRUE;
+}
+
+gboolean
+gst_vaapi_surface_put_image(GstVaapiSurface *surface, GstVaapiImage *image)
+{
+    VAImageID image_id;
+    VAStatus status;
+    guint width, height;
+
+    g_return_val_if_fail(GST_VAAPI_IS_SURFACE(surface), FALSE);
+    g_return_val_if_fail(GST_VAAPI_IS_IMAGE(image), FALSE);
+
+    gst_vaapi_image_get_size(image, &width, &height);
+    if (width != surface->priv->width || height != surface->priv->height)
+        return FALSE;
+
+    image_id = gst_vaapi_image_get_id(image);
+    if (image_id == VA_INVALID_ID)
+        return FALSE;
+
+    status = vaPutImage(
+        gst_vaapi_display_get_display(surface->priv->display),
+        surface->priv->surface_id,
+        image_id,
+        0, 0, width, height,
+        0, 0, width, height
+    );
+    if (!vaapi_check_status(status, "vaPutImage()"))
+        return FALSE;
+
+    return TRUE;
+}
index 3e859a3..445ca8f 100644 (file)
@@ -21,6 +21,7 @@
 #ifndef GST_VAAPI_SURFACE_H
 #define GST_VAAPI_SURFACE_H
 
+#include <gst/vaapi/gstvaapiimage.h>
 #include <gst/vaapi/gstvaapidisplay.h>
 
 G_BEGIN_DECLS
@@ -106,6 +107,12 @@ gst_vaapi_surface_get_size(
     guint           *pheight
 );
 
+gboolean
+gst_vaapi_surface_get_image(GstVaapiSurface *surface, GstVaapiImage *image);
+
+gboolean
+gst_vaapi_surface_put_image(GstVaapiSurface *surface, GstVaapiImage *image);
+
 G_END_DECLS
 
 #endif /* GST_VAAPI_SURFACE_H */