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, 2 },
406 { VA_MAJOR_VERSION, 1 },
407 { VA_MAJOR_VERSION, 0 },
411 for (i = 0; compatible_versions[i].major >= 0; i++) {
412 if (va_getDriverInitName(init_func_s, sizeof(init_func_s),
413 compatible_versions[i].major,
414 compatible_versions[i].minor)) {
415 init_func = (VADriverInit)dlsym(handle, init_func_s);
417 va_infoMessage(dpy, "Found init function %s\n", init_func_s);
423 if (compatible_versions[i].major < 0) {
424 va_errorMessage(dpy, "%s has no function %s\n",
425 driver_path, init_func_s);
428 struct VADriverVTable *vtable = ctx->vtable;
429 struct VADriverVTableVPP *vtable_vpp = ctx->vtable_vpp;
431 vaStatus = VA_STATUS_SUCCESS;
433 vtable = calloc(1, sizeof(*vtable));
435 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
437 ctx->vtable = vtable;
440 vtable_vpp = calloc(1, sizeof(*vtable_vpp));
442 vtable_vpp->version = VA_DRIVER_VTABLE_VPP_VERSION;
444 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
446 ctx->vtable_vpp = vtable_vpp;
448 if (init_func && VA_STATUS_SUCCESS == vaStatus)
449 vaStatus = (*init_func)(ctx);
451 if (VA_STATUS_SUCCESS == vaStatus) {
452 CHECK_MAXIMUM(vaStatus, ctx, profiles);
453 CHECK_MAXIMUM(vaStatus, ctx, entrypoints);
454 CHECK_MAXIMUM(vaStatus, ctx, attributes);
455 CHECK_MAXIMUM(vaStatus, ctx, image_formats);
456 CHECK_MAXIMUM(vaStatus, ctx, subpic_formats);
457 CHECK_STRING(vaStatus, ctx, vendor);
458 CHECK_VTABLE(vaStatus, ctx, Terminate);
459 CHECK_VTABLE(vaStatus, ctx, QueryConfigProfiles);
460 CHECK_VTABLE(vaStatus, ctx, QueryConfigEntrypoints);
461 CHECK_VTABLE(vaStatus, ctx, QueryConfigAttributes);
462 CHECK_VTABLE(vaStatus, ctx, CreateConfig);
463 CHECK_VTABLE(vaStatus, ctx, DestroyConfig);
464 CHECK_VTABLE(vaStatus, ctx, GetConfigAttributes);
465 CHECK_VTABLE(vaStatus, ctx, CreateSurfaces);
466 CHECK_VTABLE(vaStatus, ctx, DestroySurfaces);
467 CHECK_VTABLE(vaStatus, ctx, CreateContext);
468 CHECK_VTABLE(vaStatus, ctx, DestroyContext);
469 CHECK_VTABLE(vaStatus, ctx, CreateBuffer);
470 CHECK_VTABLE(vaStatus, ctx, BufferSetNumElements);
471 CHECK_VTABLE(vaStatus, ctx, MapBuffer);
472 CHECK_VTABLE(vaStatus, ctx, UnmapBuffer);
473 CHECK_VTABLE(vaStatus, ctx, DestroyBuffer);
474 CHECK_VTABLE(vaStatus, ctx, BeginPicture);
475 CHECK_VTABLE(vaStatus, ctx, RenderPicture);
476 CHECK_VTABLE(vaStatus, ctx, EndPicture);
477 CHECK_VTABLE(vaStatus, ctx, SyncSurface);
478 CHECK_VTABLE(vaStatus, ctx, QuerySurfaceStatus);
479 CHECK_VTABLE(vaStatus, ctx, PutSurface);
480 CHECK_VTABLE(vaStatus, ctx, QueryImageFormats);
481 CHECK_VTABLE(vaStatus, ctx, CreateImage);
482 CHECK_VTABLE(vaStatus, ctx, DeriveImage);
483 CHECK_VTABLE(vaStatus, ctx, DestroyImage);
484 CHECK_VTABLE(vaStatus, ctx, SetImagePalette);
485 CHECK_VTABLE(vaStatus, ctx, GetImage);
486 CHECK_VTABLE(vaStatus, ctx, PutImage);
487 CHECK_VTABLE(vaStatus, ctx, QuerySubpictureFormats);
488 CHECK_VTABLE(vaStatus, ctx, CreateSubpicture);
489 CHECK_VTABLE(vaStatus, ctx, DestroySubpicture);
490 CHECK_VTABLE(vaStatus, ctx, SetSubpictureImage);
491 CHECK_VTABLE(vaStatus, ctx, SetSubpictureChromakey);
492 CHECK_VTABLE(vaStatus, ctx, SetSubpictureGlobalAlpha);
493 CHECK_VTABLE(vaStatus, ctx, AssociateSubpicture);
494 CHECK_VTABLE(vaStatus, ctx, DeassociateSubpicture);
495 CHECK_VTABLE(vaStatus, ctx, QueryDisplayAttributes);
496 CHECK_VTABLE(vaStatus, ctx, GetDisplayAttributes);
497 CHECK_VTABLE(vaStatus, ctx, SetDisplayAttributes);
499 if (VA_STATUS_SUCCESS != vaStatus) {
500 va_errorMessage(dpy, "%s init failed\n", driver_path);
503 if (VA_STATUS_SUCCESS == vaStatus)
504 ctx->handle = handle;
511 driver_dir = strtok_r(NULL, ":", &saveptr);
519 VAPrivFunc vaGetLibFunc(VADisplay dpy, const char *func)
521 VADriverContextP ctx;
522 if (!vaDisplayIsValid(dpy))
526 if (NULL == ctx->handle)
529 return (VAPrivFunc) dlsym(ctx->handle, func);
534 * Returns a short english description of error_status
536 const char *vaErrorStr(VAStatus error_status)
538 switch(error_status) {
539 case VA_STATUS_SUCCESS:
540 return "success (no error)";
541 case VA_STATUS_ERROR_OPERATION_FAILED:
542 return "operation failed";
543 case VA_STATUS_ERROR_ALLOCATION_FAILED:
544 return "resource allocation failed";
545 case VA_STATUS_ERROR_INVALID_DISPLAY:
546 return "invalid VADisplay";
547 case VA_STATUS_ERROR_INVALID_CONFIG:
548 return "invalid VAConfigID";
549 case VA_STATUS_ERROR_INVALID_CONTEXT:
550 return "invalid VAContextID";
551 case VA_STATUS_ERROR_INVALID_SURFACE:
552 return "invalid VASurfaceID";
553 case VA_STATUS_ERROR_INVALID_BUFFER:
554 return "invalid VABufferID";
555 case VA_STATUS_ERROR_INVALID_IMAGE:
556 return "invalid VAImageID";
557 case VA_STATUS_ERROR_INVALID_SUBPICTURE:
558 return "invalid VASubpictureID";
559 case VA_STATUS_ERROR_ATTR_NOT_SUPPORTED:
560 return "attribute not supported";
561 case VA_STATUS_ERROR_MAX_NUM_EXCEEDED:
562 return "list argument exceeds maximum number";
563 case VA_STATUS_ERROR_UNSUPPORTED_PROFILE:
564 return "the requested VAProfile is not supported";
565 case VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT:
566 return "the requested VAEntryPoint is not supported";
567 case VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT:
568 return "the requested RT Format is not supported";
569 case VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE:
570 return "the requested VABufferType is not supported";
571 case VA_STATUS_ERROR_SURFACE_BUSY:
572 return "surface is in use";
573 case VA_STATUS_ERROR_FLAG_NOT_SUPPORTED:
574 return "flag not supported";
575 case VA_STATUS_ERROR_INVALID_PARAMETER:
576 return "invalid parameter";
577 case VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED:
578 return "resolution not supported";
579 case VA_STATUS_ERROR_UNIMPLEMENTED:
580 return "the requested function is not implemented";
581 case VA_STATUS_ERROR_SURFACE_IN_DISPLAYING:
582 return "surface is in displaying (may by overlay)" ;
583 case VA_STATUS_ERROR_INVALID_IMAGE_FORMAT:
584 return "invalid VAImageFormat";
585 case VA_STATUS_ERROR_DECODING_ERROR:
586 return "internal decoding error";
587 case VA_STATUS_ERROR_ENCODING_ERROR:
588 return "internal encoding error";
589 case VA_STATUS_ERROR_INVALID_VALUE:
590 return "an invalid/unsupported value was supplied";
591 case VA_STATUS_ERROR_UNSUPPORTED_FILTER:
592 return "the requested filter is not supported";
593 case VA_STATUS_ERROR_INVALID_FILTER_CHAIN:
594 return "an invalid filter chain was supplied";
595 case VA_STATUS_ERROR_HW_BUSY:
596 return "HW busy now";
597 case VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE:
598 return "an unsupported memory type was supplied";
599 case VA_STATUS_ERROR_NOT_ENOUGH_BUFFER:
600 return "allocated memory size is not enough for input or output";
601 case VA_STATUS_ERROR_UNKNOWN:
602 return "unknown libva error";
604 return "unknown libva error / description missing";
607 const static char *prefer_driver_list[4] = {
614 VAStatus vaSetDriverName(
619 VADriverContextP ctx;
620 VAStatus vaStatus = VA_STATUS_SUCCESS;
621 char *override_driver_name = NULL;
625 if (geteuid() != getuid()) {
626 vaStatus = VA_STATUS_ERROR_OPERATION_FAILED;
627 va_errorMessage(dpy, "no permission to vaSetDriverName\n");
631 if (strlen(driver_name) == 0 || strlen(driver_name) >=256) {
632 vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
633 va_errorMessage(dpy, "vaSetDriverName returns %s\n",
634 vaErrorStr(vaStatus));
639 for (i = 0; i < sizeof(prefer_driver_list) / sizeof(char *); i++) {
640 if (strlen(prefer_driver_list[i]) != strlen(driver_name))
642 if (!strncmp(prefer_driver_list[i], driver_name, strlen(driver_name))) {
649 vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
650 va_errorMessage(dpy, "vaSetDriverName returns %s. Incorrect parameter\n",
651 vaErrorStr(vaStatus));
655 override_driver_name = strdup(driver_name);
657 if (!override_driver_name) {
658 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
659 va_errorMessage(dpy, "vaSetDriverName returns %s. Out of Memory\n",
660 vaErrorStr(vaStatus));
664 ctx->override_driver_name = override_driver_name;
665 return VA_STATUS_SUCCESS;
668 VAStatus vaInitialize (
670 int *major_version, /* out */
671 int *minor_version /* out */
674 const char *driver_name_env = NULL;
675 char *driver_name = NULL;
677 VADriverContextP ctx;
689 va_infoMessage(dpy, "VA-API version %s\n", VA_VERSION_S);
691 vaStatus = va_getDriverName(dpy, &driver_name);
693 if (!ctx->override_driver_name) {
694 va_infoMessage(dpy, "va_getDriverName() returns %d\n", vaStatus);
696 driver_name_env = getenv("LIBVA_DRIVER_NAME");
697 } else if (vaStatus == VA_STATUS_SUCCESS) {
701 driver_name = strdup(ctx->override_driver_name);
703 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
704 va_errorMessage(dpy, "vaInitialize() failed with %s, out of memory\n",
705 vaErrorStr(vaStatus));
708 va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
711 if (driver_name_env && (geteuid() == getuid())) {
712 /* Don't allow setuid apps to use LIBVA_DRIVER_NAME */
713 if (driver_name) /* memory is allocated in va_getDriverName */
716 driver_name = strdup(driver_name_env);
717 vaStatus = VA_STATUS_SUCCESS;
718 va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
721 if ((VA_STATUS_SUCCESS == vaStatus) && (driver_name != NULL)) {
722 vaStatus = va_openDriver(dpy, driver_name);
723 va_infoMessage(dpy, "va_openDriver() returns %d\n", vaStatus);
725 *major_version = VA_MAJOR_VERSION;
726 *minor_version = VA_MINOR_VERSION;
728 va_errorMessage(dpy, "va_getDriverName() failed with %s,driver_name=%s\n",
729 vaErrorStr(vaStatus), driver_name);
734 VA_TRACE_LOG(va_TraceInitialize, dpy, major_version, minor_version);
741 * After this call, all library internal resources will be cleaned up
743 VAStatus vaTerminate (
747 VAStatus vaStatus = VA_STATUS_SUCCESS;
748 VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
749 VADriverContextP old_ctx;
754 if (old_ctx->handle) {
755 vaStatus = old_ctx->vtable->vaTerminate(old_ctx);
756 dlclose(old_ctx->handle);
757 old_ctx->handle = NULL;
759 free(old_ctx->vtable);
760 old_ctx->vtable = NULL;
761 free(old_ctx->vtable_vpp);
762 old_ctx->vtable_vpp = NULL;
764 if (old_ctx->override_driver_name) {
765 free(old_ctx->override_driver_name);
766 old_ctx->override_driver_name = NULL;
769 VA_TRACE_LOG(va_TraceTerminate, dpy);
775 if (VA_STATUS_SUCCESS == vaStatus)
776 pDisplayContext->vaDestroy(pDisplayContext);
782 * vaQueryVendorString returns a pointer to a zero-terminated string
783 * describing some aspects of the VA implemenation on a specific
784 * hardware accelerator. The format of the returned string is:
785 * <vendorname>-<major_version>-<minor_version>-<addtional_info>
786 * e.g. for the Intel GMA500 implementation, an example would be:
787 * "IntelGMA500-1.0-0.2-patch3
789 const char *vaQueryVendorString (
793 if (!vaDisplayIsValid(dpy))
796 return CTX(dpy)->str_vendor;
800 /* Get maximum number of profiles supported by the implementation */
801 int vaMaxNumProfiles (
805 if (!vaDisplayIsValid(dpy))
808 return CTX(dpy)->max_profiles;
811 /* Get maximum number of entrypoints supported by the implementation */
812 int vaMaxNumEntrypoints (
816 if (!vaDisplayIsValid(dpy))
819 return CTX(dpy)->max_entrypoints;
823 /* Get maximum number of attributs supported by the implementation */
824 int vaMaxNumConfigAttributes (
828 if (!vaDisplayIsValid(dpy))
831 return CTX(dpy)->max_attributes;
834 VAStatus vaQueryConfigEntrypoints (
837 VAEntrypoint *entrypoints, /* out */
838 int *num_entrypoints /* out */
841 VADriverContextP ctx;
845 return ctx->vtable->vaQueryConfigEntrypoints ( ctx, profile, entrypoints, num_entrypoints);
848 VAStatus vaGetConfigAttributes (
851 VAEntrypoint entrypoint,
852 VAConfigAttrib *attrib_list, /* in/out */
856 VADriverContextP ctx;
860 return ctx->vtable->vaGetConfigAttributes ( ctx, profile, entrypoint, attrib_list, num_attribs );
863 VAStatus vaQueryConfigProfiles (
865 VAProfile *profile_list, /* out */
866 int *num_profiles /* out */
869 VADriverContextP ctx;
873 return ctx->vtable->vaQueryConfigProfiles ( ctx, profile_list, num_profiles );
876 VAStatus vaCreateConfig (
879 VAEntrypoint entrypoint,
880 VAConfigAttrib *attrib_list,
882 VAConfigID *config_id /* out */
885 VADriverContextP ctx;
886 VAStatus vaStatus = VA_STATUS_SUCCESS;
891 vaStatus = ctx->vtable->vaCreateConfig ( ctx, profile, entrypoint, attrib_list, num_attribs, config_id );
893 /* record the current entrypoint for further trace/fool determination */
894 VA_TRACE_ALL(va_TraceCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
895 VA_FOOL_FUNC(va_FoolCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
900 VAStatus vaDestroyConfig (
905 VADriverContextP ctx;
906 VAStatus vaStatus = VA_STATUS_SUCCESS;
911 vaStatus = ctx->vtable->vaDestroyConfig ( ctx, config_id );
913 VA_TRACE_ALL(va_TraceDestroyConfig, dpy, config_id);
918 VAStatus vaQueryConfigAttributes (
920 VAConfigID config_id,
921 VAProfile *profile, /* out */
922 VAEntrypoint *entrypoint, /* out */
923 VAConfigAttrib *attrib_list,/* out */
924 int *num_attribs /* out */
927 VADriverContextP ctx;
931 return ctx->vtable->vaQueryConfigAttributes( ctx, config_id, profile, entrypoint, attrib_list, num_attribs);
934 VAStatus vaQueryProcessingRate (
936 VAConfigID config_id,
937 VAProcessingRateParameter *proc_buf,
938 unsigned int *processing_rate /* out */
941 VADriverContextP ctx;
944 if(!ctx->vtable->vaQueryProcessingRate)
945 return VA_STATUS_ERROR_UNIMPLEMENTED;
946 return ctx->vtable->vaQueryProcessingRate( ctx, config_id, proc_buf, processing_rate);
949 /* XXX: this is a slow implementation that will be removed */
951 va_impl_query_surface_attributes(
952 VADriverContextP ctx,
954 VASurfaceAttrib *out_attribs,
955 unsigned int *out_num_attribs_ptr
958 VASurfaceAttrib *attribs = NULL;
959 unsigned int num_attribs, n;
960 VASurfaceAttrib *out_attrib;
961 unsigned int out_num_attribs;
962 VAImageFormat *image_formats = NULL;
963 int num_image_formats, i;
966 /* List of surface attributes to query */
967 struct va_surface_attrib_map {
968 VASurfaceAttribType type;
969 VAGenericValueType value_type;
971 static const struct va_surface_attrib_map attribs_map[] = {
972 { VASurfaceAttribMinWidth, VAGenericValueTypeInteger },
973 { VASurfaceAttribMaxWidth, VAGenericValueTypeInteger },
974 { VASurfaceAttribMinHeight, VAGenericValueTypeInteger },
975 { VASurfaceAttribMaxHeight, VAGenericValueTypeInteger },
976 { VASurfaceAttribMemoryType, VAGenericValueTypeInteger },
977 { VASurfaceAttribNone, }
980 if (!out_attribs || !out_num_attribs_ptr)
981 return VA_STATUS_ERROR_INVALID_PARAMETER;
982 if (!ctx->vtable->vaGetSurfaceAttributes)
983 return VA_STATUS_ERROR_UNIMPLEMENTED;
985 num_image_formats = ctx->max_image_formats;
986 image_formats = malloc(num_image_formats * sizeof(*image_formats));
987 if (!image_formats) {
988 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
992 va_status = ctx->vtable->vaQueryImageFormats(
993 ctx, image_formats, &num_image_formats);
994 if (va_status != VA_STATUS_SUCCESS)
997 num_attribs = VASurfaceAttribCount + num_image_formats;
998 attribs = malloc(num_attribs * sizeof(*attribs));
1000 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
1004 /* Initialize with base surface attributes, except pixel-formats */
1005 for (n = 0; attribs_map[n].type != VASurfaceAttribNone; n++) {
1006 VASurfaceAttrib * const attrib = &attribs[n];
1007 attrib->type = attribs_map[n].type;
1008 attrib->flags = VA_SURFACE_ATTRIB_GETTABLE;
1009 attrib->value.type = attribs_map[n].value_type;
1012 /* Append image formats */
1013 for (i = 0; i < num_image_formats; i++) {
1014 VASurfaceAttrib * const attrib = &attribs[n];
1015 attrib->type = VASurfaceAttribPixelFormat;
1016 attrib->flags = VA_SURFACE_ATTRIB_GETTABLE|VA_SURFACE_ATTRIB_SETTABLE;
1017 attrib->value.type = VAGenericValueTypeInteger;
1018 attrib->value.value.i = image_formats[i].fourcc;
1019 if (++n == num_attribs) {
1020 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
1026 va_status = ctx->vtable->vaGetSurfaceAttributes(
1027 ctx, config, attribs, num_attribs);
1028 if (va_status != VA_STATUS_SUCCESS)
1031 /* Remove invalid entries */
1032 out_num_attribs = 0;
1033 for (n = 0; n < num_attribs; n++) {
1034 VASurfaceAttrib * const attrib = &attribs[n];
1036 if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
1039 // Accept all surface attributes that are not pixel-formats
1040 if (attrib->type != VASurfaceAttribPixelFormat) {
1045 // Drop invalid pixel-format attribute
1046 if (!attrib->value.value.i) {
1047 attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
1051 // Check for duplicates
1052 int is_duplicate = 0;
1053 for (i = n - 1; i >= 0 && !is_duplicate; i--) {
1054 const VASurfaceAttrib * const prev_attrib = &attribs[i];
1055 if (prev_attrib->type != VASurfaceAttribPixelFormat)
1057 is_duplicate = prev_attrib->value.value.i == attrib->value.value.i;
1060 attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
1065 if (*out_num_attribs_ptr < out_num_attribs) {
1066 *out_num_attribs_ptr = out_num_attribs;
1067 va_status = VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
1071 out_attrib = out_attribs;
1072 for (n = 0; n < num_attribs; n++) {
1073 const VASurfaceAttrib * const attrib = &attribs[n];
1074 if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
1076 *out_attrib++ = *attrib;
1081 free(image_formats);
1086 vaQuerySurfaceAttributes(
1089 VASurfaceAttrib *attrib_list,
1090 unsigned int *num_attribs
1093 VADriverContextP ctx;
1099 return VA_STATUS_ERROR_INVALID_DISPLAY;
1101 if (!ctx->vtable->vaQuerySurfaceAttributes)
1102 vaStatus = va_impl_query_surface_attributes(ctx, config,
1103 attrib_list, num_attribs);
1105 vaStatus = ctx->vtable->vaQuerySurfaceAttributes(ctx, config,
1106 attrib_list, num_attribs);
1108 VA_TRACE_LOG(va_TraceQuerySurfaceAttributes, dpy, config, attrib_list, num_attribs);
1116 unsigned int format,
1118 unsigned int height,
1119 VASurfaceID *surfaces,
1120 unsigned int num_surfaces,
1121 VASurfaceAttrib *attrib_list,
1122 unsigned int num_attribs
1125 VADriverContextP ctx;
1131 return VA_STATUS_ERROR_INVALID_DISPLAY;
1133 if (ctx->vtable->vaCreateSurfaces2)
1134 vaStatus = ctx->vtable->vaCreateSurfaces2(ctx, format, width, height,
1135 surfaces, num_surfaces,
1136 attrib_list, num_attribs);
1137 else if (attrib_list && num_attribs > 0)
1138 vaStatus = VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
1140 vaStatus = ctx->vtable->vaCreateSurfaces(ctx, width, height, format,
1141 num_surfaces, surfaces);
1142 VA_TRACE_LOG(va_TraceCreateSurfaces,
1143 dpy, width, height, format, num_surfaces, surfaces,
1144 attrib_list, num_attribs);
1150 VAStatus vaDestroySurfaces (
1152 VASurfaceID *surface_list,
1156 VADriverContextP ctx;
1162 VA_TRACE_LOG(va_TraceDestroySurfaces,
1163 dpy, surface_list, num_surfaces);
1165 vaStatus = ctx->vtable->vaDestroySurfaces( ctx, surface_list, num_surfaces );
1170 VAStatus vaCreateContext (
1172 VAConfigID config_id,
1176 VASurfaceID *render_targets,
1177 int num_render_targets,
1178 VAContextID *context /* out */
1181 VADriverContextP ctx;
1187 vaStatus = ctx->vtable->vaCreateContext( ctx, config_id, picture_width, picture_height,
1188 flag, render_targets, num_render_targets, context );
1190 /* keep current encode/decode resoluton */
1191 VA_TRACE_ALL(va_TraceCreateContext, dpy, config_id, picture_width, picture_height, flag, render_targets, num_render_targets, context);
1196 VAStatus vaDestroyContext (
1201 VADriverContextP ctx;
1207 vaStatus = ctx->vtable->vaDestroyContext( ctx, context );
1209 VA_TRACE_ALL(va_TraceDestroyContext, dpy, context);
1214 VAStatus vaCreateMFContext (
1216 VAMFContextID *mf_context /* out */
1219 VADriverContextP ctx;
1224 if(ctx->vtable->vaCreateMFContext == NULL)
1225 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1228 vaStatus = ctx->vtable->vaCreateMFContext( ctx, mf_context);
1229 VA_TRACE_ALL(va_TraceCreateMFContext, dpy, mf_context);
1235 VAStatus vaMFAddContext (
1237 VAMFContextID mf_context,
1241 VADriverContextP ctx;
1247 if(ctx->vtable->vaMFAddContext == NULL)
1248 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1251 vaStatus = ctx->vtable->vaMFAddContext( ctx, context, mf_context);
1252 VA_TRACE_ALL(va_TraceMFAddContext, dpy, context, mf_context);
1258 VAStatus vaMFReleaseContext (
1260 VAMFContextID mf_context,
1264 VADriverContextP ctx;
1269 if(ctx->vtable->vaMFReleaseContext == NULL)
1270 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1273 vaStatus = ctx->vtable->vaMFReleaseContext( ctx, context, mf_context);
1274 VA_TRACE_ALL(va_TraceMFReleaseContext, dpy, context, mf_context);
1280 VAStatus vaMFSubmit (
1282 VAMFContextID mf_context,
1283 VAContextID *contexts,
1287 VADriverContextP ctx;
1292 CHECK_VTABLE(vaStatus, ctx, MFSubmit);
1293 if(ctx->vtable->vaMFSubmit == NULL)
1294 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1297 vaStatus = ctx->vtable->vaMFSubmit( ctx, mf_context, contexts, num_contexts);
1298 VA_TRACE_ALL(va_TraceMFSubmit, dpy, mf_context, contexts, num_contexts);
1304 VAStatus vaCreateBuffer (
1306 VAContextID context, /* in */
1307 VABufferType type, /* in */
1308 unsigned int size, /* in */
1309 unsigned int num_elements, /* in */
1310 void *data, /* in */
1311 VABufferID *buf_id /* out */
1314 VADriverContextP ctx;
1320 VA_FOOL_FUNC(va_FoolCreateBuffer, dpy, context, type, size, num_elements, data, buf_id);
1322 vaStatus = ctx->vtable->vaCreateBuffer( ctx, context, type, size, num_elements, data, buf_id);
1324 VA_TRACE_LOG(va_TraceCreateBuffer,
1325 dpy, context, type, size, num_elements, data, buf_id);
1330 VAStatus vaCreateBuffer2 (
1332 VAContextID context,
1335 unsigned int height,
1336 unsigned int *unit_size,
1337 unsigned int *pitch,
1341 VADriverContextP ctx;
1346 if(!ctx->vtable->vaCreateBuffer2)
1347 return VA_STATUS_ERROR_UNIMPLEMENTED;
1349 vaStatus = ctx->vtable->vaCreateBuffer2( ctx, context, type, width, height ,unit_size, pitch, buf_id);
1351 VA_TRACE_LOG(va_TraceCreateBuffer,
1352 dpy, context, type, *pitch, height, NULL, buf_id);
1357 VAStatus vaBufferSetNumElements (
1359 VABufferID buf_id, /* in */
1360 unsigned int num_elements /* in */
1363 VADriverContextP ctx;
1367 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1369 return ctx->vtable->vaBufferSetNumElements( ctx, buf_id, num_elements );
1373 VAStatus vaMapBuffer (
1375 VABufferID buf_id, /* in */
1376 void **pbuf /* out */
1379 VADriverContextP ctx;
1385 VA_FOOL_FUNC(va_FoolMapBuffer, dpy, buf_id, pbuf);
1387 va_status = ctx->vtable->vaMapBuffer( ctx, buf_id, pbuf );
1389 VA_TRACE_ALL(va_TraceMapBuffer, dpy, buf_id, pbuf);
1394 VAStatus vaUnmapBuffer (
1396 VABufferID buf_id /* in */
1399 VADriverContextP ctx;
1403 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1405 return ctx->vtable->vaUnmapBuffer( ctx, buf_id );
1408 VAStatus vaDestroyBuffer (
1410 VABufferID buffer_id
1413 VADriverContextP ctx;
1417 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1419 VA_TRACE_LOG(va_TraceDestroyBuffer,
1422 return ctx->vtable->vaDestroyBuffer( ctx, buffer_id );
1425 VAStatus vaBufferInfo (
1427 VAContextID context, /* in */
1428 VABufferID buf_id, /* in */
1429 VABufferType *type, /* out */
1430 unsigned int *size, /* out */
1431 unsigned int *num_elements /* out */
1434 VADriverContextP ctx;
1439 VA_FOOL_FUNC(va_FoolBufferInfo, dpy, buf_id, type, size, num_elements);
1441 return ctx->vtable->vaBufferInfo( ctx, buf_id, type, size, num_elements );
1444 /* Locks buffer for external API usage */
1446 vaAcquireBufferHandle(VADisplay dpy, VABufferID buf_id, VABufferInfo *buf_info)
1448 VADriverContextP ctx;
1453 if (!ctx->vtable->vaAcquireBufferHandle)
1454 return VA_STATUS_ERROR_UNIMPLEMENTED;
1455 return ctx->vtable->vaAcquireBufferHandle(ctx, buf_id, buf_info);
1458 /* Unlocks buffer after usage from external API */
1460 vaReleaseBufferHandle(VADisplay dpy, VABufferID buf_id)
1462 VADriverContextP ctx;
1467 if (!ctx->vtable->vaReleaseBufferHandle)
1468 return VA_STATUS_ERROR_UNIMPLEMENTED;
1469 return ctx->vtable->vaReleaseBufferHandle(ctx, buf_id);
1473 vaExportSurfaceHandle(VADisplay dpy, VASurfaceID surface_id,
1474 uint32_t mem_type, uint32_t flags,
1477 VADriverContextP ctx;
1482 if (!ctx->vtable->vaExportSurfaceHandle)
1483 return VA_STATUS_ERROR_UNIMPLEMENTED;
1484 return ctx->vtable->vaExportSurfaceHandle(ctx, surface_id,
1489 VAStatus vaBeginPicture (
1491 VAContextID context,
1492 VASurfaceID render_target
1495 VADriverContextP ctx;
1501 VA_TRACE_ALL(va_TraceBeginPicture, dpy, context, render_target);
1502 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1504 va_status = ctx->vtable->vaBeginPicture( ctx, context, render_target );
1509 VAStatus vaRenderPicture (
1511 VAContextID context,
1512 VABufferID *buffers,
1516 VADriverContextP ctx;
1521 VA_TRACE_LOG(va_TraceRenderPicture, dpy, context, buffers, num_buffers);
1522 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1524 return ctx->vtable->vaRenderPicture( ctx, context, buffers, num_buffers );
1527 VAStatus vaEndPicture (
1532 VAStatus va_status = VA_STATUS_SUCCESS;
1533 VADriverContextP ctx;
1538 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1540 va_status = ctx->vtable->vaEndPicture( ctx, context );
1542 /* dump surface content */
1543 VA_TRACE_ALL(va_TraceEndPicture, dpy, context, 1);
1548 VAStatus vaSyncSurface (
1550 VASurfaceID render_target
1554 VADriverContextP ctx;
1559 va_status = ctx->vtable->vaSyncSurface( ctx, render_target );
1560 VA_TRACE_LOG(va_TraceSyncSurface, dpy, render_target);
1565 VAStatus vaQuerySurfaceStatus (
1567 VASurfaceID render_target,
1568 VASurfaceStatus *status /* out */
1572 VADriverContextP ctx;
1576 va_status = ctx->vtable->vaQuerySurfaceStatus( ctx, render_target, status );
1578 VA_TRACE_LOG(va_TraceQuerySurfaceStatus, dpy, render_target, status);
1583 VAStatus vaQuerySurfaceError (
1585 VASurfaceID surface,
1586 VAStatus error_status,
1587 void **error_info /*out*/
1591 VADriverContextP ctx;
1595 va_status = ctx->vtable->vaQuerySurfaceError( ctx, surface, error_status, error_info );
1597 VA_TRACE_LOG(va_TraceQuerySurfaceError, dpy, surface, error_status, error_info);
1602 /* Get maximum number of image formats supported by the implementation */
1603 int vaMaxNumImageFormats (
1607 if (!vaDisplayIsValid(dpy))
1610 return CTX(dpy)->max_image_formats;
1613 VAStatus vaQueryImageFormats (
1615 VAImageFormat *format_list, /* out */
1616 int *num_formats /* out */
1619 VADriverContextP ctx;
1623 return ctx->vtable->vaQueryImageFormats ( ctx, format_list, num_formats);
1627 * The width and height fields returned in the VAImage structure may get
1628 * enlarged for some YUV formats. The size of the data buffer that needs
1629 * to be allocated will be given in the "data_size" field in VAImage.
1630 * Image data is not allocated by this function. The client should
1631 * allocate the memory and fill in the VAImage structure's data field
1632 * after looking at "data_size" returned from the library.
1634 VAStatus vaCreateImage (
1636 VAImageFormat *format,
1639 VAImage *image /* out */
1642 VADriverContextP ctx;
1646 return ctx->vtable->vaCreateImage ( ctx, format, width, height, image);
1650 * Should call DestroyImage before destroying the surface it is bound to
1652 VAStatus vaDestroyImage (
1657 VADriverContextP ctx;
1661 return ctx->vtable->vaDestroyImage ( ctx, image);
1664 VAStatus vaSetImagePalette (
1667 unsigned char *palette
1670 VADriverContextP ctx;
1674 return ctx->vtable->vaSetImagePalette ( ctx, image, palette);
1678 * Retrieve surface data into a VAImage
1679 * Image must be in a format supported by the implementation
1681 VAStatus vaGetImage (
1683 VASurfaceID surface,
1684 int x, /* coordinates of the upper left source pixel */
1686 unsigned int width, /* width and height of the region */
1687 unsigned int height,
1691 VADriverContextP ctx;
1695 return ctx->vtable->vaGetImage ( ctx, surface, x, y, width, height, image);
1699 * Copy data from a VAImage to a surface
1700 * Image must be in a format supported by the implementation
1702 VAStatus vaPutImage (
1704 VASurfaceID surface,
1708 unsigned int src_width,
1709 unsigned int src_height,
1712 unsigned int dest_width,
1713 unsigned int dest_height
1716 VADriverContextP ctx;
1720 return ctx->vtable->vaPutImage ( ctx, surface, image, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height );
1724 * Derive an VAImage from an existing surface.
1725 * This interface will derive a VAImage and corresponding image buffer from
1726 * an existing VA Surface. The image buffer can then be mapped/unmapped for
1727 * direct CPU access. This operation is only possible on implementations with
1728 * direct rendering capabilities and internal surface formats that can be
1729 * represented with a VAImage. When the operation is not possible this interface
1730 * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back
1731 * to using vaCreateImage + vaPutImage to accomplish the same task in an
1734 * Implementations should only return success when the resulting image buffer
1735 * would be useable with vaMap/Unmap.
1737 * When directly accessing a surface special care must be taken to insure
1738 * proper synchronization with the graphics hardware. Clients should call
1739 * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent
1740 * rendering or currently being displayed by an overlay.
1742 * Additionally nothing about the contents of a surface should be assumed
1743 * following a vaPutSurface. Implementations are free to modify the surface for
1744 * scaling or subpicture blending within a call to vaPutImage.
1746 * Calls to vaPutImage or vaGetImage using the same surface from which the image
1747 * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or
1748 * vaGetImage with other surfaces is supported.
1750 * An image created with vaDeriveImage should be freed with vaDestroyImage. The
1751 * image and image buffer structures will be destroyed; however, the underlying
1752 * surface will remain unchanged until freed with vaDestroySurfaces.
1754 VAStatus vaDeriveImage (
1756 VASurfaceID surface,
1757 VAImage *image /* out */
1760 VADriverContextP ctx;
1764 return ctx->vtable->vaDeriveImage ( ctx, surface, image );
1768 /* Get maximum number of subpicture formats supported by the implementation */
1769 int vaMaxNumSubpictureFormats (
1773 if (!vaDisplayIsValid(dpy))
1776 return CTX(dpy)->max_subpic_formats;
1780 * Query supported subpicture formats
1781 * The caller must provide a "format_list" array that can hold at
1782 * least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag
1783 * for each format to indicate additional capabilities for that format. The actual
1784 * number of formats returned in "format_list" is returned in "num_formats".
1786 VAStatus vaQuerySubpictureFormats (
1788 VAImageFormat *format_list, /* out */
1789 unsigned int *flags, /* out */
1790 unsigned int *num_formats /* out */
1793 VADriverContextP ctx;
1798 return ctx->vtable->vaQuerySubpictureFormats ( ctx, format_list, flags, num_formats);
1802 * Subpictures are created with an image associated.
1804 VAStatus vaCreateSubpicture (
1807 VASubpictureID *subpicture /* out */
1810 VADriverContextP ctx;
1814 return ctx->vtable->vaCreateSubpicture ( ctx, image, subpicture );
1818 * Destroy the subpicture before destroying the image it is assocated to
1820 VAStatus vaDestroySubpicture (
1822 VASubpictureID subpicture
1825 VADriverContextP ctx;
1829 return ctx->vtable->vaDestroySubpicture ( ctx, subpicture);
1832 VAStatus vaSetSubpictureImage (
1834 VASubpictureID subpicture,
1838 VADriverContextP ctx;
1842 return ctx->vtable->vaSetSubpictureImage ( ctx, subpicture, image);
1847 * If chromakey is enabled, then the area where the source value falls within
1848 * the chromakey [min, max] range is transparent
1850 VAStatus vaSetSubpictureChromakey (
1852 VASubpictureID subpicture,
1853 unsigned int chromakey_min,
1854 unsigned int chromakey_max,
1855 unsigned int chromakey_mask
1858 VADriverContextP ctx;
1862 return ctx->vtable->vaSetSubpictureChromakey ( ctx, subpicture, chromakey_min, chromakey_max, chromakey_mask );
1867 * Global alpha value is between 0 and 1. A value of 1 means fully opaque and
1868 * a value of 0 means fully transparent. If per-pixel alpha is also specified then
1869 * the overall alpha is per-pixel alpha multiplied by the global alpha
1871 VAStatus vaSetSubpictureGlobalAlpha (
1873 VASubpictureID subpicture,
1877 VADriverContextP ctx;
1881 return ctx->vtable->vaSetSubpictureGlobalAlpha ( ctx, subpicture, global_alpha );
1885 vaAssociateSubpicture associates the subpicture with the target_surface.
1886 It defines the region mapping between the subpicture and the target
1887 surface through source and destination rectangles (with the same width and height).
1888 Both will be displayed at the next call to vaPutSurface. Additional
1889 associations before the call to vaPutSurface simply overrides the association.
1891 VAStatus vaAssociateSubpicture (
1893 VASubpictureID subpicture,
1894 VASurfaceID *target_surfaces,
1896 short src_x, /* upper left offset in subpicture */
1898 unsigned short src_width,
1899 unsigned short src_height,
1900 short dest_x, /* upper left offset in surface */
1902 unsigned short dest_width,
1903 unsigned short dest_height,
1905 * whether to enable chroma-keying or global-alpha
1906 * see VA_SUBPICTURE_XXX values
1911 VADriverContextP ctx;
1915 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 );
1919 * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces.
1921 VAStatus vaDeassociateSubpicture (
1923 VASubpictureID subpicture,
1924 VASurfaceID *target_surfaces,
1928 VADriverContextP ctx;
1932 return ctx->vtable->vaDeassociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces );
1936 /* Get maximum number of display attributes supported by the implementation */
1937 int vaMaxNumDisplayAttributes (
1943 if (!vaDisplayIsValid(dpy))
1946 tmp = CTX(dpy)->max_display_attributes;
1948 VA_TRACE_LOG(va_TraceMaxNumDisplayAttributes, dpy, tmp);
1954 * Query display attributes
1955 * The caller must provide a "attr_list" array that can hold at
1956 * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
1957 * returned in "attr_list" is returned in "num_attributes".
1959 VAStatus vaQueryDisplayAttributes (
1961 VADisplayAttribute *attr_list, /* out */
1962 int *num_attributes /* out */
1965 VADriverContextP ctx;
1970 va_status = ctx->vtable->vaQueryDisplayAttributes ( ctx, attr_list, num_attributes );
1972 VA_TRACE_LOG(va_TraceQueryDisplayAttributes, dpy, attr_list, num_attributes);
1979 * Get display attributes
1980 * This function returns the current attribute values in "attr_list".
1981 * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
1982 * from vaQueryDisplayAttributes() can have their values retrieved.
1984 VAStatus vaGetDisplayAttributes (
1986 VADisplayAttribute *attr_list, /* in/out */
1990 VADriverContextP ctx;
1995 va_status = ctx->vtable->vaGetDisplayAttributes ( ctx, attr_list, num_attributes );
1997 VA_TRACE_LOG(va_TraceGetDisplayAttributes, dpy, attr_list, num_attributes);
2003 * Set display attributes
2004 * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
2005 * from vaQueryDisplayAttributes() can be set. If the attribute is not settable or
2006 * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
2008 VAStatus vaSetDisplayAttributes (
2010 VADisplayAttribute *attr_list,
2014 VADriverContextP ctx;
2019 va_status = ctx->vtable->vaSetDisplayAttributes ( ctx, attr_list, num_attributes );
2020 VA_TRACE_LOG(va_TraceSetDisplayAttributes, dpy, attr_list, num_attributes);
2025 VAStatus vaLockSurface(VADisplay dpy,
2026 VASurfaceID surface,
2027 unsigned int *fourcc, /* following are output argument */
2028 unsigned int *luma_stride,
2029 unsigned int *chroma_u_stride,
2030 unsigned int *chroma_v_stride,
2031 unsigned int *luma_offset,
2032 unsigned int *chroma_u_offset,
2033 unsigned int *chroma_v_offset,
2034 unsigned int *buffer_name,
2038 VADriverContextP ctx;
2042 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);
2046 VAStatus vaUnlockSurface(VADisplay dpy,
2050 VADriverContextP ctx;
2054 return ctx->vtable->vaUnlockSurface( ctx, surface );
2057 /* Video Processing */
2058 #define VA_VPP_INIT_CONTEXT(ctx, dpy) do { \
2059 CHECK_DISPLAY(dpy); \
2062 return VA_STATUS_ERROR_INVALID_DISPLAY; \
2065 #define VA_VPP_INVOKE(dpy, func, args) do { \
2066 if (!ctx->vtable_vpp->va##func) \
2067 return VA_STATUS_ERROR_UNIMPLEMENTED; \
2068 status = ctx->vtable_vpp->va##func args; \
2072 vaQueryVideoProcFilters(
2074 VAContextID context,
2075 VAProcFilterType *filters,
2076 unsigned int *num_filters
2079 VADriverContextP ctx;
2082 VA_VPP_INIT_CONTEXT(ctx, dpy);
2085 QueryVideoProcFilters,
2086 (ctx, context, filters, num_filters)
2092 vaQueryVideoProcFilterCaps(
2094 VAContextID context,
2095 VAProcFilterType type,
2097 unsigned int *num_filter_caps
2100 VADriverContextP ctx;
2103 VA_VPP_INIT_CONTEXT(ctx, dpy);
2106 QueryVideoProcFilterCaps,
2107 (ctx, context, type, filter_caps, num_filter_caps)
2113 vaQueryVideoProcPipelineCaps(
2115 VAContextID context,
2116 VABufferID *filters,
2117 unsigned int num_filters,
2118 VAProcPipelineCaps *pipeline_caps
2121 VADriverContextP ctx;
2124 VA_VPP_INIT_CONTEXT(ctx, dpy);
2127 QueryVideoProcPipelineCaps,
2128 (ctx, context, filters, num_filters, pipeline_caps)