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, 0 },
409 for (i = 0; compatible_versions[i].major >= 0; i++) {
410 if (va_getDriverInitName(init_func_s, sizeof(init_func_s),
411 compatible_versions[i].major,
412 compatible_versions[i].minor)) {
413 init_func = (VADriverInit)dlsym(handle, init_func_s);
415 va_infoMessage(dpy, "Found init function %s\n", init_func_s);
421 if (compatible_versions[i].major < 0) {
422 va_errorMessage(dpy, "%s has no function %s\n",
423 driver_path, init_func_s);
426 struct VADriverVTable *vtable = ctx->vtable;
427 struct VADriverVTableVPP *vtable_vpp = ctx->vtable_vpp;
429 vaStatus = VA_STATUS_SUCCESS;
431 vtable = calloc(1, sizeof(*vtable));
433 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
435 ctx->vtable = vtable;
438 vtable_vpp = calloc(1, sizeof(*vtable_vpp));
440 vtable_vpp->version = VA_DRIVER_VTABLE_VPP_VERSION;
442 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
444 ctx->vtable_vpp = vtable_vpp;
446 if (init_func && VA_STATUS_SUCCESS == vaStatus)
447 vaStatus = (*init_func)(ctx);
449 if (VA_STATUS_SUCCESS == vaStatus) {
450 CHECK_MAXIMUM(vaStatus, ctx, profiles);
451 CHECK_MAXIMUM(vaStatus, ctx, entrypoints);
452 CHECK_MAXIMUM(vaStatus, ctx, attributes);
453 CHECK_MAXIMUM(vaStatus, ctx, image_formats);
454 CHECK_MAXIMUM(vaStatus, ctx, subpic_formats);
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_DECODING_ERROR:
584 return "internal decoding error";
585 case VA_STATUS_ERROR_ENCODING_ERROR:
586 return "internal encoding error";
587 case VA_STATUS_ERROR_INVALID_VALUE:
588 return "an invalid/unsupported value was supplied";
589 case VA_STATUS_ERROR_UNSUPPORTED_FILTER:
590 return "the requested filter is not supported";
591 case VA_STATUS_ERROR_INVALID_FILTER_CHAIN:
592 return "an invalid filter chain was supplied";
593 case VA_STATUS_ERROR_HW_BUSY:
594 return "HW busy now";
595 case VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE:
596 return "an unsupported memory type was supplied";
597 case VA_STATUS_ERROR_NOT_ENOUGH_BUFFER:
598 return "allocated memory size is not enough for input or output";
599 case VA_STATUS_ERROR_UNKNOWN:
600 return "unknown libva error";
602 return "unknown libva error / description missing";
605 const static char *prefer_driver_list[4] = {
612 VAStatus vaSetDriverName(
617 VADriverContextP ctx;
618 VAStatus vaStatus = VA_STATUS_SUCCESS;
619 char *override_driver_name = NULL;
623 if (geteuid() != getuid()) {
624 vaStatus = VA_STATUS_ERROR_OPERATION_FAILED;
625 va_errorMessage(dpy, "no permission to vaSetDriverName\n");
629 if (strlen(driver_name) == 0 || strlen(driver_name) >=256) {
630 vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
631 va_errorMessage(dpy, "vaSetDriverName returns %s\n",
632 vaErrorStr(vaStatus));
637 for (i = 0; i < sizeof(prefer_driver_list) / sizeof(char *); i++) {
638 if (strlen(prefer_driver_list[i]) != strlen(driver_name))
640 if (!strncmp(prefer_driver_list[i], driver_name, strlen(driver_name))) {
647 vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
648 va_errorMessage(dpy, "vaSetDriverName returns %s. Incorrect parameter\n",
649 vaErrorStr(vaStatus));
653 override_driver_name = strdup(driver_name);
655 if (!override_driver_name) {
656 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
657 va_errorMessage(dpy, "vaSetDriverName returns %s. Out of Memory\n",
658 vaErrorStr(vaStatus));
662 ctx->override_driver_name = override_driver_name;
663 return VA_STATUS_SUCCESS;
666 VAStatus vaInitialize (
668 int *major_version, /* out */
669 int *minor_version /* out */
672 const char *driver_name_env = NULL;
673 char *driver_name = NULL;
675 VADriverContextP ctx;
687 va_infoMessage(dpy, "VA-API version %s\n", VA_VERSION_S);
689 vaStatus = va_getDriverName(dpy, &driver_name);
691 if (!ctx->override_driver_name) {
692 va_infoMessage(dpy, "va_getDriverName() returns %d\n", vaStatus);
694 driver_name_env = getenv("LIBVA_DRIVER_NAME");
695 } else if (vaStatus == VA_STATUS_SUCCESS) {
699 driver_name = strdup(ctx->override_driver_name);
701 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
702 va_errorMessage(dpy, "vaInitialize() failed with %s, out of memory\n",
703 vaErrorStr(vaStatus));
706 va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
709 if (driver_name_env && (geteuid() == getuid())) {
710 /* Don't allow setuid apps to use LIBVA_DRIVER_NAME */
711 if (driver_name) /* memory is allocated in va_getDriverName */
714 driver_name = strdup(driver_name_env);
715 vaStatus = VA_STATUS_SUCCESS;
716 va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
719 if ((VA_STATUS_SUCCESS == vaStatus) && (driver_name != NULL)) {
720 vaStatus = va_openDriver(dpy, driver_name);
721 va_infoMessage(dpy, "va_openDriver() returns %d\n", vaStatus);
723 *major_version = VA_MAJOR_VERSION;
724 *minor_version = VA_MINOR_VERSION;
726 va_errorMessage(dpy, "va_getDriverName() failed with %s,driver_name=%s\n",
727 vaErrorStr(vaStatus), driver_name);
732 VA_TRACE_LOG(va_TraceInitialize, dpy, major_version, minor_version);
739 * After this call, all library internal resources will be cleaned up
741 VAStatus vaTerminate (
745 VAStatus vaStatus = VA_STATUS_SUCCESS;
746 VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
747 VADriverContextP old_ctx;
752 if (old_ctx->handle) {
753 vaStatus = old_ctx->vtable->vaTerminate(old_ctx);
754 dlclose(old_ctx->handle);
755 old_ctx->handle = NULL;
757 free(old_ctx->vtable);
758 old_ctx->vtable = NULL;
759 free(old_ctx->vtable_vpp);
760 old_ctx->vtable_vpp = NULL;
762 if (old_ctx->override_driver_name) {
763 free(old_ctx->override_driver_name);
764 old_ctx->override_driver_name = NULL;
767 VA_TRACE_LOG(va_TraceTerminate, dpy);
773 if (VA_STATUS_SUCCESS == vaStatus)
774 pDisplayContext->vaDestroy(pDisplayContext);
780 * vaQueryVendorString returns a pointer to a zero-terminated string
781 * describing some aspects of the VA implemenation on a specific
782 * hardware accelerator. The format of the returned string is:
783 * <vendorname>-<major_version>-<minor_version>-<addtional_info>
784 * e.g. for the Intel GMA500 implementation, an example would be:
785 * "IntelGMA500-1.0-0.2-patch3
787 const char *vaQueryVendorString (
791 if (!vaDisplayIsValid(dpy))
794 return CTX(dpy)->str_vendor;
798 /* Get maximum number of profiles supported by the implementation */
799 int vaMaxNumProfiles (
803 if (!vaDisplayIsValid(dpy))
806 return CTX(dpy)->max_profiles;
809 /* Get maximum number of entrypoints supported by the implementation */
810 int vaMaxNumEntrypoints (
814 if (!vaDisplayIsValid(dpy))
817 return CTX(dpy)->max_entrypoints;
821 /* Get maximum number of attributs supported by the implementation */
822 int vaMaxNumConfigAttributes (
826 if (!vaDisplayIsValid(dpy))
829 return CTX(dpy)->max_attributes;
832 VAStatus vaQueryConfigEntrypoints (
835 VAEntrypoint *entrypoints, /* out */
836 int *num_entrypoints /* out */
839 VADriverContextP ctx;
843 return ctx->vtable->vaQueryConfigEntrypoints ( ctx, profile, entrypoints, num_entrypoints);
846 VAStatus vaGetConfigAttributes (
849 VAEntrypoint entrypoint,
850 VAConfigAttrib *attrib_list, /* in/out */
854 VADriverContextP ctx;
858 return ctx->vtable->vaGetConfigAttributes ( ctx, profile, entrypoint, attrib_list, num_attribs );
861 VAStatus vaQueryConfigProfiles (
863 VAProfile *profile_list, /* out */
864 int *num_profiles /* out */
867 VADriverContextP ctx;
871 return ctx->vtable->vaQueryConfigProfiles ( ctx, profile_list, num_profiles );
874 VAStatus vaCreateConfig (
877 VAEntrypoint entrypoint,
878 VAConfigAttrib *attrib_list,
880 VAConfigID *config_id /* out */
883 VADriverContextP ctx;
884 VAStatus vaStatus = VA_STATUS_SUCCESS;
889 vaStatus = ctx->vtable->vaCreateConfig ( ctx, profile, entrypoint, attrib_list, num_attribs, config_id );
891 /* record the current entrypoint for further trace/fool determination */
892 VA_TRACE_ALL(va_TraceCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
893 VA_FOOL_FUNC(va_FoolCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
898 VAStatus vaDestroyConfig (
903 VADriverContextP ctx;
904 VAStatus vaStatus = VA_STATUS_SUCCESS;
909 vaStatus = ctx->vtable->vaDestroyConfig ( ctx, config_id );
911 VA_TRACE_ALL(va_TraceDestroyConfig, dpy, config_id);
916 VAStatus vaQueryConfigAttributes (
918 VAConfigID config_id,
919 VAProfile *profile, /* out */
920 VAEntrypoint *entrypoint, /* out */
921 VAConfigAttrib *attrib_list,/* out */
922 int *num_attribs /* out */
925 VADriverContextP ctx;
929 return ctx->vtable->vaQueryConfigAttributes( ctx, config_id, profile, entrypoint, attrib_list, num_attribs);
932 VAStatus vaQueryProcessingRate (
934 VAConfigID config_id,
935 VAProcessingRateParameter *proc_buf,
936 unsigned int *processing_rate /* out */
939 VADriverContextP ctx;
942 if(!ctx->vtable->vaQueryProcessingRate)
943 return VA_STATUS_ERROR_UNIMPLEMENTED;
944 return ctx->vtable->vaQueryProcessingRate( ctx, config_id, proc_buf, processing_rate);
947 /* XXX: this is a slow implementation that will be removed */
949 va_impl_query_surface_attributes(
950 VADriverContextP ctx,
952 VASurfaceAttrib *out_attribs,
953 unsigned int *out_num_attribs_ptr
956 VASurfaceAttrib *attribs = NULL;
957 unsigned int num_attribs, n;
958 VASurfaceAttrib *out_attrib;
959 unsigned int out_num_attribs;
960 VAImageFormat *image_formats = NULL;
961 int num_image_formats, i;
964 /* List of surface attributes to query */
965 struct va_surface_attrib_map {
966 VASurfaceAttribType type;
967 VAGenericValueType value_type;
969 static const struct va_surface_attrib_map attribs_map[] = {
970 { VASurfaceAttribMinWidth, VAGenericValueTypeInteger },
971 { VASurfaceAttribMaxWidth, VAGenericValueTypeInteger },
972 { VASurfaceAttribMinHeight, VAGenericValueTypeInteger },
973 { VASurfaceAttribMaxHeight, VAGenericValueTypeInteger },
974 { VASurfaceAttribMemoryType, VAGenericValueTypeInteger },
975 { VASurfaceAttribNone, }
978 if (!out_attribs || !out_num_attribs_ptr)
979 return VA_STATUS_ERROR_INVALID_PARAMETER;
980 if (!ctx->vtable->vaGetSurfaceAttributes)
981 return VA_STATUS_ERROR_UNIMPLEMENTED;
983 num_image_formats = ctx->max_image_formats;
984 image_formats = malloc(num_image_formats * sizeof(*image_formats));
985 if (!image_formats) {
986 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
990 va_status = ctx->vtable->vaQueryImageFormats(
991 ctx, image_formats, &num_image_formats);
992 if (va_status != VA_STATUS_SUCCESS)
995 num_attribs = VASurfaceAttribCount + num_image_formats;
996 attribs = malloc(num_attribs * sizeof(*attribs));
998 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
1002 /* Initialize with base surface attributes, except pixel-formats */
1003 for (n = 0; attribs_map[n].type != VASurfaceAttribNone; n++) {
1004 VASurfaceAttrib * const attrib = &attribs[n];
1005 attrib->type = attribs_map[n].type;
1006 attrib->flags = VA_SURFACE_ATTRIB_GETTABLE;
1007 attrib->value.type = attribs_map[n].value_type;
1010 /* Append image formats */
1011 for (i = 0; i < num_image_formats; i++) {
1012 VASurfaceAttrib * const attrib = &attribs[n];
1013 attrib->type = VASurfaceAttribPixelFormat;
1014 attrib->flags = VA_SURFACE_ATTRIB_GETTABLE|VA_SURFACE_ATTRIB_SETTABLE;
1015 attrib->value.type = VAGenericValueTypeInteger;
1016 attrib->value.value.i = image_formats[i].fourcc;
1017 if (++n == num_attribs) {
1018 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
1024 va_status = ctx->vtable->vaGetSurfaceAttributes(
1025 ctx, config, attribs, num_attribs);
1026 if (va_status != VA_STATUS_SUCCESS)
1029 /* Remove invalid entries */
1030 out_num_attribs = 0;
1031 for (n = 0; n < num_attribs; n++) {
1032 VASurfaceAttrib * const attrib = &attribs[n];
1034 if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
1037 // Accept all surface attributes that are not pixel-formats
1038 if (attrib->type != VASurfaceAttribPixelFormat) {
1043 // Drop invalid pixel-format attribute
1044 if (!attrib->value.value.i) {
1045 attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
1049 // Check for duplicates
1050 int is_duplicate = 0;
1051 for (i = n - 1; i >= 0 && !is_duplicate; i--) {
1052 const VASurfaceAttrib * const prev_attrib = &attribs[i];
1053 if (prev_attrib->type != VASurfaceAttribPixelFormat)
1055 is_duplicate = prev_attrib->value.value.i == attrib->value.value.i;
1058 attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
1063 if (*out_num_attribs_ptr < out_num_attribs) {
1064 *out_num_attribs_ptr = out_num_attribs;
1065 va_status = VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
1069 out_attrib = out_attribs;
1070 for (n = 0; n < num_attribs; n++) {
1071 const VASurfaceAttrib * const attrib = &attribs[n];
1072 if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
1074 *out_attrib++ = *attrib;
1079 free(image_formats);
1084 vaQuerySurfaceAttributes(
1087 VASurfaceAttrib *attrib_list,
1088 unsigned int *num_attribs
1091 VADriverContextP ctx;
1097 return VA_STATUS_ERROR_INVALID_DISPLAY;
1099 if (!ctx->vtable->vaQuerySurfaceAttributes)
1100 vaStatus = va_impl_query_surface_attributes(ctx, config,
1101 attrib_list, num_attribs);
1103 vaStatus = ctx->vtable->vaQuerySurfaceAttributes(ctx, config,
1104 attrib_list, num_attribs);
1106 VA_TRACE_LOG(va_TraceQuerySurfaceAttributes, dpy, config, attrib_list, num_attribs);
1114 unsigned int format,
1116 unsigned int height,
1117 VASurfaceID *surfaces,
1118 unsigned int num_surfaces,
1119 VASurfaceAttrib *attrib_list,
1120 unsigned int num_attribs
1123 VADriverContextP ctx;
1129 return VA_STATUS_ERROR_INVALID_DISPLAY;
1131 if (ctx->vtable->vaCreateSurfaces2)
1132 vaStatus = ctx->vtable->vaCreateSurfaces2(ctx, format, width, height,
1133 surfaces, num_surfaces,
1134 attrib_list, num_attribs);
1135 else if (attrib_list && num_attribs > 0)
1136 vaStatus = VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
1138 vaStatus = ctx->vtable->vaCreateSurfaces(ctx, width, height, format,
1139 num_surfaces, surfaces);
1140 VA_TRACE_LOG(va_TraceCreateSurfaces,
1141 dpy, width, height, format, num_surfaces, surfaces,
1142 attrib_list, num_attribs);
1148 VAStatus vaDestroySurfaces (
1150 VASurfaceID *surface_list,
1154 VADriverContextP ctx;
1160 VA_TRACE_LOG(va_TraceDestroySurfaces,
1161 dpy, surface_list, num_surfaces);
1163 vaStatus = ctx->vtable->vaDestroySurfaces( ctx, surface_list, num_surfaces );
1168 VAStatus vaCreateContext (
1170 VAConfigID config_id,
1174 VASurfaceID *render_targets,
1175 int num_render_targets,
1176 VAContextID *context /* out */
1179 VADriverContextP ctx;
1185 vaStatus = ctx->vtable->vaCreateContext( ctx, config_id, picture_width, picture_height,
1186 flag, render_targets, num_render_targets, context );
1188 /* keep current encode/decode resoluton */
1189 VA_TRACE_ALL(va_TraceCreateContext, dpy, config_id, picture_width, picture_height, flag, render_targets, num_render_targets, context);
1194 VAStatus vaDestroyContext (
1199 VADriverContextP ctx;
1205 vaStatus = ctx->vtable->vaDestroyContext( ctx, context );
1207 VA_TRACE_ALL(va_TraceDestroyContext, dpy, context);
1212 VAStatus vaCreateMFContext (
1214 VAMFContextID *mf_context /* out */
1217 VADriverContextP ctx;
1222 if(ctx->vtable->vaCreateMFContext == NULL)
1223 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1226 vaStatus = ctx->vtable->vaCreateMFContext( ctx, mf_context);
1227 VA_TRACE_ALL(va_TraceCreateMFContext, dpy, mf_context);
1233 VAStatus vaMFAddContext (
1235 VAMFContextID mf_context,
1239 VADriverContextP ctx;
1245 if(ctx->vtable->vaMFAddContext == NULL)
1246 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1249 vaStatus = ctx->vtable->vaMFAddContext( ctx, context, mf_context);
1250 VA_TRACE_ALL(va_TraceMFAddContext, dpy, context, mf_context);
1256 VAStatus vaMFReleaseContext (
1258 VAMFContextID mf_context,
1262 VADriverContextP ctx;
1267 if(ctx->vtable->vaMFReleaseContext == NULL)
1268 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1271 vaStatus = ctx->vtable->vaMFReleaseContext( ctx, context, mf_context);
1272 VA_TRACE_ALL(va_TraceMFReleaseContext, dpy, context, mf_context);
1278 VAStatus vaMFSubmit (
1280 VAMFContextID mf_context,
1281 VAContextID *contexts,
1285 VADriverContextP ctx;
1290 CHECK_VTABLE(vaStatus, ctx, MFSubmit);
1291 if(ctx->vtable->vaMFSubmit == NULL)
1292 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1295 vaStatus = ctx->vtable->vaMFSubmit( ctx, mf_context, contexts, num_contexts);
1296 VA_TRACE_ALL(va_TraceMFSubmit, dpy, mf_context, contexts, num_contexts);
1302 VAStatus vaCreateBuffer (
1304 VAContextID context, /* in */
1305 VABufferType type, /* in */
1306 unsigned int size, /* in */
1307 unsigned int num_elements, /* in */
1308 void *data, /* in */
1309 VABufferID *buf_id /* out */
1312 VADriverContextP ctx;
1318 VA_FOOL_FUNC(va_FoolCreateBuffer, dpy, context, type, size, num_elements, data, buf_id);
1320 vaStatus = ctx->vtable->vaCreateBuffer( ctx, context, type, size, num_elements, data, buf_id);
1322 VA_TRACE_LOG(va_TraceCreateBuffer,
1323 dpy, context, type, size, num_elements, data, buf_id);
1328 VAStatus vaCreateBuffer2 (
1330 VAContextID context,
1333 unsigned int height,
1334 unsigned int *unit_size,
1335 unsigned int *pitch,
1339 VADriverContextP ctx;
1344 if(!ctx->vtable->vaCreateBuffer2)
1345 return VA_STATUS_ERROR_UNIMPLEMENTED;
1347 vaStatus = ctx->vtable->vaCreateBuffer2( ctx, context, type, width, height ,unit_size, pitch, buf_id);
1349 VA_TRACE_LOG(va_TraceCreateBuffer,
1350 dpy, context, type, *pitch, height, NULL, buf_id);
1355 VAStatus vaBufferSetNumElements (
1357 VABufferID buf_id, /* in */
1358 unsigned int num_elements /* in */
1361 VADriverContextP ctx;
1365 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1367 return ctx->vtable->vaBufferSetNumElements( ctx, buf_id, num_elements );
1371 VAStatus vaMapBuffer (
1373 VABufferID buf_id, /* in */
1374 void **pbuf /* out */
1377 VADriverContextP ctx;
1383 VA_FOOL_FUNC(va_FoolMapBuffer, dpy, buf_id, pbuf);
1385 va_status = ctx->vtable->vaMapBuffer( ctx, buf_id, pbuf );
1387 VA_TRACE_ALL(va_TraceMapBuffer, dpy, buf_id, pbuf);
1392 VAStatus vaUnmapBuffer (
1394 VABufferID buf_id /* in */
1397 VADriverContextP ctx;
1401 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1403 return ctx->vtable->vaUnmapBuffer( ctx, buf_id );
1406 VAStatus vaDestroyBuffer (
1408 VABufferID buffer_id
1411 VADriverContextP ctx;
1415 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1417 VA_TRACE_LOG(va_TraceDestroyBuffer,
1420 return ctx->vtable->vaDestroyBuffer( ctx, buffer_id );
1423 VAStatus vaBufferInfo (
1425 VAContextID context, /* in */
1426 VABufferID buf_id, /* in */
1427 VABufferType *type, /* out */
1428 unsigned int *size, /* out */
1429 unsigned int *num_elements /* out */
1432 VADriverContextP ctx;
1437 VA_FOOL_FUNC(va_FoolBufferInfo, dpy, buf_id, type, size, num_elements);
1439 return ctx->vtable->vaBufferInfo( ctx, buf_id, type, size, num_elements );
1442 /* Locks buffer for external API usage */
1444 vaAcquireBufferHandle(VADisplay dpy, VABufferID buf_id, VABufferInfo *buf_info)
1446 VADriverContextP ctx;
1451 if (!ctx->vtable->vaAcquireBufferHandle)
1452 return VA_STATUS_ERROR_UNIMPLEMENTED;
1453 return ctx->vtable->vaAcquireBufferHandle(ctx, buf_id, buf_info);
1456 /* Unlocks buffer after usage from external API */
1458 vaReleaseBufferHandle(VADisplay dpy, VABufferID buf_id)
1460 VADriverContextP ctx;
1465 if (!ctx->vtable->vaReleaseBufferHandle)
1466 return VA_STATUS_ERROR_UNIMPLEMENTED;
1467 return ctx->vtable->vaReleaseBufferHandle(ctx, buf_id);
1471 vaExportSurfaceHandle(VADisplay dpy, VASurfaceID surface_id,
1472 uint32_t mem_type, uint32_t flags,
1475 VADriverContextP ctx;
1480 if (!ctx->vtable->vaExportSurfaceHandle)
1481 return VA_STATUS_ERROR_UNIMPLEMENTED;
1482 return ctx->vtable->vaExportSurfaceHandle(ctx, surface_id,
1487 VAStatus vaBeginPicture (
1489 VAContextID context,
1490 VASurfaceID render_target
1493 VADriverContextP ctx;
1499 VA_TRACE_ALL(va_TraceBeginPicture, dpy, context, render_target);
1500 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1502 va_status = ctx->vtable->vaBeginPicture( ctx, context, render_target );
1507 VAStatus vaRenderPicture (
1509 VAContextID context,
1510 VABufferID *buffers,
1514 VADriverContextP ctx;
1519 VA_TRACE_LOG(va_TraceRenderPicture, dpy, context, buffers, num_buffers);
1520 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1522 return ctx->vtable->vaRenderPicture( ctx, context, buffers, num_buffers );
1525 VAStatus vaEndPicture (
1530 VAStatus va_status = VA_STATUS_SUCCESS;
1531 VADriverContextP ctx;
1536 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1538 va_status = ctx->vtable->vaEndPicture( ctx, context );
1540 /* dump surface content */
1541 VA_TRACE_ALL(va_TraceEndPicture, dpy, context, 1);
1546 VAStatus vaSyncSurface (
1548 VASurfaceID render_target
1552 VADriverContextP ctx;
1557 va_status = ctx->vtable->vaSyncSurface( ctx, render_target );
1558 VA_TRACE_LOG(va_TraceSyncSurface, dpy, render_target);
1563 VAStatus vaQuerySurfaceStatus (
1565 VASurfaceID render_target,
1566 VASurfaceStatus *status /* out */
1570 VADriverContextP ctx;
1574 va_status = ctx->vtable->vaQuerySurfaceStatus( ctx, render_target, status );
1576 VA_TRACE_LOG(va_TraceQuerySurfaceStatus, dpy, render_target, status);
1581 VAStatus vaQuerySurfaceError (
1583 VASurfaceID surface,
1584 VAStatus error_status,
1585 void **error_info /*out*/
1589 VADriverContextP ctx;
1593 va_status = ctx->vtable->vaQuerySurfaceError( ctx, surface, error_status, error_info );
1595 VA_TRACE_LOG(va_TraceQuerySurfaceError, dpy, surface, error_status, error_info);
1600 /* Get maximum number of image formats supported by the implementation */
1601 int vaMaxNumImageFormats (
1605 if (!vaDisplayIsValid(dpy))
1608 return CTX(dpy)->max_image_formats;
1611 VAStatus vaQueryImageFormats (
1613 VAImageFormat *format_list, /* out */
1614 int *num_formats /* out */
1617 VADriverContextP ctx;
1621 return ctx->vtable->vaQueryImageFormats ( ctx, format_list, num_formats);
1625 * The width and height fields returned in the VAImage structure may get
1626 * enlarged for some YUV formats. The size of the data buffer that needs
1627 * to be allocated will be given in the "data_size" field in VAImage.
1628 * Image data is not allocated by this function. The client should
1629 * allocate the memory and fill in the VAImage structure's data field
1630 * after looking at "data_size" returned from the library.
1632 VAStatus vaCreateImage (
1634 VAImageFormat *format,
1637 VAImage *image /* out */
1640 VADriverContextP ctx;
1644 return ctx->vtable->vaCreateImage ( ctx, format, width, height, image);
1648 * Should call DestroyImage before destroying the surface it is bound to
1650 VAStatus vaDestroyImage (
1655 VADriverContextP ctx;
1659 return ctx->vtable->vaDestroyImage ( ctx, image);
1662 VAStatus vaSetImagePalette (
1665 unsigned char *palette
1668 VADriverContextP ctx;
1672 return ctx->vtable->vaSetImagePalette ( ctx, image, palette);
1676 * Retrieve surface data into a VAImage
1677 * Image must be in a format supported by the implementation
1679 VAStatus vaGetImage (
1681 VASurfaceID surface,
1682 int x, /* coordinates of the upper left source pixel */
1684 unsigned int width, /* width and height of the region */
1685 unsigned int height,
1689 VADriverContextP ctx;
1693 return ctx->vtable->vaGetImage ( ctx, surface, x, y, width, height, image);
1697 * Copy data from a VAImage to a surface
1698 * Image must be in a format supported by the implementation
1700 VAStatus vaPutImage (
1702 VASurfaceID surface,
1706 unsigned int src_width,
1707 unsigned int src_height,
1710 unsigned int dest_width,
1711 unsigned int dest_height
1714 VADriverContextP ctx;
1718 return ctx->vtable->vaPutImage ( ctx, surface, image, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height );
1722 * Derive an VAImage from an existing surface.
1723 * This interface will derive a VAImage and corresponding image buffer from
1724 * an existing VA Surface. The image buffer can then be mapped/unmapped for
1725 * direct CPU access. This operation is only possible on implementations with
1726 * direct rendering capabilities and internal surface formats that can be
1727 * represented with a VAImage. When the operation is not possible this interface
1728 * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back
1729 * to using vaCreateImage + vaPutImage to accomplish the same task in an
1732 * Implementations should only return success when the resulting image buffer
1733 * would be useable with vaMap/Unmap.
1735 * When directly accessing a surface special care must be taken to insure
1736 * proper synchronization with the graphics hardware. Clients should call
1737 * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent
1738 * rendering or currently being displayed by an overlay.
1740 * Additionally nothing about the contents of a surface should be assumed
1741 * following a vaPutSurface. Implementations are free to modify the surface for
1742 * scaling or subpicture blending within a call to vaPutImage.
1744 * Calls to vaPutImage or vaGetImage using the same surface from which the image
1745 * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or
1746 * vaGetImage with other surfaces is supported.
1748 * An image created with vaDeriveImage should be freed with vaDestroyImage. The
1749 * image and image buffer structures will be destroyed; however, the underlying
1750 * surface will remain unchanged until freed with vaDestroySurfaces.
1752 VAStatus vaDeriveImage (
1754 VASurfaceID surface,
1755 VAImage *image /* out */
1758 VADriverContextP ctx;
1762 return ctx->vtable->vaDeriveImage ( ctx, surface, image );
1766 /* Get maximum number of subpicture formats supported by the implementation */
1767 int vaMaxNumSubpictureFormats (
1771 if (!vaDisplayIsValid(dpy))
1774 return CTX(dpy)->max_subpic_formats;
1778 * Query supported subpicture formats
1779 * The caller must provide a "format_list" array that can hold at
1780 * least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag
1781 * for each format to indicate additional capabilities for that format. The actual
1782 * number of formats returned in "format_list" is returned in "num_formats".
1784 VAStatus vaQuerySubpictureFormats (
1786 VAImageFormat *format_list, /* out */
1787 unsigned int *flags, /* out */
1788 unsigned int *num_formats /* out */
1791 VADriverContextP ctx;
1796 return ctx->vtable->vaQuerySubpictureFormats ( ctx, format_list, flags, num_formats);
1800 * Subpictures are created with an image associated.
1802 VAStatus vaCreateSubpicture (
1805 VASubpictureID *subpicture /* out */
1808 VADriverContextP ctx;
1812 return ctx->vtable->vaCreateSubpicture ( ctx, image, subpicture );
1816 * Destroy the subpicture before destroying the image it is assocated to
1818 VAStatus vaDestroySubpicture (
1820 VASubpictureID subpicture
1823 VADriverContextP ctx;
1827 return ctx->vtable->vaDestroySubpicture ( ctx, subpicture);
1830 VAStatus vaSetSubpictureImage (
1832 VASubpictureID subpicture,
1836 VADriverContextP ctx;
1840 return ctx->vtable->vaSetSubpictureImage ( ctx, subpicture, image);
1845 * If chromakey is enabled, then the area where the source value falls within
1846 * the chromakey [min, max] range is transparent
1848 VAStatus vaSetSubpictureChromakey (
1850 VASubpictureID subpicture,
1851 unsigned int chromakey_min,
1852 unsigned int chromakey_max,
1853 unsigned int chromakey_mask
1856 VADriverContextP ctx;
1860 return ctx->vtable->vaSetSubpictureChromakey ( ctx, subpicture, chromakey_min, chromakey_max, chromakey_mask );
1865 * Global alpha value is between 0 and 1. A value of 1 means fully opaque and
1866 * a value of 0 means fully transparent. If per-pixel alpha is also specified then
1867 * the overall alpha is per-pixel alpha multiplied by the global alpha
1869 VAStatus vaSetSubpictureGlobalAlpha (
1871 VASubpictureID subpicture,
1875 VADriverContextP ctx;
1879 return ctx->vtable->vaSetSubpictureGlobalAlpha ( ctx, subpicture, global_alpha );
1883 vaAssociateSubpicture associates the subpicture with the target_surface.
1884 It defines the region mapping between the subpicture and the target
1885 surface through source and destination rectangles (with the same width and height).
1886 Both will be displayed at the next call to vaPutSurface. Additional
1887 associations before the call to vaPutSurface simply overrides the association.
1889 VAStatus vaAssociateSubpicture (
1891 VASubpictureID subpicture,
1892 VASurfaceID *target_surfaces,
1894 short src_x, /* upper left offset in subpicture */
1896 unsigned short src_width,
1897 unsigned short src_height,
1898 short dest_x, /* upper left offset in surface */
1900 unsigned short dest_width,
1901 unsigned short dest_height,
1903 * whether to enable chroma-keying or global-alpha
1904 * see VA_SUBPICTURE_XXX values
1909 VADriverContextP ctx;
1913 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 );
1917 * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces.
1919 VAStatus vaDeassociateSubpicture (
1921 VASubpictureID subpicture,
1922 VASurfaceID *target_surfaces,
1926 VADriverContextP ctx;
1930 return ctx->vtable->vaDeassociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces );
1934 /* Get maximum number of display attributes supported by the implementation */
1935 int vaMaxNumDisplayAttributes (
1941 if (!vaDisplayIsValid(dpy))
1944 tmp = CTX(dpy)->max_display_attributes;
1946 VA_TRACE_LOG(va_TraceMaxNumDisplayAttributes, dpy, tmp);
1952 * Query display attributes
1953 * The caller must provide a "attr_list" array that can hold at
1954 * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
1955 * returned in "attr_list" is returned in "num_attributes".
1957 VAStatus vaQueryDisplayAttributes (
1959 VADisplayAttribute *attr_list, /* out */
1960 int *num_attributes /* out */
1963 VADriverContextP ctx;
1968 va_status = ctx->vtable->vaQueryDisplayAttributes ( ctx, attr_list, num_attributes );
1970 VA_TRACE_LOG(va_TraceQueryDisplayAttributes, dpy, attr_list, num_attributes);
1977 * Get display attributes
1978 * This function returns the current attribute values in "attr_list".
1979 * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
1980 * from vaQueryDisplayAttributes() can have their values retrieved.
1982 VAStatus vaGetDisplayAttributes (
1984 VADisplayAttribute *attr_list, /* in/out */
1988 VADriverContextP ctx;
1993 va_status = ctx->vtable->vaGetDisplayAttributes ( ctx, attr_list, num_attributes );
1995 VA_TRACE_LOG(va_TraceGetDisplayAttributes, dpy, attr_list, num_attributes);
2001 * Set display attributes
2002 * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
2003 * from vaQueryDisplayAttributes() can be set. If the attribute is not settable or
2004 * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
2006 VAStatus vaSetDisplayAttributes (
2008 VADisplayAttribute *attr_list,
2012 VADriverContextP ctx;
2017 va_status = ctx->vtable->vaSetDisplayAttributes ( ctx, attr_list, num_attributes );
2018 VA_TRACE_LOG(va_TraceSetDisplayAttributes, dpy, attr_list, num_attributes);
2023 VAStatus vaLockSurface(VADisplay dpy,
2024 VASurfaceID surface,
2025 unsigned int *fourcc, /* following are output argument */
2026 unsigned int *luma_stride,
2027 unsigned int *chroma_u_stride,
2028 unsigned int *chroma_v_stride,
2029 unsigned int *luma_offset,
2030 unsigned int *chroma_u_offset,
2031 unsigned int *chroma_v_offset,
2032 unsigned int *buffer_name,
2036 VADriverContextP ctx;
2040 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);
2044 VAStatus vaUnlockSurface(VADisplay dpy,
2048 VADriverContextP ctx;
2052 return ctx->vtable->vaUnlockSurface( ctx, surface );
2055 /* Video Processing */
2056 #define VA_VPP_INIT_CONTEXT(ctx, dpy) do { \
2057 CHECK_DISPLAY(dpy); \
2060 return VA_STATUS_ERROR_INVALID_DISPLAY; \
2063 #define VA_VPP_INVOKE(dpy, func, args) do { \
2064 if (!ctx->vtable_vpp->va##func) \
2065 return VA_STATUS_ERROR_UNIMPLEMENTED; \
2066 status = ctx->vtable_vpp->va##func args; \
2070 vaQueryVideoProcFilters(
2072 VAContextID context,
2073 VAProcFilterType *filters,
2074 unsigned int *num_filters
2077 VADriverContextP ctx;
2080 VA_VPP_INIT_CONTEXT(ctx, dpy);
2083 QueryVideoProcFilters,
2084 (ctx, context, filters, num_filters)
2090 vaQueryVideoProcFilterCaps(
2092 VAContextID context,
2093 VAProcFilterType type,
2095 unsigned int *num_filter_caps
2098 VADriverContextP ctx;
2101 VA_VPP_INIT_CONTEXT(ctx, dpy);
2104 QueryVideoProcFilterCaps,
2105 (ctx, context, type, filter_caps, num_filter_caps)
2111 vaQueryVideoProcPipelineCaps(
2113 VAContextID context,
2114 VABufferID *filters,
2115 unsigned int num_filters,
2116 VAProcPipelineCaps *pipeline_caps
2119 VADriverContextP ctx;
2122 VA_VPP_INIT_CONTEXT(ctx, dpy);
2125 QueryVideoProcPipelineCaps,
2126 (ctx, context, filters, num_filters, pipeline_caps)