static VASurfaceID get_next_free_surface(int *index) { VASurfaceStatus surface_status; int i; assert(index); if (multi_thread == 0) { i = *index; i++; if (i == SURFACE_NUM) i = 0; *index = i; return surface_id[i]; } for (i=0; i<SURFACE_NUM; i++) { surface_status = (VASurfaceStatus)0; vaQuerySurfaceStatus(va_dpy, surface_id[i], &surface_status); if (surface_status == VASurfaceReady) { if (0 == pthread_mutex_trylock(&surface_mutex[i])) { *index = i; break; } } } if (i==SURFACE_NUM) return VA_INVALID_SURFACE; else return surface_id[i]; }
/** * 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; }
bool VaapiSurface::queryStatus(VaapiSurfaceStatus * pStatus) { VASurfaceStatus surfaceStatus; VAStatus status; if (!pStatus) return false; status = vaQuerySurfaceStatus((VADisplay) m_display->getID(), (VASurfaceID) m_ID, &surfaceStatus); if (!checkVaapiStatus(status, "vaQuerySurfaceStatus()")) return false; *pStatus = (VaapiSurfaceStatus) toVaapiSurfaceStatus(surfaceStatus); return true; }