summaryrefslogtreecommitdiff
path: root/va/va.c
diff options
context:
space:
mode:
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>2011-12-18 18:44:49 +0100
committerXiang, Haihao <haihao.xiang@intel.com>2013-05-28 16:32:18 +0800
commite9078277b57f70930c9e58177a4e546b6a61dfdc (patch)
treec8f74fabebaf7d49fe91b4eb6c6860de750867f0 /va/va.c
parent0c097f5d09b400527c29d8b100f01dfafa2c2438 (diff)
vpp: add video processing hooks.
Diffstat (limited to 'va/va.c')
-rw-r--r--va/va.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/va/va.c b/va/va.c
index ddd105e..680f582 100644
--- a/va/va.c
+++ b/va/va.c
@@ -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;
+}