diff --git a/gst-libs/gst/vaapi/gstvaapiimage.c b/gst-libs/gst/vaapi/gstvaapiimage.c index 52ad80457b..d84b8947db 100644 --- a/gst-libs/gst/vaapi/gstvaapiimage.c +++ b/gst-libs/gst/vaapi/gstvaapiimage.c @@ -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) { diff --git a/gst-libs/gst/vaapi/gstvaapiimage.h b/gst-libs/gst/vaapi/gstvaapiimage.h index 237e8c56d7..eb8f37b125 100644 --- a/gst-libs/gst/vaapi/gstvaapiimage.h +++ b/gst-libs/gst/vaapi/gstvaapiimage.h @@ -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); diff --git a/gst-libs/gst/vaapi/gstvaapisurface.c b/gst-libs/gst/vaapi/gstvaapisurface.c index dc414957db..4f859f0237 100644 --- a/gst-libs/gst/vaapi/gstvaapisurface.c +++ b/gst-libs/gst/vaapi/gstvaapisurface.c @@ -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; +} diff --git a/gst-libs/gst/vaapi/gstvaapisurface.h b/gst-libs/gst/vaapi/gstvaapisurface.h index 3e859a33c9..445ca8f56f 100644 --- a/gst-libs/gst/vaapi/gstvaapisurface.h +++ b/gst-libs/gst/vaapi/gstvaapisurface.h @@ -21,6 +21,7 @@ #ifndef GST_VAAPI_SURFACE_H #define GST_VAAPI_SURFACE_H +#include #include 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 */