/* * After this call, all library internal resources will be cleaned up */ VAStatus vaTerminate ( VADisplay dpy ) { VAStatus vaStatus = VA_STATUS_SUCCESS; VADisplayContextP pDisplayContext = (VADisplayContextP)dpy; VADriverContextP old_ctx; CHECK_DISPLAY(dpy); old_ctx = CTX(dpy); if (old_ctx->handle) { vaStatus = old_ctx->vtable->vaTerminate(old_ctx); // dlclose(old_ctx->handle); old_ctx->handle = NULL; } free(old_ctx->vtable); old_ctx->vtable = NULL; free(old_ctx->vtable_vpp); old_ctx->vtable_vpp = NULL; VA_TRACE_LOG(va_TraceTerminate, dpy); va_TraceEnd(dpy); va_FoolEnd(dpy); if (VA_STATUS_SUCCESS == vaStatus) pDisplayContext->vaDestroy(pDisplayContext); return vaStatus; }
// Return a suitable VADisplay for VA API VADisplay vaGetDisplayGLX(Display *native_dpy) { VADisplay dpy = NULL; VADisplayContextP pDisplayContext = NULL; VADisplayContextGLXP pDisplayContextGLX = NULL; VADriverContextP pDriverContext; VADriverContextGLXP pDriverContextGLX = NULL; dpy = vaGetDisplay(native_dpy); if (!dpy) return NULL; pDisplayContext = (VADisplayContextP)dpy; pDriverContext = pDisplayContext->pDriverContext; pDisplayContextGLX = calloc(1, sizeof(*pDisplayContextGLX)); if (!pDisplayContextGLX) goto error; pDriverContextGLX = calloc(1, sizeof(*pDriverContextGLX)); if (!pDriverContextGLX) goto error; pDisplayContextGLX->vaDestroy = pDisplayContext->vaDestroy; pDisplayContext->vaDestroy = va_DisplayContextDestroy; pDisplayContext->opaque = pDisplayContextGLX; pDriverContext->glx = pDriverContextGLX; return dpy; error: free(pDriverContextGLX); free(pDisplayContextGLX); pDisplayContext->vaDestroy(pDisplayContext); return NULL; }