Add gst_vaapi_surface_query_status() wrapper.

This commit is contained in:
gb 2010-03-30 08:11:50 +00:00
parent 35b6198d55
commit a1dbe90077
5 changed files with 107 additions and 0 deletions

View file

@ -308,6 +308,7 @@ GST_VAAPI_IMAGE_GET_CLASS
<SECTION>
<FILE>gstvaapisurface</FILE>
GstVaapiChromaType
GstVaapiSurfaceStatus
GstVaapiSurfaceRenderFlags
<TITLE>GstVaapiSurface</TITLE>
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
<SUBSECTION Standard>
GST_VAAPI_SURFACE
GST_VAAPI_IS_SURFACE

View file

@ -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;
}

View file

@ -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 */

View file

@ -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;
}

View file

@ -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 */