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 },
405 { VA_MAJOR_VERSION, 1 },
406 { VA_MAJOR_VERSION, 0 },
410 for (i = 0; compatible_versions[i].major >= 0; i++) {
411 if (va_getDriverInitName(init_func_s, sizeof(init_func_s),
412 compatible_versions[i].major,
413 compatible_versions[i].minor)) {
414 init_func = (VADriverInit)dlsym(handle, init_func_s);
416 va_infoMessage(dpy, "Found init function %s\n", init_func_s);
422 if (compatible_versions[i].major < 0) {
423 va_errorMessage(dpy, "%s has no function %s\n",
424 driver_path, init_func_s);
427 struct VADriverVTable *vtable = ctx->vtable;
428 struct VADriverVTableVPP *vtable_vpp = ctx->vtable_vpp;
430 vaStatus = VA_STATUS_SUCCESS;
432 vtable = calloc(1, sizeof(*vtable));
434 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
436 ctx->vtable = vtable;
439 vtable_vpp = calloc(1, sizeof(*vtable_vpp));
441 vtable_vpp->version = VA_DRIVER_VTABLE_VPP_VERSION;
443 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
445 ctx->vtable_vpp = vtable_vpp;
447 if (init_func && VA_STATUS_SUCCESS == vaStatus)
448 vaStatus = (*init_func)(ctx);
450 if (VA_STATUS_SUCCESS == vaStatus) {
451 CHECK_MAXIMUM(vaStatus, ctx, profiles);
452 CHECK_MAXIMUM(vaStatus, ctx, entrypoints);
453 CHECK_MAXIMUM(vaStatus, ctx, attributes);
454 CHECK_MAXIMUM(vaStatus, ctx, image_formats);
455 CHECK_MAXIMUM(vaStatus, ctx, subpic_formats);
456 CHECK_STRING(vaStatus, ctx, vendor);
457 CHECK_VTABLE(vaStatus, ctx, Terminate);
458 CHECK_VTABLE(vaStatus, ctx, QueryConfigProfiles);
459 CHECK_VTABLE(vaStatus, ctx, QueryConfigEntrypoints);
460 CHECK_VTABLE(vaStatus, ctx, QueryConfigAttributes);
461 CHECK_VTABLE(vaStatus, ctx, CreateConfig);
462 CHECK_VTABLE(vaStatus, ctx, DestroyConfig);
463 CHECK_VTABLE(vaStatus, ctx, GetConfigAttributes);
464 CHECK_VTABLE(vaStatus, ctx, CreateSurfaces);
465 CHECK_VTABLE(vaStatus, ctx, DestroySurfaces);
466 CHECK_VTABLE(vaStatus, ctx, CreateContext);
467 CHECK_VTABLE(vaStatus, ctx, DestroyContext);
468 CHECK_VTABLE(vaStatus, ctx, CreateBuffer);
469 CHECK_VTABLE(vaStatus, ctx, BufferSetNumElements);
470 CHECK_VTABLE(vaStatus, ctx, MapBuffer);
471 CHECK_VTABLE(vaStatus, ctx, UnmapBuffer);
472 CHECK_VTABLE(vaStatus, ctx, DestroyBuffer);
473 CHECK_VTABLE(vaStatus, ctx, BeginPicture);
474 CHECK_VTABLE(vaStatus, ctx, RenderPicture);
475 CHECK_VTABLE(vaStatus, ctx, EndPicture);
476 CHECK_VTABLE(vaStatus, ctx, SyncSurface);
477 CHECK_VTABLE(vaStatus, ctx, QuerySurfaceStatus);
478 CHECK_VTABLE(vaStatus, ctx, PutSurface);
479 CHECK_VTABLE(vaStatus, ctx, QueryImageFormats);
480 CHECK_VTABLE(vaStatus, ctx, CreateImage);
481 CHECK_VTABLE(vaStatus, ctx, DeriveImage);
482 CHECK_VTABLE(vaStatus, ctx, DestroyImage);
483 CHECK_VTABLE(vaStatus, ctx, SetImagePalette);
484 CHECK_VTABLE(vaStatus, ctx, GetImage);
485 CHECK_VTABLE(vaStatus, ctx, PutImage);
486 CHECK_VTABLE(vaStatus, ctx, QuerySubpictureFormats);
487 CHECK_VTABLE(vaStatus, ctx, CreateSubpicture);
488 CHECK_VTABLE(vaStatus, ctx, DestroySubpicture);
489 CHECK_VTABLE(vaStatus, ctx, SetSubpictureImage);
490 CHECK_VTABLE(vaStatus, ctx, SetSubpictureChromakey);
491 CHECK_VTABLE(vaStatus, ctx, SetSubpictureGlobalAlpha);
492 CHECK_VTABLE(vaStatus, ctx, AssociateSubpicture);
493 CHECK_VTABLE(vaStatus, ctx, DeassociateSubpicture);
494 CHECK_VTABLE(vaStatus, ctx, QueryDisplayAttributes);
495 CHECK_VTABLE(vaStatus, ctx, GetDisplayAttributes);
496 CHECK_VTABLE(vaStatus, ctx, SetDisplayAttributes);
498 if (VA_STATUS_SUCCESS != vaStatus) {
499 va_errorMessage(dpy, "%s init failed\n", driver_path);
502 if (VA_STATUS_SUCCESS == vaStatus)
503 ctx->handle = handle;
510 driver_dir = strtok_r(NULL, ":", &saveptr);
518 VAPrivFunc vaGetLibFunc(VADisplay dpy, const char *func)
520 VADriverContextP ctx;
521 if (!vaDisplayIsValid(dpy))
525 if (NULL == ctx->handle)
528 return (VAPrivFunc) dlsym(ctx->handle, func);
533 * Returns a short english description of error_status
535 const char *vaErrorStr(VAStatus error_status)
537 switch(error_status) {
538 case VA_STATUS_SUCCESS:
539 return "success (no error)";
540 case VA_STATUS_ERROR_OPERATION_FAILED:
541 return "operation failed";
542 case VA_STATUS_ERROR_ALLOCATION_FAILED:
543 return "resource allocation failed";
544 case VA_STATUS_ERROR_INVALID_DISPLAY:
545 return "invalid VADisplay";
546 case VA_STATUS_ERROR_INVALID_CONFIG:
547 return "invalid VAConfigID";
548 case VA_STATUS_ERROR_INVALID_CONTEXT:
549 return "invalid VAContextID";
550 case VA_STATUS_ERROR_INVALID_SURFACE:
551 return "invalid VASurfaceID";
552 case VA_STATUS_ERROR_INVALID_BUFFER:
553 return "invalid VABufferID";
554 case VA_STATUS_ERROR_INVALID_IMAGE:
555 return "invalid VAImageID";
556 case VA_STATUS_ERROR_INVALID_SUBPICTURE:
557 return "invalid VASubpictureID";
558 case VA_STATUS_ERROR_ATTR_NOT_SUPPORTED:
559 return "attribute not supported";
560 case VA_STATUS_ERROR_MAX_NUM_EXCEEDED:
561 return "list argument exceeds maximum number";
562 case VA_STATUS_ERROR_UNSUPPORTED_PROFILE:
563 return "the requested VAProfile is not supported";
564 case VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT:
565 return "the requested VAEntryPoint is not supported";
566 case VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT:
567 return "the requested RT Format is not supported";
568 case VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE:
569 return "the requested VABufferType is not supported";
570 case VA_STATUS_ERROR_SURFACE_BUSY:
571 return "surface is in use";
572 case VA_STATUS_ERROR_FLAG_NOT_SUPPORTED:
573 return "flag not supported";
574 case VA_STATUS_ERROR_INVALID_PARAMETER:
575 return "invalid parameter";
576 case VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED:
577 return "resolution not supported";
578 case VA_STATUS_ERROR_UNIMPLEMENTED:
579 return "the requested function is not implemented";
580 case VA_STATUS_ERROR_SURFACE_IN_DISPLAYING:
581 return "surface is in displaying (may by overlay)" ;
582 case VA_STATUS_ERROR_INVALID_IMAGE_FORMAT:
583 return "invalid VAImageFormat";
584 case VA_STATUS_ERROR_DECODING_ERROR:
585 return "internal decoding error";
586 case VA_STATUS_ERROR_ENCODING_ERROR:
587 return "internal encoding error";
588 case VA_STATUS_ERROR_INVALID_VALUE:
589 return "an invalid/unsupported value was supplied";
590 case VA_STATUS_ERROR_UNSUPPORTED_FILTER:
591 return "the requested filter is not supported";
592 case VA_STATUS_ERROR_INVALID_FILTER_CHAIN:
593 return "an invalid filter chain was supplied";
594 case VA_STATUS_ERROR_HW_BUSY:
595 return "HW busy now";
596 case VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE:
597 return "an unsupported memory type was supplied";
598 case VA_STATUS_ERROR_NOT_ENOUGH_BUFFER:
599 return "allocated memory size is not enough for input or output";
600 case VA_STATUS_ERROR_UNKNOWN:
601 return "unknown libva error";
603 return "unknown libva error / description missing";
606 const static char *prefer_driver_list[4] = {
613 VAStatus vaSetDriverName(
618 VADriverContextP ctx;
619 VAStatus vaStatus = VA_STATUS_SUCCESS;
620 char *override_driver_name = NULL;
624 if (geteuid() != getuid()) {
625 vaStatus = VA_STATUS_ERROR_OPERATION_FAILED;
626 va_errorMessage(dpy, "no permission to vaSetDriverName\n");
630 if (strlen(driver_name) == 0 || strlen(driver_name) >=256) {
631 vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
632 va_errorMessage(dpy, "vaSetDriverName returns %s\n",
633 vaErrorStr(vaStatus));
638 for (i = 0; i < sizeof(prefer_driver_list) / sizeof(char *); i++) {
639 if (strlen(prefer_driver_list[i]) != strlen(driver_name))
641 if (!strncmp(prefer_driver_list[i], driver_name, strlen(driver_name))) {
648 vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
649 va_errorMessage(dpy, "vaSetDriverName returns %s. Incorrect parameter\n",
650 vaErrorStr(vaStatus));
654 override_driver_name = strdup(driver_name);
656 if (!override_driver_name) {
657 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
658 va_errorMessage(dpy, "vaSetDriverName returns %s. Out of Memory\n",
659 vaErrorStr(vaStatus));
663 ctx->override_driver_name = override_driver_name;
664 return VA_STATUS_SUCCESS;
667 VAStatus vaInitialize (
669 int *major_version, /* out */
670 int *minor_version /* out */
673 const char *driver_name_env = NULL;
674 char *driver_name = NULL;
676 VADriverContextP ctx;
688 va_infoMessage(dpy, "VA-API version %s\n", VA_VERSION_S);
690 vaStatus = va_getDriverName(dpy, &driver_name);
692 if (!ctx->override_driver_name) {
693 va_infoMessage(dpy, "va_getDriverName() returns %d\n", vaStatus);
695 driver_name_env = getenv("LIBVA_DRIVER_NAME");
696 } else if (vaStatus == VA_STATUS_SUCCESS) {
700 driver_name = strdup(ctx->override_driver_name);
702 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
703 va_errorMessage(dpy, "vaInitialize() failed with %s, out of memory\n",
704 vaErrorStr(vaStatus));
707 va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
710 if (driver_name_env && (geteuid() == getuid())) {
711 /* Don't allow setuid apps to use LIBVA_DRIVER_NAME */
712 if (driver_name) /* memory is allocated in va_getDriverName */
715 driver_name = strdup(driver_name_env);
716 vaStatus = VA_STATUS_SUCCESS;
717 va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
720 if ((VA_STATUS_SUCCESS == vaStatus) && (driver_name != NULL)) {
721 vaStatus = va_openDriver(dpy, driver_name);
722 va_infoMessage(dpy, "va_openDriver() returns %d\n", vaStatus);
724 *major_version = VA_MAJOR_VERSION;
725 *minor_version = VA_MINOR_VERSION;
727 va_errorMessage(dpy, "va_getDriverName() failed with %s,driver_name=%s\n",
728 vaErrorStr(vaStatus), driver_name);
733 VA_TRACE_LOG(va_TraceInitialize, dpy, major_version, minor_version);
740 * After this call, all library internal resources will be cleaned up
742 VAStatus vaTerminate (
746 VAStatus vaStatus = VA_STATUS_SUCCESS;
747 VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
748 VADriverContextP old_ctx;
753 if (old_ctx->handle) {
754 vaStatus = old_ctx->vtable->vaTerminate(old_ctx);
755 dlclose(old_ctx->handle);
756 old_ctx->handle = NULL;
758 free(old_ctx->vtable);
759 old_ctx->vtable = NULL;
760 free(old_ctx->vtable_vpp);
761 old_ctx->vtable_vpp = NULL;
763 if (old_ctx->override_driver_name) {
764 free(old_ctx->override_driver_name);
765 old_ctx->override_driver_name = NULL;
768 VA_TRACE_LOG(va_TraceTerminate, dpy);
774 if (VA_STATUS_SUCCESS == vaStatus)
775 pDisplayContext->vaDestroy(pDisplayContext);
781 * vaQueryVendorString returns a pointer to a zero-terminated string
782 * describing some aspects of the VA implemenation on a specific
783 * hardware accelerator. The format of the returned string is:
784 * <vendorname>-<major_version>-<minor_version>-<addtional_info>
785 * e.g. for the Intel GMA500 implementation, an example would be:
786 * "IntelGMA500-1.0-0.2-patch3
788 const char *vaQueryVendorString (
792 if (!vaDisplayIsValid(dpy))
795 return CTX(dpy)->str_vendor;
799 /* Get maximum number of profiles supported by the implementation */
800 int vaMaxNumProfiles (
804 if (!vaDisplayIsValid(dpy))
807 return CTX(dpy)->max_profiles;
810 /* Get maximum number of entrypoints supported by the implementation */
811 int vaMaxNumEntrypoints (
815 if (!vaDisplayIsValid(dpy))
818 return CTX(dpy)->max_entrypoints;
822 /* Get maximum number of attributs supported by the implementation */
823 int vaMaxNumConfigAttributes (
827 if (!vaDisplayIsValid(dpy))
830 return CTX(dpy)->max_attributes;
833 VAStatus vaQueryConfigEntrypoints (
836 VAEntrypoint *entrypoints, /* out */
837 int *num_entrypoints /* out */
840 VADriverContextP ctx;
844 return ctx->vtable->vaQueryConfigEntrypoints ( ctx, profile, entrypoints, num_entrypoints);
847 VAStatus vaGetConfigAttributes (
850 VAEntrypoint entrypoint,
851 VAConfigAttrib *attrib_list, /* in/out */
855 VADriverContextP ctx;
859 return ctx->vtable->vaGetConfigAttributes ( ctx, profile, entrypoint, attrib_list, num_attribs );
862 VAStatus vaQueryConfigProfiles (
864 VAProfile *profile_list, /* out */
865 int *num_profiles /* out */
868 VADriverContextP ctx;
872 return ctx->vtable->vaQueryConfigProfiles ( ctx, profile_list, num_profiles );
875 VAStatus vaCreateConfig (
878 VAEntrypoint entrypoint,
879 VAConfigAttrib *attrib_list,
881 VAConfigID *config_id /* out */
884 VADriverContextP ctx;
885 VAStatus vaStatus = VA_STATUS_SUCCESS;
890 vaStatus = ctx->vtable->vaCreateConfig ( ctx, profile, entrypoint, attrib_list, num_attribs, config_id );
892 /* record the current entrypoint for further trace/fool determination */
893 VA_TRACE_ALL(va_TraceCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
894 VA_FOOL_FUNC(va_FoolCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
899 VAStatus vaDestroyConfig (
904 VADriverContextP ctx;
905 VAStatus vaStatus = VA_STATUS_SUCCESS;
910 vaStatus = ctx->vtable->vaDestroyConfig ( ctx, config_id );
912 VA_TRACE_ALL(va_TraceDestroyConfig, dpy, config_id);
917 VAStatus vaQueryConfigAttributes (
919 VAConfigID config_id,
920 VAProfile *profile, /* out */
921 VAEntrypoint *entrypoint, /* out */
922 VAConfigAttrib *attrib_list,/* out */
923 int *num_attribs /* out */
926 VADriverContextP ctx;
930 return ctx->vtable->vaQueryConfigAttributes( ctx, config_id, profile, entrypoint, attrib_list, num_attribs);
933 VAStatus vaQueryProcessingRate (
935 VAConfigID config_id,
936 VAProcessingRateParameter *proc_buf,
937 unsigned int *processing_rate /* out */
940 VADriverContextP ctx;
943 if(!ctx->vtable->vaQueryProcessingRate)
944 return VA_STATUS_ERROR_UNIMPLEMENTED;
945 return ctx->vtable->vaQueryProcessingRate( ctx, config_id, proc_buf, processing_rate);
948 /* XXX: this is a slow implementation that will be removed */
950 va_impl_query_surface_attributes(
951 VADriverContextP ctx,
953 VASurfaceAttrib *out_attribs,
954 unsigned int *out_num_attribs_ptr
957 VASurfaceAttrib *attribs = NULL;
958 unsigned int num_attribs, n;
959 VASurfaceAttrib *out_attrib;
960 unsigned int out_num_attribs;
961 VAImageFormat *image_formats = NULL;
962 int num_image_formats, i;
965 /* List of surface attributes to query */
966 struct va_surface_attrib_map {
967 VASurfaceAttribType type;
968 VAGenericValueType value_type;
970 static const struct va_surface_attrib_map attribs_map[] = {
971 { VASurfaceAttribMinWidth, VAGenericValueTypeInteger },
972 { VASurfaceAttribMaxWidth, VAGenericValueTypeInteger },
973 { VASurfaceAttribMinHeight, VAGenericValueTypeInteger },
974 { VASurfaceAttribMaxHeight, VAGenericValueTypeInteger },
975 { VASurfaceAttribMemoryType, VAGenericValueTypeInteger },
976 { VASurfaceAttribNone, }
979 if (!out_attribs || !out_num_attribs_ptr)
980 return VA_STATUS_ERROR_INVALID_PARAMETER;
981 if (!ctx->vtable->vaGetSurfaceAttributes)
982 return VA_STATUS_ERROR_UNIMPLEMENTED;
984 num_image_formats = ctx->max_image_formats;
985 image_formats = malloc(num_image_formats * sizeof(*image_formats));
986 if (!image_formats) {
987 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
991 va_status = ctx->vtable->vaQueryImageFormats(
992 ctx, image_formats, &num_image_formats);
993 if (va_status != VA_STATUS_SUCCESS)
996 num_attribs = VASurfaceAttribCount + num_image_formats;
997 attribs = malloc(num_attribs * sizeof(*attribs));
999 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
1003 /* Initialize with base surface attributes, except pixel-formats */
1004 for (n = 0; attribs_map[n].type != VASurfaceAttribNone; n++) {
1005 VASurfaceAttrib * const attrib = &attribs[n];
1006 attrib->type = attribs_map[n].type;
1007 attrib->flags = VA_SURFACE_ATTRIB_GETTABLE;
1008 attrib->value.type = attribs_map[n].value_type;
1011 /* Append image formats */
1012 for (i = 0; i < num_image_formats; i++) {
1013 VASurfaceAttrib * const attrib = &attribs[n];
1014 attrib->type = VASurfaceAttribPixelFormat;
1015 attrib->flags = VA_SURFACE_ATTRIB_GETTABLE|VA_SURFACE_ATTRIB_SETTABLE;
1016 attrib->value.type = VAGenericValueTypeInteger;
1017 attrib->value.value.i = image_formats[i].fourcc;
1018 if (++n == num_attribs) {
1019 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
1025 va_status = ctx->vtable->vaGetSurfaceAttributes(
1026 ctx, config, attribs, num_attribs);
1027 if (va_status != VA_STATUS_SUCCESS)
1030 /* Remove invalid entries */
1031 out_num_attribs = 0;
1032 for (n = 0; n < num_attribs; n++) {
1033 VASurfaceAttrib * const attrib = &attribs[n];
1035 if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
1038 // Accept all surface attributes that are not pixel-formats
1039 if (attrib->type != VASurfaceAttribPixelFormat) {
1044 // Drop invalid pixel-format attribute
1045 if (!attrib->value.value.i) {
1046 attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
1050 // Check for duplicates
1051 int is_duplicate = 0;
1052 for (i = n - 1; i >= 0 && !is_duplicate; i--) {
1053 const VASurfaceAttrib * const prev_attrib = &attribs[i];
1054 if (prev_attrib->type != VASurfaceAttribPixelFormat)
1056 is_duplicate = prev_attrib->value.value.i == attrib->value.value.i;
1059 attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
1064 if (*out_num_attribs_ptr < out_num_attribs) {
1065 *out_num_attribs_ptr = out_num_attribs;
1066 va_status = VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
1070 out_attrib = out_attribs;
1071 for (n = 0; n < num_attribs; n++) {
1072 const VASurfaceAttrib * const attrib = &attribs[n];
1073 if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
1075 *out_attrib++ = *attrib;
1080 free(image_formats);
1085 vaQuerySurfaceAttributes(
1088 VASurfaceAttrib *attrib_list,
1089 unsigned int *num_attribs
1092 VADriverContextP ctx;
1098 return VA_STATUS_ERROR_INVALID_DISPLAY;
1100 if (!ctx->vtable->vaQuerySurfaceAttributes)
1101 vaStatus = va_impl_query_surface_attributes(ctx, config,
1102 attrib_list, num_attribs);
1104 vaStatus = ctx->vtable->vaQuerySurfaceAttributes(ctx, config,
1105 attrib_list, num_attribs);
1107 VA_TRACE_LOG(va_TraceQuerySurfaceAttributes, dpy, config, attrib_list, num_attribs);
1115 unsigned int format,
1117 unsigned int height,
1118 VASurfaceID *surfaces,
1119 unsigned int num_surfaces,
1120 VASurfaceAttrib *attrib_list,
1121 unsigned int num_attribs
1124 VADriverContextP ctx;
1130 return VA_STATUS_ERROR_INVALID_DISPLAY;
1132 if (ctx->vtable->vaCreateSurfaces2)
1133 vaStatus = ctx->vtable->vaCreateSurfaces2(ctx, format, width, height,
1134 surfaces, num_surfaces,
1135 attrib_list, num_attribs);
1136 else if (attrib_list && num_attribs > 0)
1137 vaStatus = VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
1139 vaStatus = ctx->vtable->vaCreateSurfaces(ctx, width, height, format,
1140 num_surfaces, surfaces);
1141 VA_TRACE_LOG(va_TraceCreateSurfaces,
1142 dpy, width, height, format, num_surfaces, surfaces,
1143 attrib_list, num_attribs);
1149 VAStatus vaDestroySurfaces (
1151 VASurfaceID *surface_list,
1155 VADriverContextP ctx;
1161 VA_TRACE_LOG(va_TraceDestroySurfaces,
1162 dpy, surface_list, num_surfaces);
1164 vaStatus = ctx->vtable->vaDestroySurfaces( ctx, surface_list, num_surfaces );
1169 VAStatus vaCreateContext (
1171 VAConfigID config_id,
1175 VASurfaceID *render_targets,
1176 int num_render_targets,
1177 VAContextID *context /* out */
1180 VADriverContextP ctx;
1186 vaStatus = ctx->vtable->vaCreateContext( ctx, config_id, picture_width, picture_height,
1187 flag, render_targets, num_render_targets, context );
1189 /* keep current encode/decode resoluton */
1190 VA_TRACE_ALL(va_TraceCreateContext, dpy, config_id, picture_width, picture_height, flag, render_targets, num_render_targets, context);
1195 VAStatus vaDestroyContext (
1200 VADriverContextP ctx;
1206 vaStatus = ctx->vtable->vaDestroyContext( ctx, context );
1208 VA_TRACE_ALL(va_TraceDestroyContext, dpy, context);
1213 VAStatus vaCreateMFContext (
1215 VAMFContextID *mf_context /* out */
1218 VADriverContextP ctx;
1223 if(ctx->vtable->vaCreateMFContext == NULL)
1224 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1227 vaStatus = ctx->vtable->vaCreateMFContext( ctx, mf_context);
1228 VA_TRACE_ALL(va_TraceCreateMFContext, dpy, mf_context);
1234 VAStatus vaMFAddContext (
1236 VAMFContextID mf_context,
1240 VADriverContextP ctx;
1246 if(ctx->vtable->vaMFAddContext == NULL)
1247 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1250 vaStatus = ctx->vtable->vaMFAddContext( ctx, context, mf_context);
1251 VA_TRACE_ALL(va_TraceMFAddContext, dpy, context, mf_context);
1257 VAStatus vaMFReleaseContext (
1259 VAMFContextID mf_context,
1263 VADriverContextP ctx;
1268 if(ctx->vtable->vaMFReleaseContext == NULL)
1269 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1272 vaStatus = ctx->vtable->vaMFReleaseContext( ctx, context, mf_context);
1273 VA_TRACE_ALL(va_TraceMFReleaseContext, dpy, context, mf_context);
1279 VAStatus vaMFSubmit (
1281 VAMFContextID mf_context,
1282 VAContextID *contexts,
1286 VADriverContextP ctx;
1291 CHECK_VTABLE(vaStatus, ctx, MFSubmit);
1292 if(ctx->vtable->vaMFSubmit == NULL)
1293 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1296 vaStatus = ctx->vtable->vaMFSubmit( ctx, mf_context, contexts, num_contexts);
1297 VA_TRACE_ALL(va_TraceMFSubmit, dpy, mf_context, contexts, num_contexts);
1303 VAStatus vaCreateBuffer (
1305 VAContextID context, /* in */
1306 VABufferType type, /* in */
1307 unsigned int size, /* in */
1308 unsigned int num_elements, /* in */
1309 void *data, /* in */
1310 VABufferID *buf_id /* out */
1313 VADriverContextP ctx;
1319 VA_FOOL_FUNC(va_FoolCreateBuffer, dpy, context, type, size, num_elements, data, buf_id);
1321 vaStatus = ctx->vtable->vaCreateBuffer( ctx, context, type, size, num_elements, data, buf_id);
1323 VA_TRACE_LOG(va_TraceCreateBuffer,
1324 dpy, context, type, size, num_elements, data, buf_id);
1329 VAStatus vaCreateBuffer2 (
1331 VAContextID context,
1334 unsigned int height,
1335 unsigned int *unit_size,
1336 unsigned int *pitch,
1340 VADriverContextP ctx;
1345 if(!ctx->vtable->vaCreateBuffer2)
1346 return VA_STATUS_ERROR_UNIMPLEMENTED;
1348 vaStatus = ctx->vtable->vaCreateBuffer2( ctx, context, type, width, height ,unit_size, pitch, buf_id);
1350 VA_TRACE_LOG(va_TraceCreateBuffer,
1351 dpy, context, type, *pitch, height, NULL, buf_id);
1356 VAStatus vaBufferSetNumElements (
1358 VABufferID buf_id, /* in */
1359 unsigned int num_elements /* in */
1362 VADriverContextP ctx;
1366 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1368 return ctx->vtable->vaBufferSetNumElements( ctx, buf_id, num_elements );
1372 VAStatus vaMapBuffer (
1374 VABufferID buf_id, /* in */
1375 void **pbuf /* out */
1378 VADriverContextP ctx;
1384 VA_FOOL_FUNC(va_FoolMapBuffer, dpy, buf_id, pbuf);
1386 va_status = ctx->vtable->vaMapBuffer( ctx, buf_id, pbuf );
1388 VA_TRACE_ALL(va_TraceMapBuffer, dpy, buf_id, pbuf);
1393 VAStatus vaUnmapBuffer (
1395 VABufferID buf_id /* in */
1398 VADriverContextP ctx;
1402 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1404 return ctx->vtable->vaUnmapBuffer( ctx, buf_id );
1407 VAStatus vaDestroyBuffer (
1409 VABufferID buffer_id
1412 VADriverContextP ctx;
1416 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1418 VA_TRACE_LOG(va_TraceDestroyBuffer,
1421 return ctx->vtable->vaDestroyBuffer( ctx, buffer_id );
1424 VAStatus vaBufferInfo (
1426 VAContextID context, /* in */
1427 VABufferID buf_id, /* in */
1428 VABufferType *type, /* out */
1429 unsigned int *size, /* out */
1430 unsigned int *num_elements /* out */
1433 VADriverContextP ctx;
1438 VA_FOOL_FUNC(va_FoolBufferInfo, dpy, buf_id, type, size, num_elements);
1440 return ctx->vtable->vaBufferInfo( ctx, buf_id, type, size, num_elements );
1443 /* Locks buffer for external API usage */
1445 vaAcquireBufferHandle(VADisplay dpy, VABufferID buf_id, VABufferInfo *buf_info)
1447 VADriverContextP ctx;
1452 if (!ctx->vtable->vaAcquireBufferHandle)
1453 return VA_STATUS_ERROR_UNIMPLEMENTED;
1454 return ctx->vtable->vaAcquireBufferHandle(ctx, buf_id, buf_info);
1457 /* Unlocks buffer after usage from external API */
1459 vaReleaseBufferHandle(VADisplay dpy, VABufferID buf_id)
1461 VADriverContextP ctx;
1466 if (!ctx->vtable->vaReleaseBufferHandle)
1467 return VA_STATUS_ERROR_UNIMPLEMENTED;
1468 return ctx->vtable->vaReleaseBufferHandle(ctx, buf_id);
1472 vaExportSurfaceHandle(VADisplay dpy, VASurfaceID surface_id,
1473 uint32_t mem_type, uint32_t flags,
1476 VADriverContextP ctx;
1481 if (!ctx->vtable->vaExportSurfaceHandle)
1482 return VA_STATUS_ERROR_UNIMPLEMENTED;
1483 return ctx->vtable->vaExportSurfaceHandle(ctx, surface_id,
1488 VAStatus vaBeginPicture (
1490 VAContextID context,
1491 VASurfaceID render_target
1494 VADriverContextP ctx;
1500 VA_TRACE_ALL(va_TraceBeginPicture, dpy, context, render_target);
1501 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1503 va_status = ctx->vtable->vaBeginPicture( ctx, context, render_target );
1508 VAStatus vaRenderPicture (
1510 VAContextID context,
1511 VABufferID *buffers,
1515 VADriverContextP ctx;
1520 VA_TRACE_LOG(va_TraceRenderPicture, dpy, context, buffers, num_buffers);
1521 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1523 return ctx->vtable->vaRenderPicture( ctx, context, buffers, num_buffers );
1526 VAStatus vaEndPicture (
1531 VAStatus va_status = VA_STATUS_SUCCESS;
1532 VADriverContextP ctx;
1537 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1539 va_status = ctx->vtable->vaEndPicture( ctx, context );
1541 /* dump surface content */
1542 VA_TRACE_ALL(va_TraceEndPicture, dpy, context, 1);
1547 VAStatus vaSyncSurface (
1549 VASurfaceID render_target
1553 VADriverContextP ctx;
1558 va_status = ctx->vtable->vaSyncSurface( ctx, render_target );
1559 VA_TRACE_LOG(va_TraceSyncSurface, dpy, render_target);
1564 VAStatus vaQuerySurfaceStatus (
1566 VASurfaceID render_target,
1567 VASurfaceStatus *status /* out */
1571 VADriverContextP ctx;
1575 va_status = ctx->vtable->vaQuerySurfaceStatus( ctx, render_target, status );
1577 VA_TRACE_LOG(va_TraceQuerySurfaceStatus, dpy, render_target, status);
1582 VAStatus vaQuerySurfaceError (
1584 VASurfaceID surface,
1585 VAStatus error_status,
1586 void **error_info /*out*/
1590 VADriverContextP ctx;
1594 va_status = ctx->vtable->vaQuerySurfaceError( ctx, surface, error_status, error_info );
1596 VA_TRACE_LOG(va_TraceQuerySurfaceError, dpy, surface, error_status, error_info);
1601 /* Get maximum number of image formats supported by the implementation */
1602 int vaMaxNumImageFormats (
1606 if (!vaDisplayIsValid(dpy))
1609 return CTX(dpy)->max_image_formats;
1612 VAStatus vaQueryImageFormats (
1614 VAImageFormat *format_list, /* out */
1615 int *num_formats /* out */
1618 VADriverContextP ctx;
1622 return ctx->vtable->vaQueryImageFormats ( ctx, format_list, num_formats);
1626 * The width and height fields returned in the VAImage structure may get
1627 * enlarged for some YUV formats. The size of the data buffer that needs
1628 * to be allocated will be given in the "data_size" field in VAImage.
1629 * Image data is not allocated by this function. The client should
1630 * allocate the memory and fill in the VAImage structure's data field
1631 * after looking at "data_size" returned from the library.
1633 VAStatus vaCreateImage (
1635 VAImageFormat *format,
1638 VAImage *image /* out */
1641 VADriverContextP ctx;
1645 return ctx->vtable->vaCreateImage ( ctx, format, width, height, image);
1649 * Should call DestroyImage before destroying the surface it is bound to
1651 VAStatus vaDestroyImage (
1656 VADriverContextP ctx;
1660 return ctx->vtable->vaDestroyImage ( ctx, image);
1663 VAStatus vaSetImagePalette (
1666 unsigned char *palette
1669 VADriverContextP ctx;
1673 return ctx->vtable->vaSetImagePalette ( ctx, image, palette);
1677 * Retrieve surface data into a VAImage
1678 * Image must be in a format supported by the implementation
1680 VAStatus vaGetImage (
1682 VASurfaceID surface,
1683 int x, /* coordinates of the upper left source pixel */
1685 unsigned int width, /* width and height of the region */
1686 unsigned int height,
1690 VADriverContextP ctx;
1694 return ctx->vtable->vaGetImage ( ctx, surface, x, y, width, height, image);
1698 * Copy data from a VAImage to a surface
1699 * Image must be in a format supported by the implementation
1701 VAStatus vaPutImage (
1703 VASurfaceID surface,
1707 unsigned int src_width,
1708 unsigned int src_height,
1711 unsigned int dest_width,
1712 unsigned int dest_height
1715 VADriverContextP ctx;
1719 return ctx->vtable->vaPutImage ( ctx, surface, image, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height );
1723 * Derive an VAImage from an existing surface.
1724 * This interface will derive a VAImage and corresponding image buffer from
1725 * an existing VA Surface. The image buffer can then be mapped/unmapped for
1726 * direct CPU access. This operation is only possible on implementations with
1727 * direct rendering capabilities and internal surface formats that can be
1728 * represented with a VAImage. When the operation is not possible this interface
1729 * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back
1730 * to using vaCreateImage + vaPutImage to accomplish the same task in an
1733 * Implementations should only return success when the resulting image buffer
1734 * would be useable with vaMap/Unmap.
1736 * When directly accessing a surface special care must be taken to insure
1737 * proper synchronization with the graphics hardware. Clients should call
1738 * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent
1739 * rendering or currently being displayed by an overlay.
1741 * Additionally nothing about the contents of a surface should be assumed
1742 * following a vaPutSurface. Implementations are free to modify the surface for
1743 * scaling or subpicture blending within a call to vaPutImage.
1745 * Calls to vaPutImage or vaGetImage using the same surface from which the image
1746 * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or
1747 * vaGetImage with other surfaces is supported.
1749 * An image created with vaDeriveImage should be freed with vaDestroyImage. The
1750 * image and image buffer structures will be destroyed; however, the underlying
1751 * surface will remain unchanged until freed with vaDestroySurfaces.
1753 VAStatus vaDeriveImage (
1755 VASurfaceID surface,
1756 VAImage *image /* out */
1759 VADriverContextP ctx;
1763 return ctx->vtable->vaDeriveImage ( ctx, surface, image );
1767 /* Get maximum number of subpicture formats supported by the implementation */
1768 int vaMaxNumSubpictureFormats (
1772 if (!vaDisplayIsValid(dpy))
1775 return CTX(dpy)->max_subpic_formats;
1779 * Query supported subpicture formats
1780 * The caller must provide a "format_list" array that can hold at
1781 * least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag
1782 * for each format to indicate additional capabilities for that format. The actual
1783 * number of formats returned in "format_list" is returned in "num_formats".
1785 VAStatus vaQuerySubpictureFormats (
1787 VAImageFormat *format_list, /* out */
1788 unsigned int *flags, /* out */
1789 unsigned int *num_formats /* out */
1792 VADriverContextP ctx;
1797 return ctx->vtable->vaQuerySubpictureFormats ( ctx, format_list, flags, num_formats);
1801 * Subpictures are created with an image associated.
1803 VAStatus vaCreateSubpicture (
1806 VASubpictureID *subpicture /* out */
1809 VADriverContextP ctx;
1813 return ctx->vtable->vaCreateSubpicture ( ctx, image, subpicture );
1817 * Destroy the subpicture before destroying the image it is assocated to
1819 VAStatus vaDestroySubpicture (
1821 VASubpictureID subpicture
1824 VADriverContextP ctx;
1828 return ctx->vtable->vaDestroySubpicture ( ctx, subpicture);
1831 VAStatus vaSetSubpictureImage (
1833 VASubpictureID subpicture,
1837 VADriverContextP ctx;
1841 return ctx->vtable->vaSetSubpictureImage ( ctx, subpicture, image);
1846 * If chromakey is enabled, then the area where the source value falls within
1847 * the chromakey [min, max] range is transparent
1849 VAStatus vaSetSubpictureChromakey (
1851 VASubpictureID subpicture,
1852 unsigned int chromakey_min,
1853 unsigned int chromakey_max,
1854 unsigned int chromakey_mask
1857 VADriverContextP ctx;
1861 return ctx->vtable->vaSetSubpictureChromakey ( ctx, subpicture, chromakey_min, chromakey_max, chromakey_mask );
1866 * Global alpha value is between 0 and 1. A value of 1 means fully opaque and
1867 * a value of 0 means fully transparent. If per-pixel alpha is also specified then
1868 * the overall alpha is per-pixel alpha multiplied by the global alpha
1870 VAStatus vaSetSubpictureGlobalAlpha (
1872 VASubpictureID subpicture,
1876 VADriverContextP ctx;
1880 return ctx->vtable->vaSetSubpictureGlobalAlpha ( ctx, subpicture, global_alpha );
1884 vaAssociateSubpicture associates the subpicture with the target_surface.
1885 It defines the region mapping between the subpicture and the target
1886 surface through source and destination rectangles (with the same width and height).
1887 Both will be displayed at the next call to vaPutSurface. Additional
1888 associations before the call to vaPutSurface simply overrides the association.
1890 VAStatus vaAssociateSubpicture (
1892 VASubpictureID subpicture,
1893 VASurfaceID *target_surfaces,
1895 short src_x, /* upper left offset in subpicture */
1897 unsigned short src_width,
1898 unsigned short src_height,
1899 short dest_x, /* upper left offset in surface */
1901 unsigned short dest_width,
1902 unsigned short dest_height,
1904 * whether to enable chroma-keying or global-alpha
1905 * see VA_SUBPICTURE_XXX values
1910 VADriverContextP ctx;
1914 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 );
1918 * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces.
1920 VAStatus vaDeassociateSubpicture (
1922 VASubpictureID subpicture,
1923 VASurfaceID *target_surfaces,
1927 VADriverContextP ctx;
1931 return ctx->vtable->vaDeassociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces );
1935 /* Get maximum number of display attributes supported by the implementation */
1936 int vaMaxNumDisplayAttributes (
1942 if (!vaDisplayIsValid(dpy))
1945 tmp = CTX(dpy)->max_display_attributes;
1947 VA_TRACE_LOG(va_TraceMaxNumDisplayAttributes, dpy, tmp);
1953 * Query display attributes
1954 * The caller must provide a "attr_list" array that can hold at
1955 * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
1956 * returned in "attr_list" is returned in "num_attributes".
1958 VAStatus vaQueryDisplayAttributes (
1960 VADisplayAttribute *attr_list, /* out */
1961 int *num_attributes /* out */
1964 VADriverContextP ctx;
1969 va_status = ctx->vtable->vaQueryDisplayAttributes ( ctx, attr_list, num_attributes );
1971 VA_TRACE_LOG(va_TraceQueryDisplayAttributes, dpy, attr_list, num_attributes);
1978 * Get display attributes
1979 * This function returns the current attribute values in "attr_list".
1980 * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
1981 * from vaQueryDisplayAttributes() can have their values retrieved.
1983 VAStatus vaGetDisplayAttributes (
1985 VADisplayAttribute *attr_list, /* in/out */
1989 VADriverContextP ctx;
1994 va_status = ctx->vtable->vaGetDisplayAttributes ( ctx, attr_list, num_attributes );
1996 VA_TRACE_LOG(va_TraceGetDisplayAttributes, dpy, attr_list, num_attributes);
2002 * Set display attributes
2003 * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
2004 * from vaQueryDisplayAttributes() can be set. If the attribute is not settable or
2005 * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
2007 VAStatus vaSetDisplayAttributes (
2009 VADisplayAttribute *attr_list,
2013 VADriverContextP ctx;
2018 va_status = ctx->vtable->vaSetDisplayAttributes ( ctx, attr_list, num_attributes );
2019 VA_TRACE_LOG(va_TraceSetDisplayAttributes, dpy, attr_list, num_attributes);
2024 VAStatus vaLockSurface(VADisplay dpy,
2025 VASurfaceID surface,
2026 unsigned int *fourcc, /* following are output argument */
2027 unsigned int *luma_stride,
2028 unsigned int *chroma_u_stride,
2029 unsigned int *chroma_v_stride,
2030 unsigned int *luma_offset,
2031 unsigned int *chroma_u_offset,
2032 unsigned int *chroma_v_offset,
2033 unsigned int *buffer_name,
2037 VADriverContextP ctx;
2041 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);
2045 VAStatus vaUnlockSurface(VADisplay dpy,
2049 VADriverContextP ctx;
2053 return ctx->vtable->vaUnlockSurface( ctx, surface );
2056 /* Video Processing */
2057 #define VA_VPP_INIT_CONTEXT(ctx, dpy) do { \
2058 CHECK_DISPLAY(dpy); \
2061 return VA_STATUS_ERROR_INVALID_DISPLAY; \
2064 #define VA_VPP_INVOKE(dpy, func, args) do { \
2065 if (!ctx->vtable_vpp->va##func) \
2066 return VA_STATUS_ERROR_UNIMPLEMENTED; \
2067 status = ctx->vtable_vpp->va##func args; \
2071 vaQueryVideoProcFilters(
2073 VAContextID context,
2074 VAProcFilterType *filters,
2075 unsigned int *num_filters
2078 VADriverContextP ctx;
2081 VA_VPP_INIT_CONTEXT(ctx, dpy);
2084 QueryVideoProcFilters,
2085 (ctx, context, filters, num_filters)
2091 vaQueryVideoProcFilterCaps(
2093 VAContextID context,
2094 VAProcFilterType type,
2096 unsigned int *num_filter_caps
2099 VADriverContextP ctx;
2102 VA_VPP_INIT_CONTEXT(ctx, dpy);
2105 QueryVideoProcFilterCaps,
2106 (ctx, context, type, filter_caps, num_filter_caps)
2112 vaQueryVideoProcPipelineCaps(
2114 VAContextID context,
2115 VABufferID *filters,
2116 unsigned int num_filters,
2117 VAProcPipelineCaps *pipeline_caps
2120 VADriverContextP ctx;
2123 VA_VPP_INIT_CONTEXT(ctx, dpy);
2126 QueryVideoProcPipelineCaps,
2127 (ctx, context, filters, num_filters, pipeline_caps)