Index: third_party/libva/va/va.c |
diff --git a/third_party/libva/va/va.c b/third_party/libva/va/va.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fdbe044c90c6ed52266bc81b182f0bdc7abd0fdc |
--- /dev/null |
+++ b/third_party/libva/va/va.c |
@@ -0,0 +1,1375 @@ |
+/* |
+ * Copyright (c) 2007 Intel Corporation. All Rights Reserved. |
+ * |
+ * Permission is hereby granted, free of charge, to any person obtaining a |
+ * copy of this software and associated documentation files (the |
+ * "Software"), to deal in the Software without restriction, including |
+ * without limitation the rights to use, copy, modify, merge, publish, |
+ * distribute, sub license, and/or sell copies of the Software, and to |
+ * permit persons to whom the Software is furnished to do so, subject to |
+ * the following conditions: |
+ * |
+ * The above copyright notice and this permission notice (including the |
+ * next paragraph) shall be included in all copies or substantial portions |
+ * of the Software. |
+ * |
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR |
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
+ */ |
+ |
+#define _GNU_SOURCE 1 |
+#include "sysdeps.h" |
+#include "va.h" |
+#include "va_backend.h" |
+#include "va_trace.h" |
+#include "va_fool.h" |
+ |
+#include <assert.h> |
+#include <stdarg.h> |
+#include <stdio.h> |
+#include <stdlib.h> |
+#include <string.h> |
+#include <dlfcn.h> |
+#include <unistd.h> |
+ |
+#define DRIVER_EXTENSION "_drv_video.so" |
+ |
+#define CTX(dpy) (((VADisplayContextP)dpy)->pDriverContext) |
+#define CHECK_DISPLAY(dpy) if( !vaDisplayIsValid(dpy) ) { return VA_STATUS_ERROR_INVALID_DISPLAY; } |
+ |
+#define ASSERT assert |
+#define CHECK_VTABLE(s, ctx, func) if (!va_checkVtable(ctx->vtable->va##func, #func)) s = VA_STATUS_ERROR_UNKNOWN; |
+#define CHECK_MAXIMUM(s, ctx, var) if (!va_checkMaximum(ctx->max_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN; |
+#define CHECK_STRING(s, ctx, var) if (!va_checkString(ctx->str_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN; |
+ |
+#define Bool int |
+#define True 1 |
+#define False 0 |
+ |
+/* |
+ * read a config "env" for libva.conf or from environment setting |
+ * liva.conf has higher priority |
+ * return 0: the "env" is set, and the value is copied into env_value |
+ * 1: the env is not set |
+ */ |
+int va_parseConfig(char *env, char *env_value) |
+{ |
+ char *token, *value, *saveptr; |
+ char oneline[1024]; |
+ FILE *fp=NULL; |
+ |
+ if (env == NULL) |
+ return 1; |
+ |
+ fp = fopen("/etc/libva.conf", "r"); |
+ while (fp && (fgets(oneline, 1024, fp) != NULL)) { |
+ if (strlen(oneline) == 1) |
+ continue; |
+ token = strtok_r(oneline, "=\n", &saveptr); |
+ value = strtok_r(NULL, "=\n", &saveptr); |
+ |
+ if (NULL == token || NULL == value) |
+ continue; |
+ |
+ if (strcmp(token, env) == 0) { |
+ if (env_value) |
+ strncpy(env_value,value, 1024); |
+ |
+ fclose(fp); |
+ |
+ return 0; |
+ } |
+ } |
+ if (fp) |
+ fclose(fp); |
+ |
+ /* no setting in config file, use env setting */ |
+ if (getenv(env)) { |
+ if (env_value) |
+ strncpy(env_value, getenv(env), 1024); |
+ |
+ return 0; |
+ } |
+ |
+ return 1; |
+} |
+ |
+int vaDisplayIsValid(VADisplay dpy) |
+{ |
+ VADisplayContextP pDisplayContext = (VADisplayContextP)dpy; |
+ return pDisplayContext && (pDisplayContext->vadpy_magic == VA_DISPLAY_MAGIC) && pDisplayContext->vaIsValid(pDisplayContext); |
+} |
+ |
+void va_errorMessage(const char *msg, ...) |
+{ |
+ va_list args; |
+ |
+ fprintf(stderr, "libva error: "); |
+ va_start(args, msg); |
+ vfprintf(stderr, msg, args); |
+ va_end(args); |
+} |
+ |
+void va_infoMessage(const char *msg, ...) |
+{ |
+ va_list args; |
+ |
+ fprintf(stderr, "libva: "); |
+ va_start(args, msg); |
+ vfprintf(stderr, msg, args); |
+ va_end(args); |
+} |
+ |
+static Bool va_checkVtable(void *ptr, char *function) |
+{ |
+ if (!ptr) { |
+ va_errorMessage("No valid vtable entry for va%s\n", function); |
+ return False; |
+ } |
+ return True; |
+} |
+ |
+static Bool va_checkMaximum(int value, char *variable) |
+{ |
+ if (!value) { |
+ va_errorMessage("Failed to define max_%s in init\n", variable); |
+ return False; |
+ } |
+ return True; |
+} |
+ |
+static Bool va_checkString(const char* value, char *variable) |
+{ |
+ if (!value) { |
+ va_errorMessage("Failed to define str_%s in init\n", variable); |
+ return False; |
+ } |
+ return True; |
+} |
+ |
+static inline int |
+va_getDriverInitName(char *name, int namelen, int major, int minor) |
+{ |
+ int ret = snprintf(name, namelen, "__vaDriverInit_%d_%d", major, minor); |
+ return ret > 0 && ret < namelen; |
+} |
+ |
+static VAStatus va_getDriverName(VADisplay dpy, char **driver_name) |
+{ |
+ VADisplayContextP pDisplayContext = (VADisplayContextP)dpy; |
+ |
+ return pDisplayContext->vaGetDriverName(pDisplayContext, driver_name); |
+} |
+ |
+static VAStatus va_openDriver(VADisplay dpy, char *driver_name) |
+{ |
+ VADriverContextP ctx = CTX(dpy); |
+ VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN; |
+ char *search_path = NULL; |
+ char *saveptr; |
+ char *driver_dir; |
+ |
+ if (geteuid() == getuid()) |
+ /* don't allow setuid apps to use LIBVA_DRIVERS_PATH */ |
+ search_path = getenv("LIBVA_DRIVERS_PATH"); |
+ if (!search_path) |
+ search_path = VA_DRIVERS_PATH; |
+ |
+ search_path = strdup((const char *)search_path); |
+ driver_dir = strtok_r(search_path, ":", &saveptr); |
+ while (driver_dir) { |
+ void *handle = NULL; |
+ char *driver_path = (char *) malloc( strlen(driver_dir) + |
+ strlen(driver_name) + |
+ strlen(DRIVER_EXTENSION) + 2 ); |
+ strncpy( driver_path, driver_dir, strlen(driver_dir) + 1); |
+ strncat( driver_path, "/", strlen("/") ); |
+ strncat( driver_path, driver_name, strlen(driver_name) ); |
+ strncat( driver_path, DRIVER_EXTENSION, strlen(DRIVER_EXTENSION) ); |
+ |
+ va_infoMessage("Trying to open %s\n", driver_path); |
+#ifndef ANDROID |
+ handle = dlopen( driver_path, RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE ); |
+#else |
+ handle = dlopen( driver_path, RTLD_NOW| RTLD_GLOBAL); |
+#endif |
+ if (!handle) { |
+ /* Don't give errors for non-existing files */ |
+ if (0 == access( driver_path, F_OK)) |
+ va_errorMessage("dlopen of %s failed: %s\n", driver_path, dlerror()); |
+ } else { |
+ VADriverInit init_func = NULL; |
+ char init_func_s[256]; |
+ int i; |
+ |
+ static const struct { |
+ int major; |
+ int minor; |
+ } compatible_versions[] = { |
+ { VA_MAJOR_VERSION, VA_MINOR_VERSION }, |
+ { 0, 32 }, |
+ { -1, } |
+ }; |
+ |
+ for (i = 0; compatible_versions[i].major >= 0; i++) { |
+ if (va_getDriverInitName(init_func_s, sizeof(init_func_s), |
+ compatible_versions[i].major, |
+ compatible_versions[i].minor)) { |
+ init_func = (VADriverInit)dlsym(handle, init_func_s); |
+ if (init_func) { |
+ va_infoMessage("Found init function %s\n", init_func_s); |
+ break; |
+ } |
+ } |
+ } |
+ |
+ if (compatible_versions[i].major < 0) { |
+ va_errorMessage("%s has no function %s\n", |
+ driver_path, init_func_s); |
+ dlclose(handle); |
+ } else { |
+ struct VADriverVTable *vtable = ctx->vtable; |
+ |
+ vaStatus = VA_STATUS_SUCCESS; |
+ if (!vtable) { |
+ vtable = calloc(1, sizeof(*vtable)); |
+ if (!vtable) |
+ vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; |
+ } |
+ ctx->vtable = vtable; |
+ |
+ if (VA_STATUS_SUCCESS == vaStatus) |
+ vaStatus = (*init_func)(ctx); |
+ |
+ if (VA_STATUS_SUCCESS == vaStatus) { |
+ CHECK_MAXIMUM(vaStatus, ctx, profiles); |
+ CHECK_MAXIMUM(vaStatus, ctx, entrypoints); |
+ CHECK_MAXIMUM(vaStatus, ctx, attributes); |
+ CHECK_MAXIMUM(vaStatus, ctx, image_formats); |
+ CHECK_MAXIMUM(vaStatus, ctx, subpic_formats); |
+ CHECK_MAXIMUM(vaStatus, ctx, display_attributes); |
+ CHECK_STRING(vaStatus, ctx, vendor); |
+ CHECK_VTABLE(vaStatus, ctx, Terminate); |
+ CHECK_VTABLE(vaStatus, ctx, QueryConfigProfiles); |
+ CHECK_VTABLE(vaStatus, ctx, QueryConfigEntrypoints); |
+ CHECK_VTABLE(vaStatus, ctx, QueryConfigAttributes); |
+ CHECK_VTABLE(vaStatus, ctx, CreateConfig); |
+ CHECK_VTABLE(vaStatus, ctx, DestroyConfig); |
+ CHECK_VTABLE(vaStatus, ctx, GetConfigAttributes); |
+ CHECK_VTABLE(vaStatus, ctx, CreateSurfaces); |
+ CHECK_VTABLE(vaStatus, ctx, DestroySurfaces); |
+ CHECK_VTABLE(vaStatus, ctx, CreateContext); |
+ CHECK_VTABLE(vaStatus, ctx, DestroyContext); |
+ CHECK_VTABLE(vaStatus, ctx, CreateBuffer); |
+ CHECK_VTABLE(vaStatus, ctx, BufferSetNumElements); |
+ CHECK_VTABLE(vaStatus, ctx, MapBuffer); |
+ CHECK_VTABLE(vaStatus, ctx, UnmapBuffer); |
+ CHECK_VTABLE(vaStatus, ctx, DestroyBuffer); |
+ CHECK_VTABLE(vaStatus, ctx, BeginPicture); |
+ CHECK_VTABLE(vaStatus, ctx, RenderPicture); |
+ CHECK_VTABLE(vaStatus, ctx, EndPicture); |
+ CHECK_VTABLE(vaStatus, ctx, SyncSurface); |
+ CHECK_VTABLE(vaStatus, ctx, QuerySurfaceStatus); |
+ CHECK_VTABLE(vaStatus, ctx, PutSurface); |
+ CHECK_VTABLE(vaStatus, ctx, QueryImageFormats); |
+ CHECK_VTABLE(vaStatus, ctx, CreateImage); |
+ CHECK_VTABLE(vaStatus, ctx, DeriveImage); |
+ CHECK_VTABLE(vaStatus, ctx, DestroyImage); |
+ CHECK_VTABLE(vaStatus, ctx, SetImagePalette); |
+ CHECK_VTABLE(vaStatus, ctx, GetImage); |
+ CHECK_VTABLE(vaStatus, ctx, PutImage); |
+ CHECK_VTABLE(vaStatus, ctx, QuerySubpictureFormats); |
+ CHECK_VTABLE(vaStatus, ctx, CreateSubpicture); |
+ CHECK_VTABLE(vaStatus, ctx, DestroySubpicture); |
+ CHECK_VTABLE(vaStatus, ctx, SetSubpictureImage); |
+ CHECK_VTABLE(vaStatus, ctx, SetSubpictureChromakey); |
+ CHECK_VTABLE(vaStatus, ctx, SetSubpictureGlobalAlpha); |
+ CHECK_VTABLE(vaStatus, ctx, AssociateSubpicture); |
+ CHECK_VTABLE(vaStatus, ctx, DeassociateSubpicture); |
+ CHECK_VTABLE(vaStatus, ctx, QueryDisplayAttributes); |
+ CHECK_VTABLE(vaStatus, ctx, GetDisplayAttributes); |
+ CHECK_VTABLE(vaStatus, ctx, SetDisplayAttributes); |
+ } |
+ if (VA_STATUS_SUCCESS != vaStatus) { |
+ va_errorMessage("%s init failed\n", driver_path); |
+ dlclose(handle); |
+ } |
+ if (VA_STATUS_SUCCESS == vaStatus) |
+ ctx->handle = handle; |
+ free(driver_path); |
+ break; |
+ } |
+ } |
+ free(driver_path); |
+ |
+ driver_dir = strtok_r(NULL, ":", &saveptr); |
+ } |
+ |
+ free(search_path); |
+ |
+ return vaStatus; |
+} |
+ |
+VAPrivFunc vaGetLibFunc(VADisplay dpy, const char *func) |
+{ |
+ VADriverContextP ctx; |
+ if (!vaDisplayIsValid(dpy)) |
+ return NULL; |
+ ctx = CTX(dpy); |
+ |
+ if (NULL == ctx->handle) |
+ return NULL; |
+ |
+ return (VAPrivFunc) dlsym(ctx->handle, func); |
+} |
+ |
+ |
+/* |
+ * Returns a short english description of error_status |
+ */ |
+const char *vaErrorStr(VAStatus error_status) |
+{ |
+ switch(error_status) { |
+ case VA_STATUS_SUCCESS: |
+ return "success (no error)"; |
+ case VA_STATUS_ERROR_OPERATION_FAILED: |
+ return "operation failed"; |
+ case VA_STATUS_ERROR_ALLOCATION_FAILED: |
+ return "resource allocation failed"; |
+ case VA_STATUS_ERROR_INVALID_DISPLAY: |
+ return "invalid VADisplay"; |
+ case VA_STATUS_ERROR_INVALID_CONFIG: |
+ return "invalid VAConfigID"; |
+ case VA_STATUS_ERROR_INVALID_CONTEXT: |
+ return "invalid VAContextID"; |
+ case VA_STATUS_ERROR_INVALID_SURFACE: |
+ return "invalid VASurfaceID"; |
+ case VA_STATUS_ERROR_INVALID_BUFFER: |
+ return "invalid VABufferID"; |
+ case VA_STATUS_ERROR_INVALID_IMAGE: |
+ return "invalid VAImageID"; |
+ case VA_STATUS_ERROR_INVALID_SUBPICTURE: |
+ return "invalid VASubpictureID"; |
+ case VA_STATUS_ERROR_ATTR_NOT_SUPPORTED: |
+ return "attribute not supported"; |
+ case VA_STATUS_ERROR_MAX_NUM_EXCEEDED: |
+ return "list argument exceeds maximum number"; |
+ case VA_STATUS_ERROR_UNSUPPORTED_PROFILE: |
+ return "the requested VAProfile is not supported"; |
+ case VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT: |
+ return "the requested VAEntryPoint is not supported"; |
+ case VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT: |
+ return "the requested RT Format is not supported"; |
+ case VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE: |
+ return "the requested VABufferType is not supported"; |
+ case VA_STATUS_ERROR_SURFACE_BUSY: |
+ return "surface is in use"; |
+ case VA_STATUS_ERROR_FLAG_NOT_SUPPORTED: |
+ return "flag not supported"; |
+ case VA_STATUS_ERROR_INVALID_PARAMETER: |
+ return "invalid parameter"; |
+ case VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED: |
+ return "resolution not supported"; |
+ case VA_STATUS_ERROR_UNIMPLEMENTED: |
+ return "the requested function is not implemented"; |
+ case VA_STATUS_ERROR_SURFACE_IN_DISPLAYING: |
+ return "surface is in displaying (may by overlay)" ; |
+ case VA_STATUS_ERROR_INVALID_IMAGE_FORMAT: |
+ return "invalid VAImageFormat"; |
+ case VA_STATUS_ERROR_UNKNOWN: |
+ return "unknown libva error"; |
+ } |
+ return "unknown libva error / description missing"; |
+} |
+ |
+VAStatus vaInitialize ( |
+ VADisplay dpy, |
+ int *major_version, /* out */ |
+ int *minor_version /* out */ |
+) |
+{ |
+ const char *driver_name_env = NULL; |
+ char *driver_name = NULL; |
+ VAStatus vaStatus; |
+ |
+ CHECK_DISPLAY(dpy); |
+ |
+ va_TraceInit(dpy); |
+ |
+ va_FoolInit(dpy); |
+ |
+ va_infoMessage("VA-API version %s\n", VA_VERSION_S); |
+ |
+ driver_name_env = getenv("LIBVA_DRIVER_NAME"); |
+ if (driver_name_env && geteuid() == getuid()) { |
+ /* Don't allow setuid apps to use LIBVA_DRIVER_NAME */ |
+ driver_name = strdup(driver_name_env); |
+ vaStatus = VA_STATUS_SUCCESS; |
+ va_infoMessage("User requested driver '%s'\n", driver_name); |
+ } else { |
+ vaStatus = va_getDriverName(dpy, &driver_name); |
+ va_infoMessage("va_getDriverName() returns %d\n", vaStatus); |
+ } |
+ |
+ if (VA_STATUS_SUCCESS == vaStatus) { |
+ vaStatus = va_openDriver(dpy, driver_name); |
+ va_infoMessage("va_openDriver() returns %d\n", vaStatus); |
+ |
+ *major_version = VA_MAJOR_VERSION; |
+ *minor_version = VA_MINOR_VERSION; |
+ } |
+ |
+ if (driver_name) |
+ free(driver_name); |
+ |
+ VA_TRACE_LOG(va_TraceInitialize, dpy, major_version, minor_version); |
+ |
+ return vaStatus; |
+} |
+ |
+ |
+/* |
+ * 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; |
+ |
+ if (VA_STATUS_SUCCESS == vaStatus) |
+ pDisplayContext->vaDestroy(pDisplayContext); |
+ |
+ VA_TRACE_LOG(va_TraceTerminate, dpy); |
+ |
+ va_TraceEnd(dpy); |
+ |
+ va_FoolEnd(dpy); |
+ |
+ return vaStatus; |
+} |
+ |
+/* |
+ * vaQueryVendorString returns a pointer to a zero-terminated string |
+ * describing some aspects of the VA implemenation on a specific |
+ * hardware accelerator. The format of the returned string is: |
+ * <vendorname>-<major_version>-<minor_version>-<addtional_info> |
+ * e.g. for the Intel GMA500 implementation, an example would be: |
+ * "IntelGMA500-1.0-0.2-patch3 |
+ */ |
+const char *vaQueryVendorString ( |
+ VADisplay dpy |
+) |
+{ |
+ if (!vaDisplayIsValid(dpy)) |
+ return NULL; |
+ |
+ return CTX(dpy)->str_vendor; |
+} |
+ |
+ |
+/* Get maximum number of profiles supported by the implementation */ |
+int vaMaxNumProfiles ( |
+ VADisplay dpy |
+) |
+{ |
+ if (!vaDisplayIsValid(dpy)) |
+ return 0; |
+ |
+ return CTX(dpy)->max_profiles; |
+} |
+ |
+/* Get maximum number of entrypoints supported by the implementation */ |
+int vaMaxNumEntrypoints ( |
+ VADisplay dpy |
+) |
+{ |
+ if (!vaDisplayIsValid(dpy)) |
+ return 0; |
+ |
+ return CTX(dpy)->max_entrypoints; |
+} |
+ |
+ |
+/* Get maximum number of attributs supported by the implementation */ |
+int vaMaxNumConfigAttributes ( |
+ VADisplay dpy |
+) |
+{ |
+ if (!vaDisplayIsValid(dpy)) |
+ return 0; |
+ |
+ return CTX(dpy)->max_attributes; |
+} |
+ |
+VAStatus vaQueryConfigEntrypoints ( |
+ VADisplay dpy, |
+ VAProfile profile, |
+ VAEntrypoint *entrypoints, /* out */ |
+ int *num_entrypoints /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaQueryConfigEntrypoints ( ctx, profile, entrypoints, num_entrypoints); |
+} |
+ |
+VAStatus vaGetConfigAttributes ( |
+ VADisplay dpy, |
+ VAProfile profile, |
+ VAEntrypoint entrypoint, |
+ VAConfigAttrib *attrib_list, /* in/out */ |
+ int num_attribs |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaGetConfigAttributes ( ctx, profile, entrypoint, attrib_list, num_attribs ); |
+} |
+ |
+VAStatus vaQueryConfigProfiles ( |
+ VADisplay dpy, |
+ VAProfile *profile_list, /* out */ |
+ int *num_profiles /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaQueryConfigProfiles ( ctx, profile_list, num_profiles ); |
+} |
+ |
+VAStatus vaCreateConfig ( |
+ VADisplay dpy, |
+ VAProfile profile, |
+ VAEntrypoint entrypoint, |
+ VAConfigAttrib *attrib_list, |
+ int num_attribs, |
+ VAConfigID *config_id /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ VAStatus vaStatus = VA_STATUS_SUCCESS; |
+ int ret = 0; |
+ |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ vaStatus = ctx->vtable->vaCreateConfig ( ctx, profile, entrypoint, attrib_list, num_attribs, config_id ); |
+ |
+ /* record the current entrypoint for further trace/fool determination */ |
+ VA_TRACE_FUNC(va_TraceCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id); |
+ VA_FOOL_FUNC(va_FoolCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id); |
+ |
+ return vaStatus; |
+} |
+ |
+VAStatus vaDestroyConfig ( |
+ VADisplay dpy, |
+ VAConfigID config_id |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaDestroyConfig ( ctx, config_id ); |
+} |
+ |
+VAStatus vaQueryConfigAttributes ( |
+ VADisplay dpy, |
+ VAConfigID config_id, |
+ VAProfile *profile, /* out */ |
+ VAEntrypoint *entrypoint, /* out */ |
+ VAConfigAttrib *attrib_list,/* out */ |
+ int *num_attribs /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaQueryConfigAttributes( ctx, config_id, profile, entrypoint, attrib_list, num_attribs); |
+} |
+ |
+VAStatus vaCreateSurfaces ( |
+ VADisplay dpy, |
+ int width, |
+ int height, |
+ int format, |
+ int num_surfaces, |
+ VASurfaceID *surfaces /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ VAStatus vaStatus; |
+ |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ vaStatus = ctx->vtable->vaCreateSurfaces( ctx, width, height, format, num_surfaces, surfaces ); |
+ |
+ VA_TRACE_LOG(va_TraceCreateSurface, dpy, width, height, format, num_surfaces, surfaces); |
+ |
+ return vaStatus; |
+} |
+ |
+ |
+VAStatus vaDestroySurfaces ( |
+ VADisplay dpy, |
+ VASurfaceID *surface_list, |
+ int num_surfaces |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaDestroySurfaces( ctx, surface_list, num_surfaces ); |
+} |
+ |
+VAStatus vaCreateContext ( |
+ VADisplay dpy, |
+ VAConfigID config_id, |
+ int picture_width, |
+ int picture_height, |
+ int flag, |
+ VASurfaceID *render_targets, |
+ int num_render_targets, |
+ VAContextID *context /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ VAStatus vaStatus; |
+ |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ vaStatus = ctx->vtable->vaCreateContext( ctx, config_id, picture_width, picture_height, |
+ flag, render_targets, num_render_targets, context ); |
+ |
+ /* keep current encode/decode resoluton */ |
+ VA_TRACE_FUNC(va_TraceCreateContext, dpy, config_id, picture_width, picture_height, flag, render_targets, num_render_targets, context); |
+ |
+ return vaStatus; |
+} |
+ |
+VAStatus vaDestroyContext ( |
+ VADisplay dpy, |
+ VAContextID context |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaDestroyContext( ctx, context ); |
+} |
+ |
+VAStatus vaCreateBuffer ( |
+ VADisplay dpy, |
+ VAContextID context, /* in */ |
+ VABufferType type, /* in */ |
+ unsigned int size, /* in */ |
+ unsigned int num_elements, /* in */ |
+ void *data, /* in */ |
+ VABufferID *buf_id /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ int ret = 0; |
+ |
+ VA_FOOL_FUNC(va_FoolCreateBuffer, dpy, context, type, size, num_elements, data, buf_id); |
+ if (ret) |
+ return VA_STATUS_SUCCESS; |
+ |
+ return ctx->vtable->vaCreateBuffer( ctx, context, type, size, num_elements, data, buf_id); |
+} |
+ |
+VAStatus vaBufferSetNumElements ( |
+ VADisplay dpy, |
+ VABufferID buf_id, /* in */ |
+ unsigned int num_elements /* in */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ VA_FOOL_RETURN(); |
+ |
+ return ctx->vtable->vaBufferSetNumElements( ctx, buf_id, num_elements ); |
+} |
+ |
+ |
+VAStatus vaMapBuffer ( |
+ VADisplay dpy, |
+ VABufferID buf_id, /* in */ |
+ void **pbuf /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ VAStatus va_status; |
+ int ret = 0; |
+ |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ VA_FOOL_FUNC(va_FoolMapBuffer, dpy, buf_id, pbuf); |
+ if (ret) |
+ return VA_STATUS_SUCCESS; |
+ |
+ va_status = ctx->vtable->vaMapBuffer( ctx, buf_id, pbuf ); |
+ |
+ VA_TRACE_LOG(va_TraceMapBuffer, dpy, buf_id, pbuf); |
+ |
+ return va_status; |
+} |
+ |
+VAStatus vaUnmapBuffer ( |
+ VADisplay dpy, |
+ VABufferID buf_id /* in */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ int ret = 0; |
+ |
+ VA_FOOL_FUNC(va_FoolUnmapBuffer, dpy, buf_id); |
+ if (ret) |
+ return VA_STATUS_SUCCESS; |
+ |
+ return ctx->vtable->vaUnmapBuffer( ctx, buf_id ); |
+} |
+ |
+VAStatus vaDestroyBuffer ( |
+ VADisplay dpy, |
+ VABufferID buffer_id |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ VA_FOOL_RETURN(); |
+ |
+ return ctx->vtable->vaDestroyBuffer( ctx, buffer_id ); |
+} |
+ |
+VAStatus vaBufferInfo ( |
+ VADisplay dpy, |
+ VAContextID context, /* in */ |
+ VABufferID buf_id, /* in */ |
+ VABufferType *type, /* out */ |
+ unsigned int *size, /* out */ |
+ unsigned int *num_elements /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ int ret = 0; |
+ |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ VA_FOOL_FUNC(va_FoolBufferInfo, dpy, buf_id, type, size, num_elements); |
+ if (ret) |
+ return VA_STATUS_SUCCESS; |
+ |
+ return ctx->vtable->vaBufferInfo( ctx, buf_id, type, size, num_elements ); |
+} |
+ |
+VAStatus vaBeginPicture ( |
+ VADisplay dpy, |
+ VAContextID context, |
+ VASurfaceID render_target |
+) |
+{ |
+ VADriverContextP ctx; |
+ VAStatus va_status; |
+ |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ VA_TRACE_FUNC(va_TraceBeginPicture, dpy, context, render_target); |
+ VA_FOOL_RETURN(); |
+ |
+ va_status = ctx->vtable->vaBeginPicture( ctx, context, render_target ); |
+ |
+ return va_status; |
+} |
+ |
+VAStatus vaRenderPicture ( |
+ VADisplay dpy, |
+ VAContextID context, |
+ VABufferID *buffers, |
+ int num_buffers |
+) |
+{ |
+ VADriverContextP ctx; |
+ |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ VA_TRACE_LOG(va_TraceRenderPicture, dpy, context, buffers, num_buffers); |
+ VA_FOOL_RETURN(); |
+ |
+ return ctx->vtable->vaRenderPicture( ctx, context, buffers, num_buffers ); |
+} |
+ |
+VAStatus vaEndPicture ( |
+ VADisplay dpy, |
+ VAContextID context |
+) |
+{ |
+ VAStatus va_status; |
+ VADriverContextP ctx; |
+ |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ /* dump encode source surface */ |
+ VA_TRACE_SURFACE(va_TraceEndPicture, dpy, context, 0); |
+ /* return directly if do dummy operation */ |
+ VA_FOOL_RETURN(); |
+ |
+ va_status = ctx->vtable->vaEndPicture( ctx, context ); |
+ /* dump decode dest surface */ |
+ VA_TRACE_SURFACE(va_TraceEndPicture, dpy, context, 1); |
+ |
+ return va_status; |
+} |
+ |
+VAStatus vaSyncSurface ( |
+ VADisplay dpy, |
+ VASurfaceID render_target |
+) |
+{ |
+ VAStatus va_status; |
+ VADriverContextP ctx; |
+ |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ va_status = ctx->vtable->vaSyncSurface( ctx, render_target ); |
+ VA_TRACE_LOG(va_TraceSyncSurface, dpy, render_target); |
+ |
+ return va_status; |
+} |
+ |
+VAStatus vaQuerySurfaceStatus ( |
+ VADisplay dpy, |
+ VASurfaceID render_target, |
+ VASurfaceStatus *status /* out */ |
+) |
+{ |
+ VAStatus va_status; |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ va_status = ctx->vtable->vaQuerySurfaceStatus( ctx, render_target, status ); |
+ |
+ VA_TRACE_LOG(va_TraceQuerySurfaceStatus, dpy, render_target, status); |
+ |
+ return va_status; |
+} |
+ |
+VAStatus vaQuerySurfaceError ( |
+ VADisplay dpy, |
+ VASurfaceID surface, |
+ VAStatus error_status, |
+ void **error_info /*out*/ |
+) |
+{ |
+ VAStatus va_status; |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ va_status = ctx->vtable->vaQuerySurfaceError( ctx, surface, error_status, error_info ); |
+ |
+ VA_TRACE_LOG(va_TraceQuerySurfaceError, dpy, surface, error_status, error_info); |
+ |
+ return va_status; |
+} |
+ |
+/* Get maximum number of image formats supported by the implementation */ |
+int vaMaxNumImageFormats ( |
+ VADisplay dpy |
+) |
+{ |
+ if (!vaDisplayIsValid(dpy)) |
+ return 0; |
+ |
+ return CTX(dpy)->max_image_formats; |
+} |
+ |
+VAStatus vaQueryImageFormats ( |
+ VADisplay dpy, |
+ VAImageFormat *format_list, /* out */ |
+ int *num_formats /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaQueryImageFormats ( ctx, format_list, num_formats); |
+} |
+ |
+/* |
+ * The width and height fields returned in the VAImage structure may get |
+ * enlarged for some YUV formats. The size of the data buffer that needs |
+ * to be allocated will be given in the "data_size" field in VAImage. |
+ * Image data is not allocated by this function. The client should |
+ * allocate the memory and fill in the VAImage structure's data field |
+ * after looking at "data_size" returned from the library. |
+ */ |
+VAStatus vaCreateImage ( |
+ VADisplay dpy, |
+ VAImageFormat *format, |
+ int width, |
+ int height, |
+ VAImage *image /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaCreateImage ( ctx, format, width, height, image); |
+} |
+ |
+/* |
+ * Should call DestroyImage before destroying the surface it is bound to |
+ */ |
+VAStatus vaDestroyImage ( |
+ VADisplay dpy, |
+ VAImageID image |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaDestroyImage ( ctx, image); |
+} |
+ |
+VAStatus vaSetImagePalette ( |
+ VADisplay dpy, |
+ VAImageID image, |
+ unsigned char *palette |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaSetImagePalette ( ctx, image, palette); |
+} |
+ |
+/* |
+ * Retrieve surface data into a VAImage |
+ * Image must be in a format supported by the implementation |
+ */ |
+VAStatus vaGetImage ( |
+ VADisplay dpy, |
+ VASurfaceID surface, |
+ int x, /* coordinates of the upper left source pixel */ |
+ int y, |
+ unsigned int width, /* width and height of the region */ |
+ unsigned int height, |
+ VAImageID image |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaGetImage ( ctx, surface, x, y, width, height, image); |
+} |
+ |
+/* |
+ * Copy data from a VAImage to a surface |
+ * Image must be in a format supported by the implementation |
+ */ |
+VAStatus vaPutImage ( |
+ VADisplay dpy, |
+ VASurfaceID surface, |
+ VAImageID image, |
+ int src_x, |
+ int src_y, |
+ unsigned int src_width, |
+ unsigned int src_height, |
+ int dest_x, |
+ int dest_y, |
+ unsigned int dest_width, |
+ unsigned int dest_height |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaPutImage ( ctx, surface, image, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height ); |
+} |
+ |
+/* |
+ * Derive an VAImage from an existing surface. |
+ * This interface will derive a VAImage and corresponding image buffer from |
+ * an existing VA Surface. The image buffer can then be mapped/unmapped for |
+ * direct CPU access. This operation is only possible on implementations with |
+ * direct rendering capabilities and internal surface formats that can be |
+ * represented with a VAImage. When the operation is not possible this interface |
+ * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back |
+ * to using vaCreateImage + vaPutImage to accomplish the same task in an |
+ * indirect manner. |
+ * |
+ * Implementations should only return success when the resulting image buffer |
+ * would be useable with vaMap/Unmap. |
+ * |
+ * When directly accessing a surface special care must be taken to insure |
+ * proper synchronization with the graphics hardware. Clients should call |
+ * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent |
+ * rendering or currently being displayed by an overlay. |
+ * |
+ * Additionally nothing about the contents of a surface should be assumed |
+ * following a vaPutSurface. Implementations are free to modify the surface for |
+ * scaling or subpicture blending within a call to vaPutImage. |
+ * |
+ * Calls to vaPutImage or vaGetImage using the same surface from which the image |
+ * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or |
+ * vaGetImage with other surfaces is supported. |
+ * |
+ * An image created with vaDeriveImage should be freed with vaDestroyImage. The |
+ * image and image buffer structures will be destroyed; however, the underlying |
+ * surface will remain unchanged until freed with vaDestroySurfaces. |
+ */ |
+VAStatus vaDeriveImage ( |
+ VADisplay dpy, |
+ VASurfaceID surface, |
+ VAImage *image /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaDeriveImage ( ctx, surface, image ); |
+} |
+ |
+ |
+/* Get maximum number of subpicture formats supported by the implementation */ |
+int vaMaxNumSubpictureFormats ( |
+ VADisplay dpy |
+) |
+{ |
+ if (!vaDisplayIsValid(dpy)) |
+ return 0; |
+ |
+ return CTX(dpy)->max_subpic_formats; |
+} |
+ |
+/* |
+ * Query supported subpicture formats |
+ * The caller must provide a "format_list" array that can hold at |
+ * least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag |
+ * for each format to indicate additional capabilities for that format. The actual |
+ * number of formats returned in "format_list" is returned in "num_formats". |
+ */ |
+VAStatus vaQuerySubpictureFormats ( |
+ VADisplay dpy, |
+ VAImageFormat *format_list, /* out */ |
+ unsigned int *flags, /* out */ |
+ unsigned int *num_formats /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaQuerySubpictureFormats ( ctx, format_list, flags, num_formats); |
+} |
+ |
+/* |
+ * Subpictures are created with an image associated. |
+ */ |
+VAStatus vaCreateSubpicture ( |
+ VADisplay dpy, |
+ VAImageID image, |
+ VASubpictureID *subpicture /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaCreateSubpicture ( ctx, image, subpicture ); |
+} |
+ |
+/* |
+ * Destroy the subpicture before destroying the image it is assocated to |
+ */ |
+VAStatus vaDestroySubpicture ( |
+ VADisplay dpy, |
+ VASubpictureID subpicture |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaDestroySubpicture ( ctx, subpicture); |
+} |
+ |
+VAStatus vaSetSubpictureImage ( |
+ VADisplay dpy, |
+ VASubpictureID subpicture, |
+ VAImageID image |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaSetSubpictureImage ( ctx, subpicture, image); |
+} |
+ |
+ |
+/* |
+ * If chromakey is enabled, then the area where the source value falls within |
+ * the chromakey [min, max] range is transparent |
+ */ |
+VAStatus vaSetSubpictureChromakey ( |
+ VADisplay dpy, |
+ VASubpictureID subpicture, |
+ unsigned int chromakey_min, |
+ unsigned int chromakey_max, |
+ unsigned int chromakey_mask |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaSetSubpictureChromakey ( ctx, subpicture, chromakey_min, chromakey_max, chromakey_mask ); |
+} |
+ |
+ |
+/* |
+ * Global alpha value is between 0 and 1. A value of 1 means fully opaque and |
+ * a value of 0 means fully transparent. If per-pixel alpha is also specified then |
+ * the overall alpha is per-pixel alpha multiplied by the global alpha |
+ */ |
+VAStatus vaSetSubpictureGlobalAlpha ( |
+ VADisplay dpy, |
+ VASubpictureID subpicture, |
+ float global_alpha |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaSetSubpictureGlobalAlpha ( ctx, subpicture, global_alpha ); |
+} |
+ |
+/* |
+ vaAssociateSubpicture associates the subpicture with the target_surface. |
+ It defines the region mapping between the subpicture and the target |
+ surface through source and destination rectangles (with the same width and height). |
+ Both will be displayed at the next call to vaPutSurface. Additional |
+ associations before the call to vaPutSurface simply overrides the association. |
+*/ |
+VAStatus vaAssociateSubpicture ( |
+ VADisplay dpy, |
+ VASubpictureID subpicture, |
+ VASurfaceID *target_surfaces, |
+ int num_surfaces, |
+ short src_x, /* upper left offset in subpicture */ |
+ short src_y, |
+ unsigned short src_width, |
+ unsigned short src_height, |
+ short dest_x, /* upper left offset in surface */ |
+ short dest_y, |
+ unsigned short dest_width, |
+ unsigned short dest_height, |
+ /* |
+ * whether to enable chroma-keying or global-alpha |
+ * see VA_SUBPICTURE_XXX values |
+ */ |
+ unsigned int flags |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaAssociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height, flags ); |
+} |
+ |
+/* |
+ * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces. |
+ */ |
+VAStatus vaDeassociateSubpicture ( |
+ VADisplay dpy, |
+ VASubpictureID subpicture, |
+ VASurfaceID *target_surfaces, |
+ int num_surfaces |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaDeassociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces ); |
+} |
+ |
+ |
+/* Get maximum number of display attributes supported by the implementation */ |
+int vaMaxNumDisplayAttributes ( |
+ VADisplay dpy |
+) |
+{ |
+ int tmp; |
+ |
+ if (!vaDisplayIsValid(dpy)) |
+ return 0; |
+ |
+ tmp = CTX(dpy)->max_display_attributes; |
+ |
+ VA_TRACE_LOG(va_TraceMaxNumDisplayAttributes, dpy, tmp); |
+ |
+ return tmp; |
+} |
+ |
+/* |
+ * Query display attributes |
+ * The caller must provide a "attr_list" array that can hold at |
+ * least vaMaxNumDisplayAttributes() entries. The actual number of attributes |
+ * returned in "attr_list" is returned in "num_attributes". |
+ */ |
+VAStatus vaQueryDisplayAttributes ( |
+ VADisplay dpy, |
+ VADisplayAttribute *attr_list, /* out */ |
+ int *num_attributes /* out */ |
+) |
+{ |
+ VADriverContextP ctx; |
+ VAStatus va_status; |
+ |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ va_status = ctx->vtable->vaQueryDisplayAttributes ( ctx, attr_list, num_attributes ); |
+ |
+ VA_TRACE_LOG(va_TraceQueryDisplayAttributes, dpy, attr_list, num_attributes); |
+ |
+ return va_status; |
+ |
+} |
+ |
+/* |
+ * Get display attributes |
+ * This function returns the current attribute values in "attr_list". |
+ * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field |
+ * from vaQueryDisplayAttributes() can have their values retrieved. |
+ */ |
+VAStatus vaGetDisplayAttributes ( |
+ VADisplay dpy, |
+ VADisplayAttribute *attr_list, /* in/out */ |
+ int num_attributes |
+) |
+{ |
+ VADriverContextP ctx; |
+ VAStatus va_status; |
+ |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ va_status = ctx->vtable->vaGetDisplayAttributes ( ctx, attr_list, num_attributes ); |
+ |
+ VA_TRACE_LOG(va_TraceGetDisplayAttributes, dpy, attr_list, num_attributes); |
+ |
+ return va_status; |
+} |
+ |
+/* |
+ * Set display attributes |
+ * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field |
+ * from vaQueryDisplayAttributes() can be set. If the attribute is not settable or |
+ * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED |
+ */ |
+VAStatus vaSetDisplayAttributes ( |
+ VADisplay dpy, |
+ VADisplayAttribute *attr_list, |
+ int num_attributes |
+) |
+{ |
+ VADriverContextP ctx; |
+ VAStatus va_status; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ va_status = ctx->vtable->vaSetDisplayAttributes ( ctx, attr_list, num_attributes ); |
+ VA_TRACE_LOG(va_TraceSetDisplayAttributes, dpy, attr_list, num_attributes); |
+ |
+ return va_status; |
+} |
+ |
+VAStatus vaLockSurface(VADisplay dpy, |
+ VASurfaceID surface, |
+ unsigned int *fourcc, /* following are output argument */ |
+ unsigned int *luma_stride, |
+ unsigned int *chroma_u_stride, |
+ unsigned int *chroma_v_stride, |
+ unsigned int *luma_offset, |
+ unsigned int *chroma_u_offset, |
+ unsigned int *chroma_v_offset, |
+ unsigned int *buffer_name, |
+ void **buffer |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaLockSurface( ctx, surface, fourcc, luma_stride, chroma_u_stride, chroma_v_stride, luma_offset, chroma_u_offset, chroma_v_offset, buffer_name, buffer); |
+} |
+ |
+ |
+VAStatus vaUnlockSurface(VADisplay dpy, |
+ VASurfaceID surface |
+) |
+{ |
+ VADriverContextP ctx; |
+ CHECK_DISPLAY(dpy); |
+ ctx = CTX(dpy); |
+ |
+ return ctx->vtable->vaUnlockSurface( ctx, surface ); |
+} |