From a1dbe90077b29885695c54a1ce615d72ca39e83d Mon Sep 17 00:00:00 2001 From: gb Date: Tue, 30 Mar 2010 08:11:50 +0000 Subject: [PATCH] Add gst_vaapi_surface_query_status() wrapper. --- docs/reference/libs/libs-sections.txt | 2 ++ gst-libs/gst/vaapi/gstvaapisurface.c | 36 +++++++++++++++++++++++++ gst-libs/gst/vaapi/gstvaapisurface.h | 27 +++++++++++++++++++ gst-libs/gst/vaapi/gstvaapiutils.c | 39 +++++++++++++++++++++++++++ gst-libs/gst/vaapi/gstvaapiutils.h | 3 +++ 5 files changed, 107 insertions(+) diff --git a/docs/reference/libs/libs-sections.txt b/docs/reference/libs/libs-sections.txt index b6eacd54f1..9847492370 100644 --- a/docs/reference/libs/libs-sections.txt +++ b/docs/reference/libs/libs-sections.txt @@ -308,6 +308,7 @@ GST_VAAPI_IMAGE_GET_CLASS
gstvaapisurface GstVaapiChromaType +GstVaapiSurfaceStatus GstVaapiSurfaceRenderFlags GstVaapiSurface GstVaapiSurface @@ -324,6 +325,7 @@ gst_vaapi_surface_put_image gst_vaapi_surface_associate_subpicture gst_vaapi_surface_deassociate_subpicture gst_vaapi_surface_sync +gst_vaapi_surface_query_status GST_VAAPI_SURFACE GST_VAAPI_IS_SURFACE diff --git a/gst-libs/gst/vaapi/gstvaapisurface.c b/gst-libs/gst/vaapi/gstvaapisurface.c index c1456df7f1..635f111bc8 100644 --- a/gst-libs/gst/vaapi/gstvaapisurface.c +++ b/gst-libs/gst/vaapi/gstvaapisurface.c @@ -753,3 +753,39 @@ gst_vaapi_surface_sync(GstVaapiSurface *surface) return TRUE; } + +/** + * gst_vaapi_surface_query_status: + * @surface: a #GstVaapiSurface + * @pstatus: return location for the #GstVaapiSurfaceStatus + * + * Finds out any pending operations on the @surface. The + * #GstVaapiSurfaceStatus flags are returned into @pstatus. + * + * Return value: %TRUE on success + */ +gboolean +gst_vaapi_surface_query_status( + GstVaapiSurface *surface, + GstVaapiSurfaceStatus *pstatus +) +{ + VASurfaceStatus surface_status; + VAStatus status; + + g_return_val_if_fail(GST_VAAPI_IS_SURFACE(surface), FALSE); + + GST_VAAPI_OBJECT_LOCK_DISPLAY(surface); + status = vaQuerySurfaceStatus( + GST_VAAPI_OBJECT_VADISPLAY(surface), + GST_VAAPI_OBJECT_ID(surface), + &surface_status + ); + GST_VAAPI_OBJECT_UNLOCK_DISPLAY(surface); + if (!vaapi_check_status(status, "vaQuerySurfaceStatus()")) + return FALSE; + + if (pstatus) + *pstatus = to_GstVaapiSurfaceStatus(surface_status); + return TRUE; +} diff --git a/gst-libs/gst/vaapi/gstvaapisurface.h b/gst-libs/gst/vaapi/gstvaapisurface.h index 5893d72f06..668af90e46 100644 --- a/gst-libs/gst/vaapi/gstvaapisurface.h +++ b/gst-libs/gst/vaapi/gstvaapisurface.h @@ -29,6 +29,7 @@ G_BEGIN_DECLS typedef enum _GstVaapiChromaType GstVaapiChromaType; +typedef enum _GstVaapiSurfaceStatus GstVaapiSurfaceStatus; typedef enum _GstVaapiSurfaceRenderFlags GstVaapiSurfaceRenderFlags; /** @@ -45,6 +46,26 @@ enum _GstVaapiChromaType { GST_VAAPI_CHROMA_TYPE_YUV444 }; +/** + * GstVaapiSurfaceStatus: + * @GST_VAAPI_SURFACE_STATUS_IDLE: + * the surface is not being rendered or displayed + * @GST_VAAPI_SURFACE_STATUS_RENDERING: + * the surface is used for rendering (decoding to the surface in progress) + * @GST_VAAPI_SURFACE_STATUS_DISPLAYING: + * the surface is being displayed to screen + * @GST_VAAPI_SURFACE_STATUS_SKIPPED: + * indicates a skipped frame during encode + * + * The set of all surface status for #GstVaapiSurface. + */ +enum _GstVaapiSurfaceStatus { + GST_VAAPI_SURFACE_STATUS_IDLE = 1 << 0, + GST_VAAPI_SURFACE_STATUS_RENDERING = 1 << 1, + GST_VAAPI_SURFACE_STATUS_DISPLAYING = 1 << 2, + GST_VAAPI_SURFACE_STATUS_SKIPPED = 1 << 3 +}; + /** * GstVaapiSurfaceRenderFlags * @GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD: @@ -178,6 +199,12 @@ gst_vaapi_surface_deassociate_subpicture( gboolean gst_vaapi_surface_sync(GstVaapiSurface *surface); +gboolean +gst_vaapi_surface_query_status( + GstVaapiSurface *surface, + GstVaapiSurfaceStatus *pstatus +); + G_END_DECLS #endif /* GST_VAAPI_SURFACE_H */ diff --git a/gst-libs/gst/vaapi/gstvaapiutils.c b/gst-libs/gst/vaapi/gstvaapiutils.c index 63e0229aa6..2000433b94 100644 --- a/gst-libs/gst/vaapi/gstvaapiutils.c +++ b/gst-libs/gst/vaapi/gstvaapiutils.c @@ -128,3 +128,42 @@ guint get_PutSurface_flags_from_GstVaapiSurfaceRenderFlags(guint flags) return va_fields|va_csc; } + +/** + * to_GstVaapiSurfaceStatus: + * @flags: the #GstVaapiSurfaceStatus flags to translate + * + * Converts vaQuerySurfaceStatus() @flags to #GstVaapiSurfaceStatus + * flags. + * + * Return value: the #GstVaapiSurfaceStatus flags + */ +guint to_GstVaapiSurfaceStatus(guint va_flags) +{ + guint flags; + const guint va_flags_mask = (VASurfaceReady| + VASurfaceRendering| + VASurfaceDisplaying); + + /* Check for core status */ + switch (va_flags & va_flags_mask) { + case VASurfaceReady: + flags = GST_VAAPI_SURFACE_STATUS_IDLE; + break; + case VASurfaceRendering: + flags = GST_VAAPI_SURFACE_STATUS_RENDERING; + break; + case VASurfaceDisplaying: + flags = GST_VAAPI_SURFACE_STATUS_DISPLAYING; + break; + default: + flags = 0; + break; + } + + /* Check for encoder status */ + if (va_flags & VASurfaceSkipped) + flags |= GST_VAAPI_SURFACE_STATUS_SKIPPED; + + return flags; +} diff --git a/gst-libs/gst/vaapi/gstvaapiutils.h b/gst-libs/gst/vaapi/gstvaapiutils.h index 804cec0de0..7363947561 100644 --- a/gst-libs/gst/vaapi/gstvaapiutils.h +++ b/gst-libs/gst/vaapi/gstvaapiutils.h @@ -53,4 +53,7 @@ const char *string_of_VAEntrypoint(VAEntrypoint entrypoint) guint get_PutSurface_flags_from_GstVaapiSurfaceRenderFlags(guint flags) attribute_hidden; +guint to_GstVaapiSurfaceStatus(guint va_flags) + attribute_hidden; + #endif /* GST_VAAPI_UTILS_H */