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, 3 },
406 { VA_MAJOR_VERSION, 2 },
407 { VA_MAJOR_VERSION, 1 },
408 { VA_MAJOR_VERSION, 0 },
412 for (i = 0; compatible_versions[i].major >= 0; i++) {
413 if (va_getDriverInitName(init_func_s, sizeof(init_func_s),
414 compatible_versions[i].major,
415 compatible_versions[i].minor)) {
416 init_func = (VADriverInit)dlsym(handle, init_func_s);
418 va_infoMessage(dpy, "Found init function %s\n", init_func_s);
424 if (compatible_versions[i].major < 0) {
425 va_errorMessage(dpy, "%s has no function %s\n",
426 driver_path, init_func_s);
429 struct VADriverVTable *vtable = ctx->vtable;
430 struct VADriverVTableVPP *vtable_vpp = ctx->vtable_vpp;
432 vaStatus = VA_STATUS_SUCCESS;
434 vtable = calloc(1, sizeof(*vtable));
436 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
438 ctx->vtable = vtable;
441 vtable_vpp = calloc(1, sizeof(*vtable_vpp));
443 vtable_vpp->version = VA_DRIVER_VTABLE_VPP_VERSION;
445 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
447 ctx->vtable_vpp = vtable_vpp;
449 if (init_func && VA_STATUS_SUCCESS == vaStatus)
450 vaStatus = (*init_func)(ctx);
452 if (VA_STATUS_SUCCESS == vaStatus) {
453 CHECK_MAXIMUM(vaStatus, ctx, profiles);
454 CHECK_MAXIMUM(vaStatus, ctx, entrypoints);
455 CHECK_MAXIMUM(vaStatus, ctx, attributes);
456 CHECK_MAXIMUM(vaStatus, ctx, image_formats);
457 CHECK_MAXIMUM(vaStatus, ctx, subpic_formats);
458 CHECK_STRING(vaStatus, ctx, vendor);
459 CHECK_VTABLE(vaStatus, ctx, Terminate);
460 CHECK_VTABLE(vaStatus, ctx, QueryConfigProfiles);
461 CHECK_VTABLE(vaStatus, ctx, QueryConfigEntrypoints);
462 CHECK_VTABLE(vaStatus, ctx, QueryConfigAttributes);
463 CHECK_VTABLE(vaStatus, ctx, CreateConfig);
464 CHECK_VTABLE(vaStatus, ctx, DestroyConfig);
465 CHECK_VTABLE(vaStatus, ctx, GetConfigAttributes);
466 CHECK_VTABLE(vaStatus, ctx, CreateSurfaces);
467 CHECK_VTABLE(vaStatus, ctx, DestroySurfaces);
468 CHECK_VTABLE(vaStatus, ctx, CreateContext);
469 CHECK_VTABLE(vaStatus, ctx, DestroyContext);
470 CHECK_VTABLE(vaStatus, ctx, CreateBuffer);
471 CHECK_VTABLE(vaStatus, ctx, BufferSetNumElements);
472 CHECK_VTABLE(vaStatus, ctx, MapBuffer);
473 CHECK_VTABLE(vaStatus, ctx, UnmapBuffer);
474 CHECK_VTABLE(vaStatus, ctx, DestroyBuffer);
475 CHECK_VTABLE(vaStatus, ctx, BeginPicture);
476 CHECK_VTABLE(vaStatus, ctx, RenderPicture);
477 CHECK_VTABLE(vaStatus, ctx, EndPicture);
478 CHECK_VTABLE(vaStatus, ctx, SyncSurface);
479 CHECK_VTABLE(vaStatus, ctx, QuerySurfaceStatus);
480 CHECK_VTABLE(vaStatus, ctx, PutSurface);
481 CHECK_VTABLE(vaStatus, ctx, QueryImageFormats);
482 CHECK_VTABLE(vaStatus, ctx, CreateImage);
483 CHECK_VTABLE(vaStatus, ctx, DeriveImage);
484 CHECK_VTABLE(vaStatus, ctx, DestroyImage);
485 CHECK_VTABLE(vaStatus, ctx, SetImagePalette);
486 CHECK_VTABLE(vaStatus, ctx, GetImage);
487 CHECK_VTABLE(vaStatus, ctx, PutImage);
488 CHECK_VTABLE(vaStatus, ctx, QuerySubpictureFormats);
489 CHECK_VTABLE(vaStatus, ctx, CreateSubpicture);
490 CHECK_VTABLE(vaStatus, ctx, DestroySubpicture);
491 CHECK_VTABLE(vaStatus, ctx, SetSubpictureImage);
492 CHECK_VTABLE(vaStatus, ctx, SetSubpictureChromakey);
493 CHECK_VTABLE(vaStatus, ctx, SetSubpictureGlobalAlpha);
494 CHECK_VTABLE(vaStatus, ctx, AssociateSubpicture);
495 CHECK_VTABLE(vaStatus, ctx, DeassociateSubpicture);
496 CHECK_VTABLE(vaStatus, ctx, QueryDisplayAttributes);
497 CHECK_VTABLE(vaStatus, ctx, GetDisplayAttributes);
498 CHECK_VTABLE(vaStatus, ctx, SetDisplayAttributes);
500 if (VA_STATUS_SUCCESS != vaStatus) {
501 va_errorMessage(dpy, "%s init failed\n", driver_path);
504 if (VA_STATUS_SUCCESS == vaStatus)
505 ctx->handle = handle;
512 driver_dir = strtok_r(NULL, ":", &saveptr);
520 VAPrivFunc vaGetLibFunc(VADisplay dpy, const char *func)
522 VADriverContextP ctx;
523 if (!vaDisplayIsValid(dpy))
527 if (NULL == ctx->handle)
530 return (VAPrivFunc) dlsym(ctx->handle, func);
535 * Returns a short english description of error_status
537 const char *vaErrorStr(VAStatus error_status)
539 switch(error_status) {
540 case VA_STATUS_SUCCESS:
541 return "success (no error)";
542 case VA_STATUS_ERROR_OPERATION_FAILED:
543 return "operation failed";
544 case VA_STATUS_ERROR_ALLOCATION_FAILED:
545 return "resource allocation failed";
546 case VA_STATUS_ERROR_INVALID_DISPLAY:
547 return "invalid VADisplay";
548 case VA_STATUS_ERROR_INVALID_CONFIG:
549 return "invalid VAConfigID";
550 case VA_STATUS_ERROR_INVALID_CONTEXT:
551 return "invalid VAContextID";
552 case VA_STATUS_ERROR_INVALID_SURFACE:
553 return "invalid VASurfaceID";
554 case VA_STATUS_ERROR_INVALID_BUFFER:
555 return "invalid VABufferID";
556 case VA_STATUS_ERROR_INVALID_IMAGE:
557 return "invalid VAImageID";
558 case VA_STATUS_ERROR_INVALID_SUBPICTURE:
559 return "invalid VASubpictureID";
560 case VA_STATUS_ERROR_ATTR_NOT_SUPPORTED:
561 return "attribute not supported";
562 case VA_STATUS_ERROR_MAX_NUM_EXCEEDED:
563 return "list argument exceeds maximum number";
564 case VA_STATUS_ERROR_UNSUPPORTED_PROFILE:
565 return "the requested VAProfile is not supported";
566 case VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT:
567 return "the requested VAEntryPoint is not supported";
568 case VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT:
569 return "the requested RT Format is not supported";
570 case VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE:
571 return "the requested VABufferType is not supported";
572 case VA_STATUS_ERROR_SURFACE_BUSY:
573 return "surface is in use";
574 case VA_STATUS_ERROR_FLAG_NOT_SUPPORTED:
575 return "flag not supported";
576 case VA_STATUS_ERROR_INVALID_PARAMETER:
577 return "invalid parameter";
578 case VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED:
579 return "resolution not supported";
580 case VA_STATUS_ERROR_UNIMPLEMENTED:
581 return "the requested function is not implemented";
582 case VA_STATUS_ERROR_SURFACE_IN_DISPLAYING:
583 return "surface is in displaying (may by overlay)" ;
584 case VA_STATUS_ERROR_INVALID_IMAGE_FORMAT:
585 return "invalid VAImageFormat";
586 case VA_STATUS_ERROR_DECODING_ERROR:
587 return "internal decoding error";
588 case VA_STATUS_ERROR_ENCODING_ERROR:
589 return "internal encoding error";
590 case VA_STATUS_ERROR_INVALID_VALUE:
591 return "an invalid/unsupported value was supplied";
592 case VA_STATUS_ERROR_UNSUPPORTED_FILTER:
593 return "the requested filter is not supported";
594 case VA_STATUS_ERROR_INVALID_FILTER_CHAIN:
595 return "an invalid filter chain was supplied";
596 case VA_STATUS_ERROR_HW_BUSY:
597 return "HW busy now";
598 case VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE:
599 return "an unsupported memory type was supplied";
600 case VA_STATUS_ERROR_NOT_ENOUGH_BUFFER:
601 return "allocated memory size is not enough for input or output";
602 case VA_STATUS_ERROR_UNKNOWN:
603 return "unknown libva error";
605 return "unknown libva error / description missing";
608 VAStatus vaSetDriverName(
613 VADriverContextP ctx;
614 VAStatus vaStatus = VA_STATUS_SUCCESS;
615 char *override_driver_name = NULL;
618 if (strlen(driver_name) == 0 || strlen(driver_name) >=256) {
619 vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
620 va_errorMessage(dpy, "vaSetDriverName returns %s\n",
621 vaErrorStr(vaStatus));
625 override_driver_name = strdup(driver_name);
626 if (!override_driver_name) {
627 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
628 va_errorMessage(dpy, "vaSetDriverName returns %s. Out of Memory\n",
629 vaErrorStr(vaStatus));
633 ctx->override_driver_name = override_driver_name;
634 return VA_STATUS_SUCCESS;
637 VAStatus vaInitialize (
639 int *major_version, /* out */
640 int *minor_version /* out */
643 const char *driver_name_env = NULL;
644 char *driver_name = NULL;
646 VADriverContextP ctx;
658 va_infoMessage(dpy, "VA-API version %s\n", VA_VERSION_S);
660 vaStatus = va_getDriverName(dpy, &driver_name);
662 if (!ctx->override_driver_name) {
663 va_infoMessage(dpy, "va_getDriverName() returns %d\n", vaStatus);
665 driver_name_env = getenv("LIBVA_DRIVER_NAME");
666 } else if (vaStatus == VA_STATUS_SUCCESS) {
670 driver_name = strdup(ctx->override_driver_name);
672 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
673 va_errorMessage(dpy, "vaInitialize() failed with %s, out of memory\n",
674 vaErrorStr(vaStatus));
677 va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
680 if (driver_name_env && (geteuid() == getuid())) {
681 /* Don't allow setuid apps to use LIBVA_DRIVER_NAME */
682 if (driver_name) /* memory is allocated in va_getDriverName */
685 driver_name = strdup(driver_name_env);
686 vaStatus = VA_STATUS_SUCCESS;
687 va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
690 if ((VA_STATUS_SUCCESS == vaStatus) && (driver_name != NULL)) {
691 vaStatus = va_openDriver(dpy, driver_name);
692 va_infoMessage(dpy, "va_openDriver() returns %d\n", vaStatus);
694 *major_version = VA_MAJOR_VERSION;
695 *minor_version = VA_MINOR_VERSION;
697 va_errorMessage(dpy, "va_getDriverName() failed with %s,driver_name=%s\n",
698 vaErrorStr(vaStatus), driver_name);
703 VA_TRACE_LOG(va_TraceInitialize, dpy, major_version, minor_version);
710 * After this call, all library internal resources will be cleaned up
712 VAStatus vaTerminate (
716 VAStatus vaStatus = VA_STATUS_SUCCESS;
717 VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
718 VADriverContextP old_ctx;
723 if (old_ctx->handle) {
724 vaStatus = old_ctx->vtable->vaTerminate(old_ctx);
725 dlclose(old_ctx->handle);
726 old_ctx->handle = NULL;
728 free(old_ctx->vtable);
729 old_ctx->vtable = NULL;
730 free(old_ctx->vtable_vpp);
731 old_ctx->vtable_vpp = NULL;
733 if (old_ctx->override_driver_name) {
734 free(old_ctx->override_driver_name);
735 old_ctx->override_driver_name = NULL;
738 VA_TRACE_LOG(va_TraceTerminate, dpy);
744 if (VA_STATUS_SUCCESS == vaStatus)
745 pDisplayContext->vaDestroy(pDisplayContext);
751 * vaQueryVendorString returns a pointer to a zero-terminated string
752 * describing some aspects of the VA implemenation on a specific
753 * hardware accelerator. The format of the returned string is:
754 * <vendorname>-<major_version>-<minor_version>-<addtional_info>
755 * e.g. for the Intel GMA500 implementation, an example would be:
756 * "IntelGMA500-1.0-0.2-patch3
758 const char *vaQueryVendorString (
762 if (!vaDisplayIsValid(dpy))
765 return CTX(dpy)->str_vendor;
769 /* Get maximum number of profiles supported by the implementation */
770 int vaMaxNumProfiles (
774 if (!vaDisplayIsValid(dpy))
777 return CTX(dpy)->max_profiles;
780 /* Get maximum number of entrypoints supported by the implementation */
781 int vaMaxNumEntrypoints (
785 if (!vaDisplayIsValid(dpy))
788 return CTX(dpy)->max_entrypoints;
792 /* Get maximum number of attributs supported by the implementation */
793 int vaMaxNumConfigAttributes (
797 if (!vaDisplayIsValid(dpy))
800 return CTX(dpy)->max_attributes;
803 VAStatus vaQueryConfigEntrypoints (
806 VAEntrypoint *entrypoints, /* out */
807 int *num_entrypoints /* out */
810 VADriverContextP ctx;
814 return ctx->vtable->vaQueryConfigEntrypoints ( ctx, profile, entrypoints, num_entrypoints);
817 VAStatus vaGetConfigAttributes (
820 VAEntrypoint entrypoint,
821 VAConfigAttrib *attrib_list, /* in/out */
825 VADriverContextP ctx;
829 return ctx->vtable->vaGetConfigAttributes ( ctx, profile, entrypoint, attrib_list, num_attribs );
832 VAStatus vaQueryConfigProfiles (
834 VAProfile *profile_list, /* out */
835 int *num_profiles /* out */
838 VADriverContextP ctx;
842 return ctx->vtable->vaQueryConfigProfiles ( ctx, profile_list, num_profiles );
845 VAStatus vaCreateConfig (
848 VAEntrypoint entrypoint,
849 VAConfigAttrib *attrib_list,
851 VAConfigID *config_id /* out */
854 VADriverContextP ctx;
855 VAStatus vaStatus = VA_STATUS_SUCCESS;
860 vaStatus = ctx->vtable->vaCreateConfig ( ctx, profile, entrypoint, attrib_list, num_attribs, config_id );
862 /* record the current entrypoint for further trace/fool determination */
863 VA_TRACE_ALL(va_TraceCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
864 VA_FOOL_FUNC(va_FoolCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
869 VAStatus vaDestroyConfig (
874 VADriverContextP ctx;
875 VAStatus vaStatus = VA_STATUS_SUCCESS;
880 vaStatus = ctx->vtable->vaDestroyConfig ( ctx, config_id );
882 VA_TRACE_ALL(va_TraceDestroyConfig, dpy, config_id);
887 VAStatus vaQueryConfigAttributes (
889 VAConfigID config_id,
890 VAProfile *profile, /* out */
891 VAEntrypoint *entrypoint, /* out */
892 VAConfigAttrib *attrib_list,/* out */
893 int *num_attribs /* out */
896 VADriverContextP ctx;
900 return ctx->vtable->vaQueryConfigAttributes( ctx, config_id, profile, entrypoint, attrib_list, num_attribs);
903 VAStatus vaQueryProcessingRate (
905 VAConfigID config_id,
906 VAProcessingRateParameter *proc_buf,
907 unsigned int *processing_rate /* out */
910 VADriverContextP ctx;
913 if(!ctx->vtable->vaQueryProcessingRate)
914 return VA_STATUS_ERROR_UNIMPLEMENTED;
915 return ctx->vtable->vaQueryProcessingRate( ctx, config_id, proc_buf, processing_rate);
918 /* XXX: this is a slow implementation that will be removed */
920 va_impl_query_surface_attributes(
921 VADriverContextP ctx,
923 VASurfaceAttrib *out_attribs,
924 unsigned int *out_num_attribs_ptr
927 VASurfaceAttrib *attribs = NULL;
928 unsigned int num_attribs, n;
929 VASurfaceAttrib *out_attrib;
930 unsigned int out_num_attribs;
931 VAImageFormat *image_formats = NULL;
932 int num_image_formats, i;
935 /* List of surface attributes to query */
936 struct va_surface_attrib_map {
937 VASurfaceAttribType type;
938 VAGenericValueType value_type;
940 static const struct va_surface_attrib_map attribs_map[] = {
941 { VASurfaceAttribMinWidth, VAGenericValueTypeInteger },
942 { VASurfaceAttribMaxWidth, VAGenericValueTypeInteger },
943 { VASurfaceAttribMinHeight, VAGenericValueTypeInteger },
944 { VASurfaceAttribMaxHeight, VAGenericValueTypeInteger },
945 { VASurfaceAttribMemoryType, VAGenericValueTypeInteger },
946 { VASurfaceAttribNone, }
949 if (!out_attribs || !out_num_attribs_ptr)
950 return VA_STATUS_ERROR_INVALID_PARAMETER;
951 if (!ctx->vtable->vaGetSurfaceAttributes)
952 return VA_STATUS_ERROR_UNIMPLEMENTED;
954 num_image_formats = ctx->max_image_formats;
955 image_formats = malloc(num_image_formats * sizeof(*image_formats));
956 if (!image_formats) {
957 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
961 va_status = ctx->vtable->vaQueryImageFormats(
962 ctx, image_formats, &num_image_formats);
963 if (va_status != VA_STATUS_SUCCESS)
966 num_attribs = VASurfaceAttribCount + num_image_formats;
967 attribs = malloc(num_attribs * sizeof(*attribs));
969 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
973 /* Initialize with base surface attributes, except pixel-formats */
974 for (n = 0; attribs_map[n].type != VASurfaceAttribNone; n++) {
975 VASurfaceAttrib * const attrib = &attribs[n];
976 attrib->type = attribs_map[n].type;
977 attrib->flags = VA_SURFACE_ATTRIB_GETTABLE;
978 attrib->value.type = attribs_map[n].value_type;
981 /* Append image formats */
982 for (i = 0; i < num_image_formats; i++) {
983 VASurfaceAttrib * const attrib = &attribs[n];
984 attrib->type = VASurfaceAttribPixelFormat;
985 attrib->flags = VA_SURFACE_ATTRIB_GETTABLE|VA_SURFACE_ATTRIB_SETTABLE;
986 attrib->value.type = VAGenericValueTypeInteger;
987 attrib->value.value.i = image_formats[i].fourcc;
988 if (++n == num_attribs) {
989 va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
995 va_status = ctx->vtable->vaGetSurfaceAttributes(
996 ctx, config, attribs, num_attribs);
997 if (va_status != VA_STATUS_SUCCESS)
1000 /* Remove invalid entries */
1001 out_num_attribs = 0;
1002 for (n = 0; n < num_attribs; n++) {
1003 VASurfaceAttrib * const attrib = &attribs[n];
1005 if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
1008 // Accept all surface attributes that are not pixel-formats
1009 if (attrib->type != VASurfaceAttribPixelFormat) {
1014 // Drop invalid pixel-format attribute
1015 if (!attrib->value.value.i) {
1016 attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
1020 // Check for duplicates
1021 int is_duplicate = 0;
1022 for (i = n - 1; i >= 0 && !is_duplicate; i--) {
1023 const VASurfaceAttrib * const prev_attrib = &attribs[i];
1024 if (prev_attrib->type != VASurfaceAttribPixelFormat)
1026 is_duplicate = prev_attrib->value.value.i == attrib->value.value.i;
1029 attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
1034 if (*out_num_attribs_ptr < out_num_attribs) {
1035 *out_num_attribs_ptr = out_num_attribs;
1036 va_status = VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
1040 out_attrib = out_attribs;
1041 for (n = 0; n < num_attribs; n++) {
1042 const VASurfaceAttrib * const attrib = &attribs[n];
1043 if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
1045 *out_attrib++ = *attrib;
1050 free(image_formats);
1055 vaQuerySurfaceAttributes(
1058 VASurfaceAttrib *attrib_list,
1059 unsigned int *num_attribs
1062 VADriverContextP ctx;
1068 return VA_STATUS_ERROR_INVALID_DISPLAY;
1070 if (!ctx->vtable->vaQuerySurfaceAttributes)
1071 vaStatus = va_impl_query_surface_attributes(ctx, config,
1072 attrib_list, num_attribs);
1074 vaStatus = ctx->vtable->vaQuerySurfaceAttributes(ctx, config,
1075 attrib_list, num_attribs);
1077 VA_TRACE_LOG(va_TraceQuerySurfaceAttributes, dpy, config, attrib_list, num_attribs);
1085 unsigned int format,
1087 unsigned int height,
1088 VASurfaceID *surfaces,
1089 unsigned int num_surfaces,
1090 VASurfaceAttrib *attrib_list,
1091 unsigned int num_attribs
1094 VADriverContextP ctx;
1100 return VA_STATUS_ERROR_INVALID_DISPLAY;
1102 if (ctx->vtable->vaCreateSurfaces2)
1103 vaStatus = ctx->vtable->vaCreateSurfaces2(ctx, format, width, height,
1104 surfaces, num_surfaces,
1105 attrib_list, num_attribs);
1106 else if (attrib_list && num_attribs > 0)
1107 vaStatus = VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
1109 vaStatus = ctx->vtable->vaCreateSurfaces(ctx, width, height, format,
1110 num_surfaces, surfaces);
1111 VA_TRACE_LOG(va_TraceCreateSurfaces,
1112 dpy, width, height, format, num_surfaces, surfaces,
1113 attrib_list, num_attribs);
1119 VAStatus vaDestroySurfaces (
1121 VASurfaceID *surface_list,
1125 VADriverContextP ctx;
1131 VA_TRACE_LOG(va_TraceDestroySurfaces,
1132 dpy, surface_list, num_surfaces);
1134 vaStatus = ctx->vtable->vaDestroySurfaces( ctx, surface_list, num_surfaces );
1139 VAStatus vaCreateContext (
1141 VAConfigID config_id,
1145 VASurfaceID *render_targets,
1146 int num_render_targets,
1147 VAContextID *context /* out */
1150 VADriverContextP ctx;
1156 vaStatus = ctx->vtable->vaCreateContext( ctx, config_id, picture_width, picture_height,
1157 flag, render_targets, num_render_targets, context );
1159 /* keep current encode/decode resoluton */
1160 VA_TRACE_ALL(va_TraceCreateContext, dpy, config_id, picture_width, picture_height, flag, render_targets, num_render_targets, context);
1165 VAStatus vaDestroyContext (
1170 VADriverContextP ctx;
1176 vaStatus = ctx->vtable->vaDestroyContext( ctx, context );
1178 VA_TRACE_ALL(va_TraceDestroyContext, dpy, context);
1183 VAStatus vaCreateMFContext (
1185 VAMFContextID *mf_context /* out */
1188 VADriverContextP ctx;
1193 if(ctx->vtable->vaCreateMFContext == NULL)
1194 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1197 vaStatus = ctx->vtable->vaCreateMFContext( ctx, mf_context);
1198 VA_TRACE_ALL(va_TraceCreateMFContext, dpy, mf_context);
1204 VAStatus vaMFAddContext (
1206 VAMFContextID mf_context,
1210 VADriverContextP ctx;
1216 if(ctx->vtable->vaMFAddContext == NULL)
1217 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1220 vaStatus = ctx->vtable->vaMFAddContext( ctx, context, mf_context);
1221 VA_TRACE_ALL(va_TraceMFAddContext, dpy, context, mf_context);
1227 VAStatus vaMFReleaseContext (
1229 VAMFContextID mf_context,
1233 VADriverContextP ctx;
1238 if(ctx->vtable->vaMFReleaseContext == NULL)
1239 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1242 vaStatus = ctx->vtable->vaMFReleaseContext( ctx, context, mf_context);
1243 VA_TRACE_ALL(va_TraceMFReleaseContext, dpy, context, mf_context);
1249 VAStatus vaMFSubmit (
1251 VAMFContextID mf_context,
1252 VAContextID *contexts,
1256 VADriverContextP ctx;
1261 CHECK_VTABLE(vaStatus, ctx, MFSubmit);
1262 if(ctx->vtable->vaMFSubmit == NULL)
1263 vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1266 vaStatus = ctx->vtable->vaMFSubmit( ctx, mf_context, contexts, num_contexts);
1267 VA_TRACE_ALL(va_TraceMFSubmit, dpy, mf_context, contexts, num_contexts);
1273 VAStatus vaCreateBuffer (
1275 VAContextID context, /* in */
1276 VABufferType type, /* in */
1277 unsigned int size, /* in */
1278 unsigned int num_elements, /* in */
1279 void *data, /* in */
1280 VABufferID *buf_id /* out */
1283 VADriverContextP ctx;
1289 VA_FOOL_FUNC(va_FoolCreateBuffer, dpy, context, type, size, num_elements, data, buf_id);
1291 vaStatus = ctx->vtable->vaCreateBuffer( ctx, context, type, size, num_elements, data, buf_id);
1293 VA_TRACE_LOG(va_TraceCreateBuffer,
1294 dpy, context, type, size, num_elements, data, buf_id);
1299 VAStatus vaCreateBuffer2 (
1301 VAContextID context,
1304 unsigned int height,
1305 unsigned int *unit_size,
1306 unsigned int *pitch,
1310 VADriverContextP ctx;
1315 if(!ctx->vtable->vaCreateBuffer2)
1316 return VA_STATUS_ERROR_UNIMPLEMENTED;
1318 vaStatus = ctx->vtable->vaCreateBuffer2( ctx, context, type, width, height ,unit_size, pitch, buf_id);
1320 VA_TRACE_LOG(va_TraceCreateBuffer,
1321 dpy, context, type, *pitch, height, NULL, buf_id);
1326 VAStatus vaBufferSetNumElements (
1328 VABufferID buf_id, /* in */
1329 unsigned int num_elements /* in */
1332 VADriverContextP ctx;
1336 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1338 return ctx->vtable->vaBufferSetNumElements( ctx, buf_id, num_elements );
1342 VAStatus vaMapBuffer (
1344 VABufferID buf_id, /* in */
1345 void **pbuf /* out */
1348 VADriverContextP ctx;
1354 VA_FOOL_FUNC(va_FoolMapBuffer, dpy, buf_id, pbuf);
1356 va_status = ctx->vtable->vaMapBuffer( ctx, buf_id, pbuf );
1358 VA_TRACE_ALL(va_TraceMapBuffer, dpy, buf_id, pbuf);
1363 VAStatus vaUnmapBuffer (
1365 VABufferID buf_id /* in */
1368 VADriverContextP ctx;
1372 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1374 return ctx->vtable->vaUnmapBuffer( ctx, buf_id );
1377 VAStatus vaDestroyBuffer (
1379 VABufferID buffer_id
1382 VADriverContextP ctx;
1386 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1388 VA_TRACE_LOG(va_TraceDestroyBuffer,
1391 return ctx->vtable->vaDestroyBuffer( ctx, buffer_id );
1394 VAStatus vaBufferInfo (
1396 VAContextID context, /* in */
1397 VABufferID buf_id, /* in */
1398 VABufferType *type, /* out */
1399 unsigned int *size, /* out */
1400 unsigned int *num_elements /* out */
1403 VADriverContextP ctx;
1408 VA_FOOL_FUNC(va_FoolBufferInfo, dpy, buf_id, type, size, num_elements);
1410 return ctx->vtable->vaBufferInfo( ctx, buf_id, type, size, num_elements );
1413 /* Locks buffer for external API usage */
1415 vaAcquireBufferHandle(VADisplay dpy, VABufferID buf_id, VABufferInfo *buf_info)
1417 VADriverContextP ctx;
1422 if (!ctx->vtable->vaAcquireBufferHandle)
1423 return VA_STATUS_ERROR_UNIMPLEMENTED;
1424 return ctx->vtable->vaAcquireBufferHandle(ctx, buf_id, buf_info);
1427 /* Unlocks buffer after usage from external API */
1429 vaReleaseBufferHandle(VADisplay dpy, VABufferID buf_id)
1431 VADriverContextP ctx;
1436 if (!ctx->vtable->vaReleaseBufferHandle)
1437 return VA_STATUS_ERROR_UNIMPLEMENTED;
1438 return ctx->vtable->vaReleaseBufferHandle(ctx, buf_id);
1442 vaExportSurfaceHandle(VADisplay dpy, VASurfaceID surface_id,
1443 uint32_t mem_type, uint32_t flags,
1446 VADriverContextP ctx;
1451 if (!ctx->vtable->vaExportSurfaceHandle)
1452 return VA_STATUS_ERROR_UNIMPLEMENTED;
1453 return ctx->vtable->vaExportSurfaceHandle(ctx, surface_id,
1458 VAStatus vaBeginPicture (
1460 VAContextID context,
1461 VASurfaceID render_target
1464 VADriverContextP ctx;
1470 VA_TRACE_ALL(va_TraceBeginPicture, dpy, context, render_target);
1471 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1473 va_status = ctx->vtable->vaBeginPicture( ctx, context, render_target );
1478 VAStatus vaRenderPicture (
1480 VAContextID context,
1481 VABufferID *buffers,
1485 VADriverContextP ctx;
1490 VA_TRACE_LOG(va_TraceRenderPicture, dpy, context, buffers, num_buffers);
1491 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1493 return ctx->vtable->vaRenderPicture( ctx, context, buffers, num_buffers );
1496 VAStatus vaEndPicture (
1501 VAStatus va_status = VA_STATUS_SUCCESS;
1502 VADriverContextP ctx;
1507 VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
1509 va_status = ctx->vtable->vaEndPicture( ctx, context );
1511 /* dump surface content */
1512 VA_TRACE_ALL(va_TraceEndPicture, dpy, context, 1);
1517 VAStatus vaSyncSurface (
1519 VASurfaceID render_target
1523 VADriverContextP ctx;
1528 va_status = ctx->vtable->vaSyncSurface( ctx, render_target );
1529 VA_TRACE_LOG(va_TraceSyncSurface, dpy, render_target);
1534 VAStatus vaQuerySurfaceStatus (
1536 VASurfaceID render_target,
1537 VASurfaceStatus *status /* out */
1541 VADriverContextP ctx;
1545 va_status = ctx->vtable->vaQuerySurfaceStatus( ctx, render_target, status );
1547 VA_TRACE_LOG(va_TraceQuerySurfaceStatus, dpy, render_target, status);
1552 VAStatus vaQuerySurfaceError (
1554 VASurfaceID surface,
1555 VAStatus error_status,
1556 void **error_info /*out*/
1560 VADriverContextP ctx;
1564 va_status = ctx->vtable->vaQuerySurfaceError( ctx, surface, error_status, error_info );
1566 VA_TRACE_LOG(va_TraceQuerySurfaceError, dpy, surface, error_status, error_info);
1571 /* Get maximum number of image formats supported by the implementation */
1572 int vaMaxNumImageFormats (
1576 if (!vaDisplayIsValid(dpy))
1579 return CTX(dpy)->max_image_formats;
1582 VAStatus vaQueryImageFormats (
1584 VAImageFormat *format_list, /* out */
1585 int *num_formats /* out */
1588 VADriverContextP ctx;
1592 return ctx->vtable->vaQueryImageFormats ( ctx, format_list, num_formats);
1596 * The width and height fields returned in the VAImage structure may get
1597 * enlarged for some YUV formats. The size of the data buffer that needs
1598 * to be allocated will be given in the "data_size" field in VAImage.
1599 * Image data is not allocated by this function. The client should
1600 * allocate the memory and fill in the VAImage structure's data field
1601 * after looking at "data_size" returned from the library.
1603 VAStatus vaCreateImage (
1605 VAImageFormat *format,
1608 VAImage *image /* out */
1611 VADriverContextP ctx;
1615 return ctx->vtable->vaCreateImage ( ctx, format, width, height, image);
1619 * Should call DestroyImage before destroying the surface it is bound to
1621 VAStatus vaDestroyImage (
1626 VADriverContextP ctx;
1630 return ctx->vtable->vaDestroyImage ( ctx, image);
1633 VAStatus vaSetImagePalette (
1636 unsigned char *palette
1639 VADriverContextP ctx;
1643 return ctx->vtable->vaSetImagePalette ( ctx, image, palette);
1647 * Retrieve surface data into a VAImage
1648 * Image must be in a format supported by the implementation
1650 VAStatus vaGetImage (
1652 VASurfaceID surface,
1653 int x, /* coordinates of the upper left source pixel */
1655 unsigned int width, /* width and height of the region */
1656 unsigned int height,
1660 VADriverContextP ctx;
1664 return ctx->vtable->vaGetImage ( ctx, surface, x, y, width, height, image);
1668 * Copy data from a VAImage to a surface
1669 * Image must be in a format supported by the implementation
1671 VAStatus vaPutImage (
1673 VASurfaceID surface,
1677 unsigned int src_width,
1678 unsigned int src_height,
1681 unsigned int dest_width,
1682 unsigned int dest_height
1685 VADriverContextP ctx;
1689 return ctx->vtable->vaPutImage ( ctx, surface, image, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height );
1693 * Derive an VAImage from an existing surface.
1694 * This interface will derive a VAImage and corresponding image buffer from
1695 * an existing VA Surface. The image buffer can then be mapped/unmapped for
1696 * direct CPU access. This operation is only possible on implementations with
1697 * direct rendering capabilities and internal surface formats that can be
1698 * represented with a VAImage. When the operation is not possible this interface
1699 * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back
1700 * to using vaCreateImage + vaPutImage to accomplish the same task in an
1703 * Implementations should only return success when the resulting image buffer
1704 * would be useable with vaMap/Unmap.
1706 * When directly accessing a surface special care must be taken to insure
1707 * proper synchronization with the graphics hardware. Clients should call
1708 * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent
1709 * rendering or currently being displayed by an overlay.
1711 * Additionally nothing about the contents of a surface should be assumed
1712 * following a vaPutSurface. Implementations are free to modify the surface for
1713 * scaling or subpicture blending within a call to vaPutImage.
1715 * Calls to vaPutImage or vaGetImage using the same surface from which the image
1716 * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or
1717 * vaGetImage with other surfaces is supported.
1719 * An image created with vaDeriveImage should be freed with vaDestroyImage. The
1720 * image and image buffer structures will be destroyed; however, the underlying
1721 * surface will remain unchanged until freed with vaDestroySurfaces.
1723 VAStatus vaDeriveImage (
1725 VASurfaceID surface,
1726 VAImage *image /* out */
1729 VADriverContextP ctx;
1733 return ctx->vtable->vaDeriveImage ( ctx, surface, image );
1737 /* Get maximum number of subpicture formats supported by the implementation */
1738 int vaMaxNumSubpictureFormats (
1742 if (!vaDisplayIsValid(dpy))
1745 return CTX(dpy)->max_subpic_formats;
1749 * Query supported subpicture formats
1750 * The caller must provide a "format_list" array that can hold at
1751 * least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag
1752 * for each format to indicate additional capabilities for that format. The actual
1753 * number of formats returned in "format_list" is returned in "num_formats".
1755 VAStatus vaQuerySubpictureFormats (
1757 VAImageFormat *format_list, /* out */
1758 unsigned int *flags, /* out */
1759 unsigned int *num_formats /* out */
1762 VADriverContextP ctx;
1767 return ctx->vtable->vaQuerySubpictureFormats ( ctx, format_list, flags, num_formats);
1771 * Subpictures are created with an image associated.
1773 VAStatus vaCreateSubpicture (
1776 VASubpictureID *subpicture /* out */
1779 VADriverContextP ctx;
1783 return ctx->vtable->vaCreateSubpicture ( ctx, image, subpicture );
1787 * Destroy the subpicture before destroying the image it is assocated to
1789 VAStatus vaDestroySubpicture (
1791 VASubpictureID subpicture
1794 VADriverContextP ctx;
1798 return ctx->vtable->vaDestroySubpicture ( ctx, subpicture);
1801 VAStatus vaSetSubpictureImage (
1803 VASubpictureID subpicture,
1807 VADriverContextP ctx;
1811 return ctx->vtable->vaSetSubpictureImage ( ctx, subpicture, image);
1816 * If chromakey is enabled, then the area where the source value falls within
1817 * the chromakey [min, max] range is transparent
1819 VAStatus vaSetSubpictureChromakey (
1821 VASubpictureID subpicture,
1822 unsigned int chromakey_min,
1823 unsigned int chromakey_max,
1824 unsigned int chromakey_mask
1827 VADriverContextP ctx;
1831 return ctx->vtable->vaSetSubpictureChromakey ( ctx, subpicture, chromakey_min, chromakey_max, chromakey_mask );
1836 * Global alpha value is between 0 and 1. A value of 1 means fully opaque and
1837 * a value of 0 means fully transparent. If per-pixel alpha is also specified then
1838 * the overall alpha is per-pixel alpha multiplied by the global alpha
1840 VAStatus vaSetSubpictureGlobalAlpha (
1842 VASubpictureID subpicture,
1846 VADriverContextP ctx;
1850 return ctx->vtable->vaSetSubpictureGlobalAlpha ( ctx, subpicture, global_alpha );
1854 vaAssociateSubpicture associates the subpicture with the target_surface.
1855 It defines the region mapping between the subpicture and the target
1856 surface through source and destination rectangles (with the same width and height).
1857 Both will be displayed at the next call to vaPutSurface. Additional
1858 associations before the call to vaPutSurface simply overrides the association.
1860 VAStatus vaAssociateSubpicture (
1862 VASubpictureID subpicture,
1863 VASurfaceID *target_surfaces,
1865 short src_x, /* upper left offset in subpicture */
1867 unsigned short src_width,
1868 unsigned short src_height,
1869 short dest_x, /* upper left offset in surface */
1871 unsigned short dest_width,
1872 unsigned short dest_height,
1874 * whether to enable chroma-keying or global-alpha
1875 * see VA_SUBPICTURE_XXX values
1880 VADriverContextP ctx;
1884 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 );
1888 * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces.
1890 VAStatus vaDeassociateSubpicture (
1892 VASubpictureID subpicture,
1893 VASurfaceID *target_surfaces,
1897 VADriverContextP ctx;
1901 return ctx->vtable->vaDeassociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces );
1905 /* Get maximum number of display attributes supported by the implementation */
1906 int vaMaxNumDisplayAttributes (
1912 if (!vaDisplayIsValid(dpy))
1915 tmp = CTX(dpy)->max_display_attributes;
1917 VA_TRACE_LOG(va_TraceMaxNumDisplayAttributes, dpy, tmp);
1923 * Query display attributes
1924 * The caller must provide a "attr_list" array that can hold at
1925 * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
1926 * returned in "attr_list" is returned in "num_attributes".
1928 VAStatus vaQueryDisplayAttributes (
1930 VADisplayAttribute *attr_list, /* out */
1931 int *num_attributes /* out */
1934 VADriverContextP ctx;
1939 va_status = ctx->vtable->vaQueryDisplayAttributes ( ctx, attr_list, num_attributes );
1941 VA_TRACE_LOG(va_TraceQueryDisplayAttributes, dpy, attr_list, num_attributes);
1948 * Get display attributes
1949 * This function returns the current attribute values in "attr_list".
1950 * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
1951 * from vaQueryDisplayAttributes() can have their values retrieved.
1953 VAStatus vaGetDisplayAttributes (
1955 VADisplayAttribute *attr_list, /* in/out */
1959 VADriverContextP ctx;
1964 va_status = ctx->vtable->vaGetDisplayAttributes ( ctx, attr_list, num_attributes );
1966 VA_TRACE_LOG(va_TraceGetDisplayAttributes, dpy, attr_list, num_attributes);
1972 * Set display attributes
1973 * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
1974 * from vaQueryDisplayAttributes() can be set. If the attribute is not settable or
1975 * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
1977 VAStatus vaSetDisplayAttributes (
1979 VADisplayAttribute *attr_list,
1983 VADriverContextP ctx;
1988 va_status = ctx->vtable->vaSetDisplayAttributes ( ctx, attr_list, num_attributes );
1989 VA_TRACE_LOG(va_TraceSetDisplayAttributes, dpy, attr_list, num_attributes);
1994 VAStatus vaLockSurface(VADisplay dpy,
1995 VASurfaceID surface,
1996 unsigned int *fourcc, /* following are output argument */
1997 unsigned int *luma_stride,
1998 unsigned int *chroma_u_stride,
1999 unsigned int *chroma_v_stride,
2000 unsigned int *luma_offset,
2001 unsigned int *chroma_u_offset,
2002 unsigned int *chroma_v_offset,
2003 unsigned int *buffer_name,
2007 VADriverContextP ctx;
2011 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);
2015 VAStatus vaUnlockSurface(VADisplay dpy,
2019 VADriverContextP ctx;
2023 return ctx->vtable->vaUnlockSurface( ctx, surface );
2026 /* Video Processing */
2027 #define VA_VPP_INIT_CONTEXT(ctx, dpy) do { \
2028 CHECK_DISPLAY(dpy); \
2031 return VA_STATUS_ERROR_INVALID_DISPLAY; \
2034 #define VA_VPP_INVOKE(dpy, func, args) do { \
2035 if (!ctx->vtable_vpp->va##func) \
2036 return VA_STATUS_ERROR_UNIMPLEMENTED; \
2037 status = ctx->vtable_vpp->va##func args; \
2041 vaQueryVideoProcFilters(
2043 VAContextID context,
2044 VAProcFilterType *filters,
2045 unsigned int *num_filters
2048 VADriverContextP ctx;
2051 VA_VPP_INIT_CONTEXT(ctx, dpy);
2054 QueryVideoProcFilters,
2055 (ctx, context, filters, num_filters)
2061 vaQueryVideoProcFilterCaps(
2063 VAContextID context,
2064 VAProcFilterType type,
2066 unsigned int *num_filter_caps
2069 VADriverContextP ctx;
2072 VA_VPP_INIT_CONTEXT(ctx, dpy);
2075 QueryVideoProcFilterCaps,
2076 (ctx, context, type, filter_caps, num_filter_caps)
2082 vaQueryVideoProcPipelineCaps(
2084 VAContextID context,
2085 VABufferID *filters,
2086 unsigned int num_filters,
2087 VAProcPipelineCaps *pipeline_caps
2090 VADriverContextP ctx;
2093 VA_VPP_INIT_CONTEXT(ctx, dpy);
2096 QueryVideoProcPipelineCaps,
2097 (ctx, context, filters, num_filters, pipeline_caps)