2 * Copyright (c) 2007 Intel Corporation. All Rights Reserved.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sub license, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 #include "va_backend.h"
29 #include "va_backend_vpp.h"
30 #include "va_internal.h"
42 #include <cutils/log.h>
43 /* support versions < JellyBean */
52 #define DRIVER_EXTENSION "_drv_video.so"
55 #define CHECK_VTABLE(s, ctx, func) if (!va_checkVtable(dpy, ctx->vtable->va##func, #func)) s = VA_STATUS_ERROR_UNKNOWN;
56 #define CHECK_MAXIMUM(s, ctx, var) if (!va_checkMaximum(dpy, ctx->max_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
57 #define CHECK_STRING(s, ctx, var) if (!va_checkString(dpy, ctx->str_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
60 * read a config "env" for libva.conf or from environment setting
61 * libva.conf has higher priority
62 * return 0: the "env" is set, and the value is copied into env_value
63 * 1: the env is not set
65 int va_parseConfig(char *env, char *env_value)
67 char *token, *value, *saveptr;
74 fp = fopen("/etc/libva.conf", "r");
75 while (fp && (fgets(oneline, 1024, fp) != NULL)) {
76 if (strlen(oneline) == 1)
78 token = strtok_r(oneline, "=\n", &saveptr);
79 value = strtok_r(NULL, "=\n", &saveptr);
81 if (NULL == token || NULL == value)
84 if (strcmp(token, env) == 0) {
86 strncpy(env_value,value, 1024);
87 env_value[1023] = '\0';
98 /* no setting in config file, use env setting */
102 strncpy(env_value, value, 1024);
103 env_value[1023] = '\0';
111 int vaDisplayIsValid(VADisplay dpy)
113 VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
114 return pDisplayContext && (pDisplayContext->vadpy_magic == VA_DISPLAY_MAGIC) && pDisplayContext->vaIsValid(pDisplayContext);
118 * Global log level configured from the config file or environment, which sets
119 * whether default logging appears or not (always overridden by explicitly
120 * user-configured logging).
122 static int default_log_level = 2;
124 static void default_log_error(void *user_context, const char *buffer)
126 if (default_log_level < 1)
131 fprintf(stderr, "libva error: %s", buffer);
135 static void default_log_info(void *user_context, const char *buffer)
137 if (default_log_level < 2)
142 fprintf(stderr, "libva info: %s", buffer);
147 * Set the callback for error messages, or NULL for no logging.
148 * Returns the previous one, or NULL if it was disabled.
150 VAMessageCallback vaSetErrorCallback(VADisplay dpy, VAMessageCallback callback, void *user_context)
152 VADisplayContextP dctx;
153 VAMessageCallback old_callback;
155 if (!vaDisplayIsValid(dpy))
158 dctx = (VADisplayContextP)dpy;
159 old_callback = dctx->error_callback;
161 dctx->error_callback = callback;
162 dctx->error_callback_user_context = user_context;
168 * Set the callback for info messages, or NULL for no logging.
169 * Returns the previous one, or NULL if it was disabled.
171 VAMessageCallback vaSetInfoCallback(VADisplay dpy, VAMessageCallback callback, void *user_context)
173 VADisplayContextP dctx;
174 VAMessageCallback old_callback;
176 if (!vaDisplayIsValid(dpy))
179 dctx = (VADisplayContextP)dpy;
180 old_callback = dctx->info_callback;
182 dctx->info_callback = callback;
183 dctx->info_callback_user_context = user_context;
188 static void va_MessagingInit()
190 #if ENABLE_VA_MESSAGING
191 char env_value[1024];
194 if (va_parseConfig("LIBVA_MESSAGING_LEVEL", &env_value[0]) == 0) {
195 ret = sscanf(env_value, "%d", &default_log_level);
196 if (ret < 1 || default_log_level < 0 || default_log_level > 2)
197 default_log_level = 2;
202 void va_errorMessage(VADisplay dpy, const char *msg, ...)
204 #if ENABLE_VA_MESSAGING
205 VADisplayContextP dctx = (VADisplayContextP)dpy;
206 char buf[512], *dynbuf;
210 if (dctx->error_callback == NULL)
214 len = vsnprintf(buf, sizeof(buf), msg, args);
217 if (len >= (int)sizeof(buf)) {
218 dynbuf = malloc(len + 1);
222 n = vsnprintf(dynbuf, len + 1, msg, args);
225 dctx->error_callback(dctx->error_callback_user_context, dynbuf);
229 dctx->error_callback(dctx->error_callback_user_context, buf);
233 void va_infoMessage(VADisplay dpy, const char *msg, ...)
235 #if ENABLE_VA_MESSAGING
236 VADisplayContextP dctx = (VADisplayContextP)dpy;
237 char buf[512], *dynbuf;
241 if (dctx->info_callback == NULL)
245 len = vsnprintf(buf, sizeof(buf), msg, args);
248 if (len >= (int)sizeof(buf)) {
249 dynbuf = malloc(len + 1);
253 n = vsnprintf(dynbuf, len + 1, msg, args);
256 dctx->info_callback(dctx->info_callback_user_context, dynbuf);
260 dctx->info_callback(dctx->info_callback_user_context, buf);
264 static void va_driverErrorCallback(VADriverContextP ctx,
267 VADisplayContextP dctx = ctx->pDisplayContext;
270 dctx->error_callback(dctx->error_callback_user_context, message);
273 static void va_driverInfoCallback(VADriverContextP ctx,
276 VADisplayContextP dctx = ctx->pDisplayContext;
279 dctx->info_callback(dctx->info_callback_user_context, message);
282 VADisplayContextP va_newDisplayContext(void)
284 VADisplayContextP dctx = calloc(1, sizeof(*dctx));
288 dctx->vadpy_magic = VA_DISPLAY_MAGIC;
290 dctx->error_callback = default_log_error;
291 dctx->info_callback = default_log_info;
296 VADriverContextP va_newDriverContext(VADisplayContextP dctx)
298 VADriverContextP ctx = calloc(1, sizeof(*ctx));
302 dctx->pDriverContext = ctx;
303 ctx->pDisplayContext = dctx;
305 ctx->error_callback = va_driverErrorCallback;
306 ctx->info_callback = va_driverInfoCallback;
311 static bool va_checkVtable(VADisplay dpy, void *ptr, char *function)
314 va_errorMessage(dpy, "No valid vtable entry for va%s\n", function);
320 static bool va_checkMaximum(VADisplay dpy, int value, char *variable)
323 va_errorMessage(dpy, "Failed to define max_%s in init\n", variable);
329 static bool va_checkString(VADisplay dpy, const char* value, char *variable)
332 va_errorMessage(dpy, "Failed to define str_%s in init\n", variable);
339 va_getDriverInitName(char *name, int namelen, int major, int minor)
341 int ret = snprintf(name, namelen, "__vaDriverInit_%d_%d", major, minor);
342 return ret > 0 && ret < namelen;
345 static VAStatus va_getDriverName(VADisplay dpy, char **driver_name)
347 VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
349 return pDisplayContext->vaGetDriverName(pDisplayContext, driver_name);
352 static VAStatus va_openDriver(VADisplay dpy, char *driver_name)
354 VADriverContextP ctx = CTX(dpy);
355 VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN;
356 char *search_path = NULL;
360 if (geteuid() == getuid())
361 /* don't allow setuid apps to use LIBVA_DRIVERS_PATH */
362 search_path = getenv("LIBVA_DRIVERS_PATH");
364 search_path = VA_DRIVERS_PATH;
366 search_path = strdup((const char *)search_path);
367 driver_dir = strtok_r(search_path, ":", &saveptr);
370 char *driver_path = (char *) malloc( strlen(driver_dir) +
371 strlen(driver_name) +
372 strlen(DRIVER_EXTENSION) + 2 );
374 va_errorMessage(dpy, "%s L%d Out of memory!n",
375 __FUNCTION__, __LINE__);
377 return VA_STATUS_ERROR_ALLOCATION_FAILED;
380 strncpy( driver_path, driver_dir, strlen(driver_dir) + 1);
381 strncat( driver_path, "/", strlen("/") );
382 strncat( driver_path, driver_name, strlen(driver_name) );
383 strncat( driver_path, DRIVER_EXTENSION, strlen(DRIVER_EXTENSION) );
385 va_infoMessage(dpy, "Trying to open %s\n", driver_path);
387 handle = dlopen( driver_path, RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE );
389 handle = dlopen( driver_path, RTLD_NOW| RTLD_GLOBAL);
392 /* Don't give errors for non-existing files */
393 if (0 == access( driver_path, F_OK))
394 va_errorMessage(dpy, "dlopen of %s failed: %s\n", driver_path, dlerror());
396 VADriverInit init_func = NULL;
397 char init_func_s[256];
400 static const struct {
403 } compatible_versions[] = {
404 { VA_MAJOR_VERSION, VA_MINOR_VERSION },
408 for (i = 0; compatible_versions[i].major >= 0; i++) {
409 if (va_getDriverInitName(init_func_s, sizeof(init_func_s),
410 compatible_versions[i].major,
411 compatible_versions[i].minor)) {
412 init_func = (VADriverInit)dlsym(handle, init_func_s);
414 va_infoMessage(dpy, "Found init function %s\n", init_func_s);
420 if (compatible_versions[i].major < 0) {
421 va_errorMessage(dpy, "%s has no function %s\n",
422 driver_path, init_func_s);
425 struct VADriverVTable *vtable = ctx->vtable;
426 struct VADriverVTableVPP *vtable_vpp = ctx->vtable_vpp;
428 vaStatus = VA_STATUS_SUCCESS;
430 vtable = calloc(1, sizeof(*vtable));
432 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
434 ctx->vtable = vtable;
437 vtable_vpp = calloc(1, sizeof(*vtable_vpp));
439 vtable_vpp->version = VA_DRIVER_VTABLE_VPP_VERSION;
441 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
443 ctx->vtable_vpp = vtable_vpp;
445 if (init_func && VA_STATUS_SUCCESS == vaStatus)
446 vaStatus = (*init_func)(ctx);
448 if (VA_STATUS_SUCCESS == vaStatus) {
449 CHECK_MAXIMUM(vaStatus, ctx, profiles);
450 CHECK_MAXIMUM(vaStatus, ctx, entrypoints);
451 CHECK_MAXIMUM(vaStatus, ctx, attributes);
452 CHECK_MAXIMUM(vaStatus, ctx, image_formats);
453 CHECK_MAXIMUM(vaStatus, ctx, subpic_formats);
454 CHECK_MAXIMUM(vaStatus, ctx, display_attributes);
455 CHECK_STRING(vaStatus, ctx, vendor);
456 CHECK_VTABLE(vaStatus, ctx, Terminate);
457 CHECK_VTABLE(vaStatus, ctx, QueryConfigProfiles);
458 CHECK_VTABLE(vaStatus, ctx, QueryConfigEntrypoints);
459 CHECK_VTABLE(vaStatus, ctx, QueryConfigAttributes);
460 CHECK_VTABLE(vaStatus, ctx, CreateConfig);
461 CHECK_VTABLE(vaStatus, ctx, DestroyConfig);
462 CHECK_VTABLE(vaStatus, ctx, GetConfigAttributes);
463 CHECK_VTABLE(vaStatus, ctx, CreateSurfaces);
464 CHECK_VTABLE(vaStatus, ctx, DestroySurfaces);
465 CHECK_VTABLE(vaStatus, ctx, CreateContext);
466 CHECK_VTABLE(vaStatus, ctx, DestroyContext);
467 CHECK_VTABLE(vaStatus, ctx, CreateBuffer);
468 CHECK_VTABLE(vaStatus, ctx, BufferSetNumElements);
469 CHECK_VTABLE(vaStatus, ctx, MapBuffer);
470 CHECK_VTABLE(vaStatus, ctx, UnmapBuffer);
471 CHECK_VTABLE(vaStatus, ctx, DestroyBuffer);
472 CHECK_VTABLE(vaStatus, ctx, BeginPicture);
473 CHECK_VTABLE(vaStatus, ctx, RenderPicture);
474 CHECK_VTABLE(vaStatus, ctx, EndPicture);
475 CHECK_VTABLE(vaStatus, ctx, SyncSurface);
476 CHECK_VTABLE(vaStatus, ctx, QuerySurfaceStatus);
477 CHECK_VTABLE(vaStatus, ctx, PutSurface);
478 CHECK_VTABLE(vaStatus, ctx, QueryImageFormats);
479 CHECK_VTABLE(vaStatus, ctx, CreateImage);
480 CHECK_VTABLE(vaStatus, ctx, DeriveImage);
481 CHECK_VTABLE(vaStatus, ctx, DestroyImage);
482 CHECK_VTABLE(vaStatus, ctx, SetImagePalette);
483 CHECK_VTABLE(vaStatus, ctx, GetImage);
484 CHECK_VTABLE(vaStatus, ctx, PutImage);
485 CHECK_VTABLE(vaStatus, ctx, QuerySubpictureFormats);
486 CHECK_VTABLE(vaStatus, ctx, CreateSubpicture);
487 CHECK_VTABLE(vaStatus, ctx, DestroySubpicture);
488 CHECK_VTABLE(vaStatus, ctx, SetSubpictureImage);
489 CHECK_VTABLE(vaStatus, ctx, SetSubpictureChromakey);
490 CHECK_VTABLE(vaStatus, ctx, SetSubpictureGlobalAlpha);
491 CHECK_VTABLE(vaStatus, ctx, AssociateSubpicture);
492 CHECK_VTABLE(vaStatus, ctx, DeassociateSubpicture);
493 CHECK_VTABLE(vaStatus, ctx, QueryDisplayAttributes);
494 CHECK_VTABLE(vaStatus, ctx, GetDisplayAttributes);
495 CHECK_VTABLE(vaStatus, ctx, SetDisplayAttributes);
497 if (VA_STATUS_SUCCESS != vaStatus) {
498 va_errorMessage(dpy, "%s init failed\n", driver_path);
501 if (VA_STATUS_SUCCESS == vaStatus)
502 ctx->handle = handle;
509 driver_dir = strtok_r(NULL, ":", &saveptr);
517 VAPrivFunc vaGetLibFunc(VADisplay dpy, const char *func)
519 VADriverContextP ctx;
520 if (!vaDisplayIsValid(dpy))
524 if (NULL == ctx->handle)
527 return (VAPrivFunc) dlsym(ctx->handle, func);
532 * Returns a short english description of error_status
534 const char *vaErrorStr(VAStatus error_status)
536 switch(error_status) {
537 case VA_STATUS_SUCCESS:
538 return "success (no error)";
539 case VA_STATUS_ERROR_OPERATION_FAILED:
540 return "operation failed";
541 case VA_STATUS_ERROR_ALLOCATION_FAILED:
542 return "resource allocation failed";
543 case VA_STATUS_ERROR_INVALID_DISPLAY:
544 return "invalid VADisplay";
545 case VA_STATUS_ERROR_INVALID_CONFIG:
546 return "invalid VAConfigID";
547 case VA_STATUS_ERROR_INVALID_CONTEXT:
548 return "invalid VAContextID";
549 case VA_STATUS_ERROR_INVALID_SURFACE:
550 return "invalid VASurfaceID";
551 case VA_STATUS_ERROR_INVALID_BUFFER:
552 return "invalid VABufferID";
553 case VA_STATUS_ERROR_INVALID_IMAGE:
554 return "invalid VAImageID";
555 case VA_STATUS_ERROR_INVALID_SUBPICTURE:
556 return "invalid VASubpictureID";
557 case VA_STATUS_ERROR_ATTR_NOT_SUPPORTED:
558 return "attribute not supported";
559 case VA_STATUS_ERROR_MAX_NUM_EXCEEDED:
560 return "list argument exceeds maximum number";
561 case VA_STATUS_ERROR_UNSUPPORTED_PROFILE:
562 return "the requested VAProfile is not supported";
563 case VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT:
564 return "the requested VAEntryPoint is not supported";
565 case VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT:
566 return "the requested RT Format is not supported";
567 case VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE:
568 return "the requested VABufferType is not supported";
569 case VA_STATUS_ERROR_SURFACE_BUSY:
570 return "surface is in use";
571 case VA_STATUS_ERROR_FLAG_NOT_SUPPORTED:
572 return "flag not supported";
573 case VA_STATUS_ERROR_INVALID_PARAMETER:
574 return "invalid parameter";
575 case VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED:
576 return "resolution not supported";
577 case VA_STATUS_ERROR_UNIMPLEMENTED:
578 return "the requested function is not implemented";
579 case VA_STATUS_ERROR_SURFACE_IN_DISPLAYING:
580 return "surface is in displaying (may by overlay)" ;
581 case VA_STATUS_ERROR_INVALID_IMAGE_FORMAT:
582 return "invalid VAImageFormat";
583 case VA_STATUS_ERROR_INVALID_VALUE:
584 return "an invalid/unsupported value was supplied";
585 case VA_STATUS_ERROR_UNSUPPORTED_FILTER:
586 return "the requested filter is not supported";
587 case VA_STATUS_ERROR_INVALID_FILTER_CHAIN:
588 return "an invalid filter chain was supplied";
589 case VA_STATUS_ERROR_UNKNOWN:
590 return "unknown libva error";
592 return "unknown libva error / description missing";
595 const static char *prefer_driver_list[4] = {
602 VAStatus vaSetDriverName(
607 VADriverContextP ctx;
608 VAStatus vaStatus = VA_STATUS_SUCCESS;
609 char *override_driver_name = NULL;
613 if (geteuid() != getuid()) {
614 vaStatus = VA_STATUS_ERROR_OPERATION_FAILED;
615 va_errorMessage(dpy, "no permission to vaSetDriverName\n");
619 if (strlen(driver_name) == 0 || strlen(driver_name) >=256) {
620 vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
621 va_errorMessage(dpy, "vaSetDriverName returns %s\n",
622 vaErrorStr(vaStatus));
627 for (i = 0; i < sizeof(prefer_driver_list) / sizeof(char *); i++) {
628 if (strlen(prefer_driver_list[i]) != strlen(driver_name))
630 if (!strncmp(prefer_driver_list[i], driver_name, strlen(driver_name))) {
637 vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
638 va_errorMessage(dpy, "vaSetDriverName returns %s. Incorrect parameter\n",
639 vaErrorStr(vaStatus));
643 override_driver_name = strdup(driver_name);
645 if (!override_driver_name) {
646 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
647 va_errorMessage(dpy, "vaSetDriverName returns %s. Out of Memory\n",
648 vaErrorStr(vaStatus));
652 ctx->override_driver_name = override_driver_name;
653 return VA_STATUS_SUCCESS;
656 VAStatus vaInitialize (
658 int *major_version, /* out */
659 int *minor_version /* out */
662 const char *driver_name_env = NULL;
663 char *driver_name = NULL;
665 VADriverContextP ctx;
677 va_infoMessage(dpy, "VA-API version %s\n", VA_VERSION_S);
679 vaStatus = va_getDriverName(dpy, &driver_name);
681 if (!ctx->override_driver_name) {
682 va_infoMessage(dpy, "va_getDriverName() returns %d\n", vaStatus);
684 driver_name_env = getenv("LIBVA_DRIVER_NAME");
685 } else if (vaStatus == VA_STATUS_SUCCESS) {
689 driver_name = strdup(ctx->override_driver_name);
691 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
692 va_errorMessage(dpy, "vaInitialize() failed with %s, out of memory\n",
693 vaErrorStr(vaStatus));
696 va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
699 if (driver_name_env && (geteuid() == getuid())) {
700 /* Don't allow setuid apps to use LIBVA_DRIVER_NAME */
701 if (driver_name) /* memory is allocated in va_getDriverName */
704 driver_name = strdup(driver_name_env);
705 vaStatus = VA_STATUS_SUCCESS;
706 va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
709 if ((VA_STATUS_SUCCESS == vaStatus) && (driver_name != NULL)) {
710 vaStatus = va_openDriver(dpy, driver_name);
711 va_infoMessage(dpy, "va_openDriver() returns %d\n", vaStatus);
713 *major_version = VA_MAJOR_VERSION;
714 *minor_version = VA_MINOR_VERSION;
716 va_errorMessage(dpy, "va_getDriverName() failed with %s,driver_name=%s\n",
717 vaErrorStr(vaStatus), driver_name);
722 VA_TRACE_LOG(va_TraceInitialize, dpy, major_version, minor_version);
729 * After this call, all library internal resources will be cleaned up
731 VAStatus vaTerminate (
735 VAStatus vaStatus = VA_STATUS_SUCCESS;
736 VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
737 VADriverContextP old_ctx;
742 if (old_ctx->handle) {
743 vaStatus = old_ctx->vtable->vaTerminate(old_ctx);
744 dlclose(old_ctx->handle);
745 old_ctx->handle = NULL;
747 free(old_ctx->vtable);
748 old_ctx->vtable = NULL;
749 free(old_ctx->vtable_vpp);
750 old_ctx->vtable_vpp = NULL;
752 if (old_ctx->override_driver_name) {
753 free(old_ctx->override_driver_name);
754 old_ctx->override_driver_name = NULL;
757 VA_TRACE_LOG(va_TraceTerminate, dpy);
763 if (VA_STATUS_SUCCESS == vaStatus)
764 pDisplayContext->vaDestroy(pDisplayContext);
770 * vaQueryVendorString returns a pointer to a zero-terminated string
771 * describing some aspects of the VA implemenation on a specific
772 * hardware accelerator. The format of the returned string is:
773 * <vendorname>-<major_version>-<minor_version>-<addtional_info>
774 * e.g. for the Intel GMA500 implementation, an example would be:
775 * "IntelGMA500-1.0-0.2-patch3
777 const char *vaQueryVendorString (
781 if (!vaDisplayIsValid(dpy))
784 return CTX(dpy)->str_vendor;
788 /* Get maximum number of profiles supported by the implementation */
789 int vaMaxNumProfiles (
793 if (!vaDisplayIsValid(dpy))
796 return CTX(dpy)->max_profiles;
799 /* Get maximum number of entrypoints supported by the implementation */
800 int vaMaxNumEntrypoints (
804 if (!vaDisplayIsValid(dpy))
807 return CTX(dpy)->max_entrypoints;
811 /* Get maximum number of attributs supported by the implementation */
812 int vaMaxNumConfigAttributes (
816 if (!vaDisplayIsValid(dpy))
819 return CTX(dpy)->max_attributes;
822 VAStatus vaQueryConfigEntrypoints (
825 VAEntrypoint *entrypoints, /* out */
826 int *num_entrypoints /* out */
829 VADriverContextP ctx;
833 return ctx->vtable->vaQueryConfigEntrypoints ( ctx, profile, entrypoints, num_entrypoints);
836 VAStatus vaGetConfigAttributes (
839 VAEntrypoint entrypoint,
840 VAConfigAttrib *attrib_list, /* in/out */
844 VADriverContextP ctx;
848 return ctx->vtable->vaGetConfigAttributes ( ctx, profile, entrypoint, attrib_list, num_attribs );
851 VAStatus vaQueryConfigProfiles (
853 VAProfile *profile_list, /* out */
854 int *num_profiles /* out */
857 VADriverContextP ctx;
861 return ctx->vtable->vaQueryConfigProfiles ( ctx, profile_list, num_profiles );
864 VAStatus vaCreateConfig (
867 VAEntrypoint entrypoint,
868 VAConfigAttrib *attrib_list,
870 VAConfigID *config_id /* out */
873 VADriverContextP ctx;
874 VAStatus vaStatus = VA_STATUS_SUCCESS;
879 vaStatus = ctx->vtable->vaCreateConfig ( ctx, profile, entrypoint, attrib_list, num_attribs, config_id );
881 /* record the current entrypoint for further trace/fool determination */
882 VA_TRACE_ALL(va_TraceCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
883 VA_FOOL_FUNC(va_FoolCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
888 VAStatus vaDestroyConfig (
893 VADriverContextP ctx;
894 VAStatus vaStatus = VA_STATUS_SUCCESS;
899 vaStatus = ctx->vtable->vaDestroyConfig ( ctx, config_id );
901 VA_TRACE_ALL(va_TraceDestroyConfig, dpy, config_id);
906 VAStatus vaQueryConfigAttributes (
908 VAConfigID config_id,
909 VAProfile *profile, /* out */
910 VAEntrypoint *entrypoint, /* out */
911 VAConfigAttrib *attrib_list,/* out */
912 int *num_attribs /* out */
915 VADriverContextP ctx;
919 return ctx->vtable->vaQueryConfigAttributes( ctx, config_id, profile, entrypoint, attrib_list, num_attribs);
922 VAStatus vaQueryProcessingRate (
924 VAConfigID config_id,
925 VAProcessingRateParameter *proc_buf,
926 unsigned int *processing_rate /* out */
929 VADriverContextP ctx;
932 if(!ctx->vtable->vaQueryProcessingRate)
933 return VA_STATUS_ERROR_UNIMPLEMENTED;
934 return ctx->vtable->vaQueryProcessingRate( ctx, config_id, proc_buf, processing_rate);
937 /* XXX: this is a slow implementation that will be removed */
939 va_impl_query_surface_attributes(
940 VADriverContextP ctx,
942 VASurfaceAttrib *out_attribs,
943 unsigned int *out_num_attribs_ptr
946 VASurfaceAttrib *attribs = NULL;
947 unsigned int num_attribs, n;
948 VASurfaceAttrib *out_attrib;
949 unsigned int out_num_attribs;
950 VAImageFormat *image_formats = NULL;
951 int num_image_formats, i;
954 /* List of surface attributes to query */
955 struct va_surface_attrib_map {
956 VASurfaceAttribType type;
957 VAGenericValueType value_type;
959 static const struct va_surface_attrib_map attribs_map[] = {
960 { VASurfaceAttribMinWidth, VAGenericValueTypeInteger },
961 { VASurfaceAttribMaxWidth, VAGenericValueTypeInteger },
962 { VASurfaceAttribMinHeight, VAGenericValueTypeInteger },
963 { VASurfaceAttribMaxHeight, VAGenericValueTypeInteger },
964 { VASurfaceAttribMemoryType, VAGenericValueTypeInteger },
965 { VASurfaceAttribNone, }
968 if (!out_attribs || !out_num_attribs_ptr)
969 return VA_STATUS_ERROR_INVALID_PARAMETER;
970 if (!ctx->vtable->vaGetSurfaceAttributes)
971 return VA_STATUS_ERROR_UNIMPLEMENTED;
973 num_image_formats = ctx->max_image_formats;
974 image_formats = malloc(num_image_formats * sizeof(*image_formats));
975 if (!image_formats) {
976 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
980 va_status = ctx->vtable->vaQueryImageFormats(
981 ctx, image_formats, &num_image_formats);
982 if (va_status != VA_STATUS_SUCCESS)
985 num_attribs = VASurfaceAttribCount + num_image_formats;
986 attribs = malloc(num_attribs * sizeof(*attribs));
988 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
992 /* Initialize with base surface attributes, except pixel-formats */
993 for (n = 0; attribs_map[n].type != VASurfaceAttribNone; n++) {
994 VASurfaceAttrib * const attrib = &attribs[n];
995 attrib->type = attribs_map[n].type;
996 attrib->flags = VA_SURFACE_ATTRIB_GETTABLE;
997 attrib->value.type = attribs_map[n].value_type;
1000 /* Append image formats */
1001 for (i = 0; i < num_image_formats; i++) {
1002 VASurfaceAttrib * const attrib = &attribs[n];
1003 attrib->type = VASurfaceAttribPixelFormat;
1004 attrib->flags = VA_SURFACE_ATTRIB_GETTABLE|VA_SURFACE_ATTRIB_SETTABLE;
1005 attrib->value.type = VAGenericValueTypeInteger;
1006 attrib->value.value.i = image_formats[i].fourcc;
1007 if (++n == num_attribs) {
1008 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
1014 va_status = ctx->vtable->vaGetSurfaceAttributes(
1015 ctx, config, attribs, num_attribs);
1016 if (va_status != VA_STATUS_SUCCESS)
1019 /* Remove invalid entries */
1020 out_num_attribs = 0;
1021 for (n = 0; n < num_attribs; n++) {
1022 VASurfaceAttrib * const attrib = &attribs[n];
1024 if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
1027 // Accept all surface attributes that are not pixel-formats
1028 if (attrib->type != VASurfaceAttribPixelFormat) {
1033 // Drop invalid pixel-format attribute
1034 if (!attrib->value.value.i) {
1035 attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
1039 // Check for duplicates
1040 int is_duplicate = 0;
1041 for (i = n - 1; i >= 0 && !is_duplicate; i--) {
1042 const VASurfaceAttrib * const prev_attrib = &attribs[i];
1043 if (prev_attrib->type != VASurfaceAttribPixelFormat)
1045 is_duplicate = prev_attrib->value.value.i == attrib->value.value.i;
1048 attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
1053 if (*out_num_attribs_ptr < out_num_attribs) {
1054 *out_num_attribs_ptr = out_num_attribs;
1055 va_status = VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
1059 out_attrib = out_attribs;
1060 for (n = 0; n < num_attribs; n++) {
1061 const VASurfaceAttrib * const attrib = &attribs[n];
1062 if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
1064 *out_attrib++ = *attrib;
1069 free(image_formats);
1074 vaQuerySurfaceAttributes(
1077 VASurfaceAttrib *attrib_list,
1078 unsigned int *num_attribs
1081 VADriverContextP ctx;
1087 return VA_STATUS_ERROR_INVALID_DISPLAY;
1089 if (!ctx->vtable->vaQuerySurfaceAttributes)
1090 vaStatus = va_impl_query_surface_attributes(ctx, config,
1091 attrib_list, num_attribs);
1093 vaStatus = ctx->vtable->vaQuerySurfaceAttributes(ctx, config,
1094 attrib_list, num_attribs);
1096 VA_TRACE_LOG(va_TraceQuerySurfaceAttributes, dpy, config, attrib_list, num_attribs);
1104 unsigned int format,
1106 unsigned int height,
1107 VASurfaceID *surfaces,
1108 unsigned int num_surfaces,
1109 VASurfaceAttrib *attrib_list,
1110 unsigned int num_attribs
1113 VADriverContextP ctx;
1119 return VA_STATUS_ERROR_INVALID_DISPLAY;
1121 if (ctx->vtable->vaCreateSurfaces2)
1122 vaStatus = ctx->vtable->vaCreateSurfaces2(ctx, format, width, height,
1123 surfaces, num_surfaces,
1124 attrib_list, num_attribs);
1125 else if (attrib_list && num_attribs > 0)
1126 vaStatus = VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
1128 vaStatus = ctx->vtable->vaCreateSurfaces(ctx, width, height, format,
1129 num_surfaces, surfaces);
1130 VA_TRACE_LOG(va_TraceCreateSurfaces,
1131 dpy, width, height, format, num_surfaces, surfaces,
1132 attrib_list, num_attribs);
1138 VAStatus vaDestroySurfaces (
1140 VASurfaceID *surface_list,
1144 VADriverContextP ctx;
1150 VA_TRACE_LOG(va_TraceDestroySurfaces,
1151 dpy, surface_list, num_surfaces);
1153 vaStatus = ctx->vtable->vaDestroySurfaces( ctx, surface_list, num_surfaces );
1158 VAStatus vaCreateContext (
1160 VAConfigID config_id,
1164 VASurfaceID *render_targets,
1165 int num_render_targets,
1166 VAContextID *context /* out */
1169 VADriverContextP ctx;
1175 vaStatus = ctx->vtable->vaCreateContext( ctx, config_id, picture_width, picture_height,
1176 flag, render_targets, num_render_targets, context );
1178 /* keep current encode/decode resoluton */
1179 VA_TRACE_ALL(va_TraceCreateContext, dpy, config_id, picture_width, picture_height, flag, render_targets, num_render_targets, context);
1184 VAStatus vaDestroyContext (
1189 VADriverContextP ctx;
1195 vaStatus = ctx->vtable->vaDestroyContext( ctx, context );
1197 VA_TRACE_ALL(va_TraceDestroyContext, dpy, context);
1202 VAStatus vaCreateMFContext (
1204 VAMFContextID *mf_context /* out */
1207 VADriverContextP ctx;
1212 if(ctx->vtable->vaCreateMFContext == NULL)
1213 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1216 vaStatus = ctx->vtable->vaCreateMFContext( ctx, mf_context);
1217 VA_TRACE_ALL(va_TraceCreateMFContext, dpy, mf_context);
1223 VAStatus vaMFAddContext (
1225 VAMFContextID mf_context,
1229 VADriverContextP ctx;
1235 if(ctx->vtable->vaMFAddContext == NULL)
1236 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1239 vaStatus = ctx->vtable->vaMFAddContext( ctx, context, mf_context);
1240 VA_TRACE_ALL(va_TraceMFAddContext, dpy, context, mf_context);
1246 VAStatus vaMFReleaseContext (
1248 VAMFContextID mf_context,
1252 VADriverContextP ctx;
1257 if(ctx->vtable->vaMFReleaseContext == NULL)
1258 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1261 vaStatus = ctx->vtable->vaMFReleaseContext( ctx, context, mf_context);
1262 VA_TRACE_ALL(va_TraceMFReleaseContext, dpy, context, mf_context);
1268 VAStatus vaMFSubmit (
1270 VAMFContextID mf_context,
1271 VAContextID *contexts,
1275 VADriverContextP ctx;
1280 CHECK_VTABLE(vaStatus, ctx, MFSubmit);
1281 if(ctx->vtable->vaMFSubmit == NULL)
1282 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1285 vaStatus = ctx->vtable->vaMFSubmit( ctx, mf_context, contexts, num_contexts);
1286 VA_TRACE_ALL(va_TraceMFSubmit, dpy, mf_context, contexts, num_contexts);
1292 VAStatus vaCreateBuffer (
1294 VAContextID context, /* in */
1295 VABufferType type, /* in */
1296 unsigned int size, /* in */
1297 unsigned int num_elements, /* in */
1298 void *data, /* in */
1299 VABufferID *buf_id /* out */
1302 VADriverContextP ctx;
1308 VA_FOOL_FUNC(va_FoolCreateBuffer, dpy, context, type, size, num_elements, data, buf_id);
1310 vaStatus = ctx->vtable->vaCreateBuffer( ctx, context, type, size, num_elements, data, buf_id);
1312 VA_TRACE_LOG(va_TraceCreateBuffer,
1313 dpy, context, type, size, num_elements, data, buf_id);
1318 VAStatus vaCreateBuffer2 (
1320 VAContextID context,
1323 unsigned int height,
1324 unsigned int *unit_size,
1325 unsigned int *pitch,
1329 VADriverContextP ctx;
1334 if(!ctx->vtable->vaCreateBuffer2)
1335 return VA_STATUS_ERROR_UNIMPLEMENTED;
1337 vaStatus = ctx->vtable->vaCreateBuffer2( ctx, context, type, width, height ,unit_size, pitch, buf_id);
1339 VA_TRACE_LOG(va_TraceCreateBuffer,
1340 dpy, context, type, *pitch, height, NULL, buf_id);
1345 VAStatus vaBufferSetNumElements (
1347 VABufferID buf_id, /* in */
1348 unsigned int num_elements /* in */
1351 VADriverContextP ctx;
1355 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1357 return ctx->vtable->vaBufferSetNumElements( ctx, buf_id, num_elements );
1361 VAStatus vaMapBuffer (
1363 VABufferID buf_id, /* in */
1364 void **pbuf /* out */
1367 VADriverContextP ctx;
1373 VA_FOOL_FUNC(va_FoolMapBuffer, dpy, buf_id, pbuf);
1375 va_status = ctx->vtable->vaMapBuffer( ctx, buf_id, pbuf );
1377 VA_TRACE_ALL(va_TraceMapBuffer, dpy, buf_id, pbuf);
1382 VAStatus vaUnmapBuffer (
1384 VABufferID buf_id /* in */
1387 VADriverContextP ctx;
1391 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1393 return ctx->vtable->vaUnmapBuffer( ctx, buf_id );
1396 VAStatus vaDestroyBuffer (
1398 VABufferID buffer_id
1401 VADriverContextP ctx;
1405 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1407 VA_TRACE_LOG(va_TraceDestroyBuffer,
1410 return ctx->vtable->vaDestroyBuffer( ctx, buffer_id );
1413 VAStatus vaBufferInfo (
1415 VAContextID context, /* in */
1416 VABufferID buf_id, /* in */
1417 VABufferType *type, /* out */
1418 unsigned int *size, /* out */
1419 unsigned int *num_elements /* out */
1422 VADriverContextP ctx;
1427 VA_FOOL_FUNC(va_FoolBufferInfo, dpy, buf_id, type, size, num_elements);
1429 return ctx->vtable->vaBufferInfo( ctx, buf_id, type, size, num_elements );
1432 /* Locks buffer for external API usage */
1434 vaAcquireBufferHandle(VADisplay dpy, VABufferID buf_id, VABufferInfo *buf_info)
1436 VADriverContextP ctx;
1441 if (!ctx->vtable->vaAcquireBufferHandle)
1442 return VA_STATUS_ERROR_UNIMPLEMENTED;
1443 return ctx->vtable->vaAcquireBufferHandle(ctx, buf_id, buf_info);
1446 /* Unlocks buffer after usage from external API */
1448 vaReleaseBufferHandle(VADisplay dpy, VABufferID buf_id)
1450 VADriverContextP ctx;
1455 if (!ctx->vtable->vaReleaseBufferHandle)
1456 return VA_STATUS_ERROR_UNIMPLEMENTED;
1457 return ctx->vtable->vaReleaseBufferHandle(ctx, buf_id);
1460 VAStatus vaBeginPicture (
1462 VAContextID context,
1463 VASurfaceID render_target
1466 VADriverContextP ctx;
1472 VA_TRACE_ALL(va_TraceBeginPicture, dpy, context, render_target);
1473 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1475 va_status = ctx->vtable->vaBeginPicture( ctx, context, render_target );
1480 VAStatus vaRenderPicture (
1482 VAContextID context,
1483 VABufferID *buffers,
1487 VADriverContextP ctx;
1492 VA_TRACE_LOG(va_TraceRenderPicture, dpy, context, buffers, num_buffers);
1493 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1495 return ctx->vtable->vaRenderPicture( ctx, context, buffers, num_buffers );
1498 VAStatus vaEndPicture (
1503 VAStatus va_status = VA_STATUS_SUCCESS;
1504 VADriverContextP ctx;
1509 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1511 va_status = ctx->vtable->vaEndPicture( ctx, context );
1513 /* dump surface content */
1514 VA_TRACE_ALL(va_TraceEndPicture, dpy, context, 1);
1519 VAStatus vaSyncSurface (
1521 VASurfaceID render_target
1525 VADriverContextP ctx;
1530 va_status = ctx->vtable->vaSyncSurface( ctx, render_target );
1531 VA_TRACE_LOG(va_TraceSyncSurface, dpy, render_target);
1536 VAStatus vaQuerySurfaceStatus (
1538 VASurfaceID render_target,
1539 VASurfaceStatus *status /* out */
1543 VADriverContextP ctx;
1547 va_status = ctx->vtable->vaQuerySurfaceStatus( ctx, render_target, status );
1549 VA_TRACE_LOG(va_TraceQuerySurfaceStatus, dpy, render_target, status);
1554 VAStatus vaQuerySurfaceError (
1556 VASurfaceID surface,
1557 VAStatus error_status,
1558 void **error_info /*out*/
1562 VADriverContextP ctx;
1566 va_status = ctx->vtable->vaQuerySurfaceError( ctx, surface, error_status, error_info );
1568 VA_TRACE_LOG(va_TraceQuerySurfaceError, dpy, surface, error_status, error_info);
1573 /* Get maximum number of image formats supported by the implementation */
1574 int vaMaxNumImageFormats (
1578 if (!vaDisplayIsValid(dpy))
1581 return CTX(dpy)->max_image_formats;
1584 VAStatus vaQueryImageFormats (
1586 VAImageFormat *format_list, /* out */
1587 int *num_formats /* out */
1590 VADriverContextP ctx;
1594 return ctx->vtable->vaQueryImageFormats ( ctx, format_list, num_formats);
1598 * The width and height fields returned in the VAImage structure may get
1599 * enlarged for some YUV formats. The size of the data buffer that needs
1600 * to be allocated will be given in the "data_size" field in VAImage.
1601 * Image data is not allocated by this function. The client should
1602 * allocate the memory and fill in the VAImage structure's data field
1603 * after looking at "data_size" returned from the library.
1605 VAStatus vaCreateImage (
1607 VAImageFormat *format,
1610 VAImage *image /* out */
1613 VADriverContextP ctx;
1617 return ctx->vtable->vaCreateImage ( ctx, format, width, height, image);
1621 * Should call DestroyImage before destroying the surface it is bound to
1623 VAStatus vaDestroyImage (
1628 VADriverContextP ctx;
1632 return ctx->vtable->vaDestroyImage ( ctx, image);
1635 VAStatus vaSetImagePalette (
1638 unsigned char *palette
1641 VADriverContextP ctx;
1645 return ctx->vtable->vaSetImagePalette ( ctx, image, palette);
1649 * Retrieve surface data into a VAImage
1650 * Image must be in a format supported by the implementation
1652 VAStatus vaGetImage (
1654 VASurfaceID surface,
1655 int x, /* coordinates of the upper left source pixel */
1657 unsigned int width, /* width and height of the region */
1658 unsigned int height,
1662 VADriverContextP ctx;
1666 return ctx->vtable->vaGetImage ( ctx, surface, x, y, width, height, image);
1670 * Copy data from a VAImage to a surface
1671 * Image must be in a format supported by the implementation
1673 VAStatus vaPutImage (
1675 VASurfaceID surface,
1679 unsigned int src_width,
1680 unsigned int src_height,
1683 unsigned int dest_width,
1684 unsigned int dest_height
1687 VADriverContextP ctx;
1691 return ctx->vtable->vaPutImage ( ctx, surface, image, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height );
1695 * Derive an VAImage from an existing surface.
1696 * This interface will derive a VAImage and corresponding image buffer from
1697 * an existing VA Surface. The image buffer can then be mapped/unmapped for
1698 * direct CPU access. This operation is only possible on implementations with
1699 * direct rendering capabilities and internal surface formats that can be
1700 * represented with a VAImage. When the operation is not possible this interface
1701 * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back
1702 * to using vaCreateImage + vaPutImage to accomplish the same task in an
1705 * Implementations should only return success when the resulting image buffer
1706 * would be useable with vaMap/Unmap.
1708 * When directly accessing a surface special care must be taken to insure
1709 * proper synchronization with the graphics hardware. Clients should call
1710 * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent
1711 * rendering or currently being displayed by an overlay.
1713 * Additionally nothing about the contents of a surface should be assumed
1714 * following a vaPutSurface. Implementations are free to modify the surface for
1715 * scaling or subpicture blending within a call to vaPutImage.
1717 * Calls to vaPutImage or vaGetImage using the same surface from which the image
1718 * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or
1719 * vaGetImage with other surfaces is supported.
1721 * An image created with vaDeriveImage should be freed with vaDestroyImage. The
1722 * image and image buffer structures will be destroyed; however, the underlying
1723 * surface will remain unchanged until freed with vaDestroySurfaces.
1725 VAStatus vaDeriveImage (
1727 VASurfaceID surface,
1728 VAImage *image /* out */
1731 VADriverContextP ctx;
1735 return ctx->vtable->vaDeriveImage ( ctx, surface, image );
1739 /* Get maximum number of subpicture formats supported by the implementation */
1740 int vaMaxNumSubpictureFormats (
1744 if (!vaDisplayIsValid(dpy))
1747 return CTX(dpy)->max_subpic_formats;
1751 * Query supported subpicture formats
1752 * The caller must provide a "format_list" array that can hold at
1753 * least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag
1754 * for each format to indicate additional capabilities for that format. The actual
1755 * number of formats returned in "format_list" is returned in "num_formats".
1757 VAStatus vaQuerySubpictureFormats (
1759 VAImageFormat *format_list, /* out */
1760 unsigned int *flags, /* out */
1761 unsigned int *num_formats /* out */
1764 VADriverContextP ctx;
1769 return ctx->vtable->vaQuerySubpictureFormats ( ctx, format_list, flags, num_formats);
1773 * Subpictures are created with an image associated.
1775 VAStatus vaCreateSubpicture (
1778 VASubpictureID *subpicture /* out */
1781 VADriverContextP ctx;
1785 return ctx->vtable->vaCreateSubpicture ( ctx, image, subpicture );
1789 * Destroy the subpicture before destroying the image it is assocated to
1791 VAStatus vaDestroySubpicture (
1793 VASubpictureID subpicture
1796 VADriverContextP ctx;
1800 return ctx->vtable->vaDestroySubpicture ( ctx, subpicture);
1803 VAStatus vaSetSubpictureImage (
1805 VASubpictureID subpicture,
1809 VADriverContextP ctx;
1813 return ctx->vtable->vaSetSubpictureImage ( ctx, subpicture, image);
1818 * If chromakey is enabled, then the area where the source value falls within
1819 * the chromakey [min, max] range is transparent
1821 VAStatus vaSetSubpictureChromakey (
1823 VASubpictureID subpicture,
1824 unsigned int chromakey_min,
1825 unsigned int chromakey_max,
1826 unsigned int chromakey_mask
1829 VADriverContextP ctx;
1833 return ctx->vtable->vaSetSubpictureChromakey ( ctx, subpicture, chromakey_min, chromakey_max, chromakey_mask );
1838 * Global alpha value is between 0 and 1. A value of 1 means fully opaque and
1839 * a value of 0 means fully transparent. If per-pixel alpha is also specified then
1840 * the overall alpha is per-pixel alpha multiplied by the global alpha
1842 VAStatus vaSetSubpictureGlobalAlpha (
1844 VASubpictureID subpicture,
1848 VADriverContextP ctx;
1852 return ctx->vtable->vaSetSubpictureGlobalAlpha ( ctx, subpicture, global_alpha );
1856 vaAssociateSubpicture associates the subpicture with the target_surface.
1857 It defines the region mapping between the subpicture and the target
1858 surface through source and destination rectangles (with the same width and height).
1859 Both will be displayed at the next call to vaPutSurface. Additional
1860 associations before the call to vaPutSurface simply overrides the association.
1862 VAStatus vaAssociateSubpicture (
1864 VASubpictureID subpicture,
1865 VASurfaceID *target_surfaces,
1867 short src_x, /* upper left offset in subpicture */
1869 unsigned short src_width,
1870 unsigned short src_height,
1871 short dest_x, /* upper left offset in surface */
1873 unsigned short dest_width,
1874 unsigned short dest_height,
1876 * whether to enable chroma-keying or global-alpha
1877 * see VA_SUBPICTURE_XXX values
1882 VADriverContextP ctx;
1886 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 );
1890 * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces.
1892 VAStatus vaDeassociateSubpicture (
1894 VASubpictureID subpicture,
1895 VASurfaceID *target_surfaces,
1899 VADriverContextP ctx;
1903 return ctx->vtable->vaDeassociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces );
1907 /* Get maximum number of display attributes supported by the implementation */
1908 int vaMaxNumDisplayAttributes (
1914 if (!vaDisplayIsValid(dpy))
1917 tmp = CTX(dpy)->max_display_attributes;
1919 VA_TRACE_LOG(va_TraceMaxNumDisplayAttributes, dpy, tmp);
1925 * Query display attributes
1926 * The caller must provide a "attr_list" array that can hold at
1927 * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
1928 * returned in "attr_list" is returned in "num_attributes".
1930 VAStatus vaQueryDisplayAttributes (
1932 VADisplayAttribute *attr_list, /* out */
1933 int *num_attributes /* out */
1936 VADriverContextP ctx;
1941 va_status = ctx->vtable->vaQueryDisplayAttributes ( ctx, attr_list, num_attributes );
1943 VA_TRACE_LOG(va_TraceQueryDisplayAttributes, dpy, attr_list, num_attributes);
1950 * Get display attributes
1951 * This function returns the current attribute values in "attr_list".
1952 * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
1953 * from vaQueryDisplayAttributes() can have their values retrieved.
1955 VAStatus vaGetDisplayAttributes (
1957 VADisplayAttribute *attr_list, /* in/out */
1961 VADriverContextP ctx;
1966 va_status = ctx->vtable->vaGetDisplayAttributes ( ctx, attr_list, num_attributes );
1968 VA_TRACE_LOG(va_TraceGetDisplayAttributes, dpy, attr_list, num_attributes);
1974 * Set display attributes
1975 * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
1976 * from vaQueryDisplayAttributes() can be set. If the attribute is not settable or
1977 * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
1979 VAStatus vaSetDisplayAttributes (
1981 VADisplayAttribute *attr_list,
1985 VADriverContextP ctx;
1990 va_status = ctx->vtable->vaSetDisplayAttributes ( ctx, attr_list, num_attributes );
1991 VA_TRACE_LOG(va_TraceSetDisplayAttributes, dpy, attr_list, num_attributes);
1996 VAStatus vaLockSurface(VADisplay dpy,
1997 VASurfaceID surface,
1998 unsigned int *fourcc, /* following are output argument */
1999 unsigned int *luma_stride,
2000 unsigned int *chroma_u_stride,
2001 unsigned int *chroma_v_stride,
2002 unsigned int *luma_offset,
2003 unsigned int *chroma_u_offset,
2004 unsigned int *chroma_v_offset,
2005 unsigned int *buffer_name,
2009 VADriverContextP ctx;
2013 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);
2017 VAStatus vaUnlockSurface(VADisplay dpy,
2021 VADriverContextP ctx;
2025 return ctx->vtable->vaUnlockSurface( ctx, surface );
2028 /* Video Processing */
2029 #define VA_VPP_INIT_CONTEXT(ctx, dpy) do { \
2030 CHECK_DISPLAY(dpy); \
2033 return VA_STATUS_ERROR_INVALID_DISPLAY; \
2036 #define VA_VPP_INVOKE(dpy, func, args) do { \
2037 if (!ctx->vtable_vpp->va##func) \
2038 return VA_STATUS_ERROR_UNIMPLEMENTED; \
2039 status = ctx->vtable_vpp->va##func args; \
2043 vaQueryVideoProcFilters(
2045 VAContextID context,
2046 VAProcFilterType *filters,
2047 unsigned int *num_filters
2050 VADriverContextP ctx;
2053 VA_VPP_INIT_CONTEXT(ctx, dpy);
2056 QueryVideoProcFilters,
2057 (ctx, context, filters, num_filters)
2063 vaQueryVideoProcFilterCaps(
2065 VAContextID context,
2066 VAProcFilterType type,
2068 unsigned int *num_filter_caps
2071 VADriverContextP ctx;
2074 VA_VPP_INIT_CONTEXT(ctx, dpy);
2077 QueryVideoProcFilterCaps,
2078 (ctx, context, type, filter_caps, num_filter_caps)
2084 vaQueryVideoProcPipelineCaps(
2086 VAContextID context,
2087 VABufferID *filters,
2088 unsigned int num_filters,
2089 VAProcPipelineCaps *pipeline_caps
2092 VADriverContextP ctx;
2095 VA_VPP_INIT_CONTEXT(ctx, dpy);
2098 QueryVideoProcPipelineCaps,
2099 (ctx, context, filters, num_filters, pipeline_caps)