diff options
author | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2011-12-18 18:44:49 +0100 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2013-05-28 16:32:18 +0800 |
commit | e9078277b57f70930c9e58177a4e546b6a61dfdc (patch) | |
tree | c8f74fabebaf7d49fe91b4eb6c6860de750867f0 /va/va.c | |
parent | 0c097f5d09b400527c29d8b100f01dfafa2c2438 (diff) |
vpp: add video processing hooks.
Diffstat (limited to 'va/va.c')
-rw-r--r-- | va/va.c | 89 |
1 files changed, 89 insertions, 0 deletions
@@ -26,6 +26,7 @@ #include "sysdeps.h" #include "va.h" #include "va_backend.h" +#include "va_backend_vpp.h" #include "va_trace.h" #include "va_fool.h" @@ -260,6 +261,7 @@ static VAStatus va_openDriver(VADisplay dpy, char *driver_name) dlclose(handle); } else { struct VADriverVTable *vtable = ctx->vtable; + struct VADriverVTableVPP *vtable_vpp = ctx->vtable_vpp; vaStatus = VA_STATUS_SUCCESS; if (!vtable) { @@ -269,6 +271,15 @@ static VAStatus va_openDriver(VADisplay dpy, char *driver_name) } ctx->vtable = vtable; + if (!vtable_vpp) { + vtable_vpp = calloc(1, sizeof(*vtable_vpp)); + if (vtable_vpp) + vtable_vpp->version = VA_DRIVER_VTABLE_VPP_VERSION; + else + vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; + } + ctx->vtable_vpp = vtable_vpp; + if (VA_STATUS_SUCCESS == vaStatus) vaStatus = (*init_func)(ctx); @@ -480,6 +491,8 @@ VAStatus vaTerminate ( } free(old_ctx->vtable); old_ctx->vtable = NULL; + free(old_ctx->vtable_vpp); + old_ctx->vtable_vpp = NULL; if (VA_STATUS_SUCCESS == vaStatus) pDisplayContext->vaDestroy(pDisplayContext); @@ -1399,3 +1412,79 @@ VAStatus vaUnlockSurface(VADisplay dpy, return ctx->vtable->vaUnlockSurface( ctx, surface ); } + +/* Video Processing */ +#define VA_VPP_INIT_CONTEXT(ctx, dpy) do { \ + CHECK_DISPLAY(dpy); \ + ctx = CTX(dpy); \ + if (!ctx) \ + return VA_STATUS_ERROR_INVALID_DISPLAY; \ + } while (0) + +#define VA_VPP_INVOKE(dpy, func, args) do { \ + if (!ctx->vtable_vpp->va##func) \ + return VA_STATUS_ERROR_UNIMPLEMENTED; \ + status = ctx->vtable_vpp->va##func args; \ + } while (0) + +VAStatus +vaQueryVideoProcFilters( + VADisplay dpy, + VAContextID context, + VAProcFilterType *filters, + unsigned int *num_filters +) +{ + VADriverContextP ctx; + VAStatus status; + + VA_VPP_INIT_CONTEXT(ctx, dpy); + VA_VPP_INVOKE( + ctx, + QueryVideoProcFilters, + (ctx, context, filters, num_filters) + ); + return status; +} + +VAStatus +vaQueryVideoProcFilterCaps( + VADisplay dpy, + VAContextID context, + VAProcFilterType type, + void *filter_caps, + unsigned int *num_filter_caps +) +{ + VADriverContextP ctx; + VAStatus status; + + VA_VPP_INIT_CONTEXT(ctx, dpy); + VA_VPP_INVOKE( + ctx, + QueryVideoProcFilterCaps, + (ctx, context, type, filter_caps, num_filter_caps) + ); + return status; +} + +VAStatus +vaQueryVideoProcPipelineCaps( + VADisplay dpy, + VAContextID context, + VABufferID *filters, + unsigned int num_filters, + VAProcPipelineCaps *pipeline_caps +) +{ + VADriverContextP ctx; + VAStatus status; + + VA_VPP_INIT_CONTEXT(ctx, dpy); + VA_VPP_INVOKE( + ctx, + QueryVideoProcPipelineCaps, + (ctx, context, filters, num_filters, pipeline_caps) + ); + return status; +} |