/*
 * Copyright (c) 2007 Intel Corporation. All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sub license, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#define _GNU_SOURCE 1
#include "sysdeps.h"
#include "va.h"
#include "va_backend.h"
#include "va_backend_prot.h"
#include "va_backend_vpp.h"
#include "va_internal.h"
#include "va_trace.h"
#include "va_fool.h"

#include <assert.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include <unistd.h>
#ifdef ANDROID
#include <log/log.h>
/* support versions < JellyBean */
#ifndef ALOGE
#define ALOGE LOGE
#endif
#ifndef ALOGI
#define ALOGI LOGI
#endif
#endif

#define DRIVER_EXTENSION    "_drv_video.so"

#define ASSERT      assert
#define CHECK_VTABLE(s, ctx, func) if (!va_checkVtable(dpy, ctx->vtable->va##func, #func)) s = VA_STATUS_ERROR_UNIMPLEMENTED;
#define CHECK_MAXIMUM(s, ctx, var) if (!va_checkMaximum(dpy, ctx->max_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
#define CHECK_STRING(s, ctx, var) if (!va_checkString(dpy, ctx->str_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;

/*
 * read a config "env" for libva.conf or from environment setting
 * libva.conf has higher priority
 * return 0: the "env" is set, and the value is copied into env_value
 *        1: the env is not set
 */
int va_parseConfig(char *env, char *env_value)
{
    char *token, *value, *saveptr;
    char oneline[1024];
    FILE *fp = NULL;

    if (env == NULL)
        return 1;

    fp = fopen(SYSCONFDIR "/libva.conf", "r");
    while (fp && (fgets(oneline, 1024, fp) != NULL)) {
        if (strlen(oneline) == 1)
            continue;
        token = strtok_r(oneline, "=\n", &saveptr);
        value = strtok_r(NULL, "=\n", &saveptr);

        if (NULL == token || NULL == value)
            continue;

        if (strcmp(token, env) == 0) {
            if (env_value) {
                strncpy(env_value, value, 1024);
                env_value[1023] = '\0';
            }

            fclose(fp);

            return 0;
        }
    }
    if (fp)
        fclose(fp);

    /* no setting in config file, use env setting */
    value = getenv(env);
    if (value) {
        if (env_value) {
            strncpy(env_value, value, 1024);
            env_value[1023] = '\0';
        }
        return 0;
    }

    return 1;
}

int vaDisplayIsValid(VADisplay dpy)
{
    VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
    return pDisplayContext && (pDisplayContext->vadpy_magic == VA_DISPLAY_MAGIC) && pDisplayContext->vaIsValid(pDisplayContext);
}

/*
 * Global log level configured from the config file or environment, which sets
 * whether default logging appears or not (always overridden by explicitly
 * user-configured logging).
 */
static int default_log_level = 2;

static void default_log_error(void *user_context, const char *buffer)
{
    if (default_log_level < 1)
        return;
# ifdef ANDROID
    ALOGE("%s", buffer);
# else
    fprintf(stderr, "libva error: %s", buffer);
# endif
}

static void default_log_info(void *user_context, const char *buffer)
{
    if (default_log_level < 2)
        return;
# ifdef ANDROID
    ALOGI("%s", buffer);
# else
    fprintf(stderr, "libva info: %s", buffer);
# endif
}

/**
 * Set the callback for error messages, or NULL for no logging.
 * Returns the previous one, or NULL if it was disabled.
 */
VAMessageCallback vaSetErrorCallback(VADisplay dpy, VAMessageCallback callback, void *user_context)
{
    VADisplayContextP dctx;
    VAMessageCallback old_callback;

    if (!vaDisplayIsValid(dpy))
        return NULL;

    dctx = (VADisplayContextP)dpy;
    old_callback = dctx->error_callback;

    dctx->error_callback = callback;
    dctx->error_callback_user_context = user_context;

    return old_callback;
}

/**
 * Set the callback for info messages, or NULL for no logging.
 * Returns the previous one, or NULL if it was disabled.
 */
VAMessageCallback vaSetInfoCallback(VADisplay dpy, VAMessageCallback callback, void *user_context)
{
    VADisplayContextP dctx;
    VAMessageCallback old_callback;

    if (!vaDisplayIsValid(dpy))
        return NULL;

    dctx = (VADisplayContextP)dpy;
    old_callback = dctx->info_callback;

    dctx->info_callback = callback;
    dctx->info_callback_user_context = user_context;

    return old_callback;
}

static void va_MessagingInit()
{
#if ENABLE_VA_MESSAGING
    char env_value[1024];
    int ret;

    if (va_parseConfig("LIBVA_MESSAGING_LEVEL", &env_value[0]) == 0) {
        ret = sscanf(env_value, "%d", &default_log_level);
        if (ret < 1 || default_log_level < 0 || default_log_level > 2)
            default_log_level = 2;
    }
#endif
}

void va_errorMessage(VADisplay dpy, const char *msg, ...)
{
#if ENABLE_VA_MESSAGING
    VADisplayContextP dctx = (VADisplayContextP)dpy;
    char buf[512], *dynbuf;
    va_list args;
    int n, len;

    if (dctx->error_callback == NULL)
        return;

    va_start(args, msg);
    len = vsnprintf(buf, sizeof(buf), msg, args);
    va_end(args);

    if (len >= (int)sizeof(buf)) {
        dynbuf = malloc(len + 1);
        if (!dynbuf)
            return;
        va_start(args, msg);
        n = vsnprintf(dynbuf, len + 1, msg, args);
        va_end(args);
        if (n == len)
            dctx->error_callback(dctx->error_callback_user_context, dynbuf);
        free(dynbuf);
    } else if (len > 0)
        dctx->error_callback(dctx->error_callback_user_context, buf);
#endif
}

void va_infoMessage(VADisplay dpy, const char *msg, ...)
{
#if ENABLE_VA_MESSAGING
    VADisplayContextP dctx = (VADisplayContextP)dpy;
    char buf[512], *dynbuf;
    va_list args;
    int n, len;

    if (dctx->info_callback == NULL)
        return;

    va_start(args, msg);
    len = vsnprintf(buf, sizeof(buf), msg, args);
    va_end(args);

    if (len >= (int)sizeof(buf)) {
        dynbuf = malloc(len + 1);
        if (!dynbuf)
            return;
        va_start(args, msg);
        n = vsnprintf(dynbuf, len + 1, msg, args);
        va_end(args);
        if (n == len)
            dctx->info_callback(dctx->info_callback_user_context, dynbuf);
        free(dynbuf);
    } else if (len > 0)
        dctx->info_callback(dctx->info_callback_user_context, buf);
#endif
}

static void va_driverErrorCallback(VADriverContextP ctx,
                                   const char *message)
{
    VADisplayContextP dctx = ctx->pDisplayContext;
    if (!dctx)
        return;
    dctx->error_callback(dctx->error_callback_user_context, message);
}

static void va_driverInfoCallback(VADriverContextP ctx,
                                  const char *message)
{
    VADisplayContextP dctx = ctx->pDisplayContext;
    if (!dctx)
        return;
    dctx->info_callback(dctx->info_callback_user_context, message);
}

VADisplayContextP va_newDisplayContext(void)
{
    VADisplayContextP dctx = calloc(1, sizeof(*dctx));
    if (!dctx)
        return NULL;

    dctx->vadpy_magic = VA_DISPLAY_MAGIC;

    dctx->error_callback = default_log_error;
    dctx->info_callback  = default_log_info;

    return dctx;
}

VADriverContextP va_newDriverContext(VADisplayContextP dctx)
{
    VADriverContextP ctx = calloc(1, sizeof(*ctx));
    if (!ctx)
        return NULL;

    dctx->pDriverContext = ctx;
    ctx->pDisplayContext = dctx;

    ctx->error_callback = va_driverErrorCallback;
    ctx->info_callback  = va_driverInfoCallback;

    return ctx;
}

static bool va_checkVtable(VADisplay dpy, void *ptr, char *function)
{
    if (!ptr) {
        va_errorMessage(dpy, "No valid vtable entry for va%s\n", function);
        return false;
    }
    return true;
}

static bool va_checkMaximum(VADisplay dpy, int value, char *variable)
{
    if (!value) {
        va_errorMessage(dpy, "Failed to define max_%s in init\n", variable);
        return false;
    }
    return true;
}

static bool va_checkString(VADisplay dpy, const char* value, char *variable)
{
    if (!value) {
        va_errorMessage(dpy, "Failed to define str_%s in init\n", variable);
        return false;
    }
    return true;
}

static inline int
va_getDriverInitName(char *name, int namelen, int major, int minor)
{
    int ret = snprintf(name, namelen, "__vaDriverInit_%d_%d", major, minor);
    return ret > 0 && ret < namelen;
}
/** retrieve the back end driver candidate num , by default it should be 1
  * if there are no vaGetNumCandidates implementation in the display context
  * it should be 1 to avoid backward compatible issue */
static VAStatus va_getDriverNumCandidates(VADisplay dpy, int *num_candidates)
{
    VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
    *num_candidates = 1;
    const char *driver_name_env = NULL;
    VAStatus vaStatus = VA_STATUS_SUCCESS;
    VADriverContextP ctx;

    ctx = CTX(dpy);
    driver_name_env = getenv("LIBVA_DRIVER_NAME");

    if (pDisplayContext->vaGetNumCandidates)
        vaStatus = pDisplayContext->vaGetNumCandidates(pDisplayContext, num_candidates);
    if ((ctx->override_driver_name) || (driver_name_env && (geteuid() == getuid())))
        *num_candidates = 1;
    return vaStatus;
}

static VAStatus va_getDriverNameByIndex(VADisplay dpy, char **driver_name, int candidate_index)
{
    VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
    const char *driver_name_env = NULL;
    VADriverContextP ctx;
    VAStatus status = VA_STATUS_SUCCESS;

    ctx = CTX(dpy);
    if (pDisplayContext->vaGetDriverNameByIndex) {
        /*if vaGetDriverNameByIndex is implemented*/
        status = pDisplayContext->vaGetDriverNameByIndex(pDisplayContext, driver_name, candidate_index);
    } else {
        if (candidate_index == 0)
            status = pDisplayContext->vaGetDriverName(pDisplayContext, driver_name);
        else
            status = VA_STATUS_ERROR_INVALID_PARAMETER;
    }
    driver_name_env = getenv("LIBVA_DRIVER_NAME");
    /*if user set driver name by vaSetDriverName */
    if (ctx->override_driver_name) {
        if (*driver_name)
            free(*driver_name);
        *driver_name = strdup(ctx->override_driver_name);
        if (!(*driver_name)) {
            va_errorMessage(dpy, "va_getDriverNameByIndex  failed with %s, out of memory\n", vaErrorStr(VA_STATUS_ERROR_ALLOCATION_FAILED));
            return VA_STATUS_ERROR_ALLOCATION_FAILED;
        }
        va_infoMessage(dpy, "User requested driver '%s'\n", *driver_name);
        return VA_STATUS_SUCCESS;
    } else if (driver_name_env && (geteuid() == getuid())) {
        if (*driver_name)
            free(*driver_name);
        /*if user set driver name by environment variable*/
        *driver_name = strdup(driver_name_env);
        va_infoMessage(dpy, "User environment variable requested driver '%s'\n", *driver_name);
        return VA_STATUS_SUCCESS;
    }
    return status;
}

static char *va_getDriverPath(const char *driver_dir, const char *driver_name)
{
    int n = snprintf(0, 0, "%s/%s%s", driver_dir, driver_name, DRIVER_EXTENSION);
    if (n < 0)
        return NULL;
    char *driver_path = (char *) malloc(n + 1);
    if (!driver_path)
        return NULL;
    n = snprintf(driver_path, n + 1, "%s/%s%s",
                 driver_dir, driver_name, DRIVER_EXTENSION);
    if (n < 0) {
        free(driver_path);
        return NULL;
    }
    return driver_path;
}

static VAStatus va_openDriver(VADisplay dpy, char *driver_name)
{
    VADriverContextP ctx = CTX(dpy);
    VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN;
    char *search_path = NULL;
    char *saveptr;
    char *driver_dir;

    if (geteuid() == getuid())
        /* don't allow setuid apps to use LIBVA_DRIVERS_PATH */
        search_path = getenv("LIBVA_DRIVERS_PATH");
    if (!search_path)
        search_path = VA_DRIVERS_PATH;

    search_path = strdup((const char *)search_path);
    if (!search_path) {
        va_errorMessage(dpy, "%s L%d Out of memory\n",
                        __FUNCTION__, __LINE__);
        return VA_STATUS_ERROR_ALLOCATION_FAILED;
    }
    driver_dir = strtok_r(search_path, ":", &saveptr);
    while (driver_dir) {
        void *handle = NULL;
        char *driver_path = va_getDriverPath(driver_dir, driver_name);
        if (!driver_path) {
            va_errorMessage(dpy, "%s L%d Out of memory\n",
                            __FUNCTION__, __LINE__);
            free(search_path);
            return VA_STATUS_ERROR_ALLOCATION_FAILED;
        }

        va_infoMessage(dpy, "Trying to open %s\n", driver_path);
#if defined(RTLD_NODELETE) && !defined(ANDROID)
        handle = dlopen(driver_path, RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE);
#else
        handle = dlopen(driver_path, RTLD_NOW | RTLD_GLOBAL);
#endif
        if (!handle) {
            /* Don't give errors for non-existing files */
            if (0 == access(driver_path, F_OK))
                va_errorMessage(dpy, "dlopen of %s failed: %s\n", driver_path, dlerror());
        } else {
            VADriverInit init_func = NULL;
            char init_func_s[256];
            int i;

            struct {
                int major;
                int minor;
            } compatible_versions[VA_MINOR_VERSION + 2];
            for (i = 0; i <= VA_MINOR_VERSION; i ++) {
                compatible_versions[i].major = VA_MAJOR_VERSION;
                compatible_versions[i].minor = VA_MINOR_VERSION - i;
            }
            compatible_versions[i].major = -1;
            compatible_versions[i].minor = -1;

            for (i = 0; compatible_versions[i].major >= 0; i++) {
                if (va_getDriverInitName(init_func_s, sizeof(init_func_s),
                                         compatible_versions[i].major,
                                         compatible_versions[i].minor)) {
                    init_func = (VADriverInit)dlsym(handle, init_func_s);
                    if (init_func) {
                        va_infoMessage(dpy, "Found init function %s\n", init_func_s);
                        break;
                    }
                }
            }

            if (compatible_versions[i].major < 0) {
                va_errorMessage(dpy, "%s has no function %s\n",
                                driver_path, init_func_s);
                dlclose(handle);
            } else {
                struct VADriverVTable *vtable = ctx->vtable;
                struct VADriverVTableVPP *vtable_vpp = ctx->vtable_vpp;
                struct VADriverVTableProt *vtable_prot = ctx->vtable_prot;

                vaStatus = VA_STATUS_SUCCESS;
                if (!vtable) {
                    vtable = calloc(1, sizeof(*vtable));
                    if (!vtable)
                        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
                }
                ctx->vtable = vtable;

                if (!vtable_vpp) {
                    vtable_vpp = calloc(1, sizeof(*vtable_vpp));
                    if (vtable_vpp)
                        vtable_vpp->version = VA_DRIVER_VTABLE_VPP_VERSION;
                    else
                        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
                }
                ctx->vtable_vpp = vtable_vpp;

                if (!vtable_prot) {
                    vtable_prot = calloc(1, sizeof(*vtable_prot));
                    if (vtable_prot)
                        vtable_prot->version = VA_DRIVER_VTABLE_PROT_VERSION;
                    else
                        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
                }
                ctx->vtable_prot = vtable_prot;

                if (init_func && VA_STATUS_SUCCESS == vaStatus)
                    vaStatus = (*init_func)(ctx);

                if (VA_STATUS_SUCCESS == vaStatus) {
                    CHECK_MAXIMUM(vaStatus, ctx, profiles);
                    CHECK_MAXIMUM(vaStatus, ctx, entrypoints);
                    CHECK_MAXIMUM(vaStatus, ctx, attributes);
                    CHECK_MAXIMUM(vaStatus, ctx, image_formats);
                    CHECK_MAXIMUM(vaStatus, ctx, subpic_formats);
                    CHECK_STRING(vaStatus, ctx, vendor);
                    CHECK_VTABLE(vaStatus, ctx, Terminate);
                    CHECK_VTABLE(vaStatus, ctx, QueryConfigProfiles);
                    CHECK_VTABLE(vaStatus, ctx, QueryConfigEntrypoints);
                    CHECK_VTABLE(vaStatus, ctx, QueryConfigAttributes);
                    CHECK_VTABLE(vaStatus, ctx, CreateConfig);
                    CHECK_VTABLE(vaStatus, ctx, DestroyConfig);
                    CHECK_VTABLE(vaStatus, ctx, GetConfigAttributes);
                    CHECK_VTABLE(vaStatus, ctx, CreateSurfaces);
                    CHECK_VTABLE(vaStatus, ctx, DestroySurfaces);
                    CHECK_VTABLE(vaStatus, ctx, CreateContext);
                    CHECK_VTABLE(vaStatus, ctx, DestroyContext);
                    CHECK_VTABLE(vaStatus, ctx, CreateBuffer);
                    CHECK_VTABLE(vaStatus, ctx, BufferSetNumElements);
                    CHECK_VTABLE(vaStatus, ctx, MapBuffer);
                    CHECK_VTABLE(vaStatus, ctx, UnmapBuffer);
                    CHECK_VTABLE(vaStatus, ctx, DestroyBuffer);
                    CHECK_VTABLE(vaStatus, ctx, BeginPicture);
                    CHECK_VTABLE(vaStatus, ctx, RenderPicture);
                    CHECK_VTABLE(vaStatus, ctx, EndPicture);
                    CHECK_VTABLE(vaStatus, ctx, SyncSurface);
                    CHECK_VTABLE(vaStatus, ctx, QuerySurfaceStatus);
                    CHECK_VTABLE(vaStatus, ctx, QueryImageFormats);
                    CHECK_VTABLE(vaStatus, ctx, CreateImage);
                    CHECK_VTABLE(vaStatus, ctx, DeriveImage);
                    CHECK_VTABLE(vaStatus, ctx, DestroyImage);
                    CHECK_VTABLE(vaStatus, ctx, SetImagePalette);
                    CHECK_VTABLE(vaStatus, ctx, GetImage);
                    CHECK_VTABLE(vaStatus, ctx, PutImage);
                    CHECK_VTABLE(vaStatus, ctx, QuerySubpictureFormats);
                    CHECK_VTABLE(vaStatus, ctx, CreateSubpicture);
                    CHECK_VTABLE(vaStatus, ctx, DestroySubpicture);
                    CHECK_VTABLE(vaStatus, ctx, SetSubpictureImage);
                    CHECK_VTABLE(vaStatus, ctx, SetSubpictureChromakey);
                    CHECK_VTABLE(vaStatus, ctx, SetSubpictureGlobalAlpha);
                    CHECK_VTABLE(vaStatus, ctx, AssociateSubpicture);
                    CHECK_VTABLE(vaStatus, ctx, DeassociateSubpicture);
                    CHECK_VTABLE(vaStatus, ctx, QueryDisplayAttributes);
                    CHECK_VTABLE(vaStatus, ctx, GetDisplayAttributes);
                    CHECK_VTABLE(vaStatus, ctx, SetDisplayAttributes);
                }
                if (VA_STATUS_SUCCESS != vaStatus) {
                    va_errorMessage(dpy, "%s init failed\n", driver_path);
                    dlclose(handle);
                }
                if (VA_STATUS_SUCCESS == vaStatus)
                    ctx->handle = handle;
                free(driver_path);
                break;
            }
        }
        free(driver_path);

        driver_dir = strtok_r(NULL, ":", &saveptr);
    }

    free(search_path);

    return vaStatus;
}

VAPrivFunc vaGetLibFunc(VADisplay dpy, const char *func)
{
    VADriverContextP ctx;
    if (!vaDisplayIsValid(dpy))
        return NULL;
    ctx = CTX(dpy);

    if (NULL == ctx->handle)
        return NULL;

    return (VAPrivFunc) dlsym(ctx->handle, func);
}


/*
 * Returns a short english description of error_status
 */
const char *vaErrorStr(VAStatus error_status)
{
    switch (error_status) {
    case VA_STATUS_SUCCESS:
        return "success (no error)";
    case VA_STATUS_ERROR_OPERATION_FAILED:
        return "operation failed";
    case VA_STATUS_ERROR_ALLOCATION_FAILED:
        return "resource allocation failed";
    case VA_STATUS_ERROR_INVALID_DISPLAY:
        return "invalid VADisplay";
    case VA_STATUS_ERROR_INVALID_CONFIG:
        return "invalid VAConfigID";
    case VA_STATUS_ERROR_INVALID_CONTEXT:
        return "invalid VAContextID";
    case VA_STATUS_ERROR_INVALID_SURFACE:
        return "invalid VASurfaceID";
    case VA_STATUS_ERROR_INVALID_BUFFER:
        return "invalid VABufferID";
    case VA_STATUS_ERROR_INVALID_IMAGE:
        return "invalid VAImageID";
    case VA_STATUS_ERROR_INVALID_SUBPICTURE:
        return "invalid VASubpictureID";
    case VA_STATUS_ERROR_ATTR_NOT_SUPPORTED:
        return "attribute not supported";
    case VA_STATUS_ERROR_MAX_NUM_EXCEEDED:
        return "list argument exceeds maximum number";
    case VA_STATUS_ERROR_UNSUPPORTED_PROFILE:
        return "the requested VAProfile is not supported";
    case VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT:
        return "the requested VAEntryPoint is not supported";
    case VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT:
        return "the requested RT Format is not supported";
    case VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE:
        return "the requested VABufferType is not supported";
    case VA_STATUS_ERROR_SURFACE_BUSY:
        return "surface is in use";
    case VA_STATUS_ERROR_FLAG_NOT_SUPPORTED:
        return "flag not supported";
    case VA_STATUS_ERROR_INVALID_PARAMETER:
        return "invalid parameter";
    case VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED:
        return "resolution not supported";
    case VA_STATUS_ERROR_UNIMPLEMENTED:
        return "the requested function is not implemented";
    case VA_STATUS_ERROR_SURFACE_IN_DISPLAYING:
        return "surface is in displaying (may by overlay)" ;
    case VA_STATUS_ERROR_INVALID_IMAGE_FORMAT:
        return "invalid VAImageFormat";
    case VA_STATUS_ERROR_DECODING_ERROR:
        return "internal decoding error";
    case VA_STATUS_ERROR_ENCODING_ERROR:
        return "internal encoding error";
    case VA_STATUS_ERROR_INVALID_VALUE:
        return "an invalid/unsupported value was supplied";
    case VA_STATUS_ERROR_UNSUPPORTED_FILTER:
        return "the requested filter is not supported";
    case VA_STATUS_ERROR_INVALID_FILTER_CHAIN:
        return "an invalid filter chain was supplied";
    case VA_STATUS_ERROR_HW_BUSY:
        return "HW busy now";
    case VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE:
        return "an unsupported memory type was supplied";
    case VA_STATUS_ERROR_NOT_ENOUGH_BUFFER:
        return "allocated memory size is not enough for input or output";
    case VA_STATUS_ERROR_UNKNOWN:
        return "unknown libva error";
    }
    return "unknown libva error / description missing";
}

VAStatus vaSetDriverName(
    VADisplay dpy,
    char *driver_name
)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;
    char *override_driver_name = NULL;
    ctx = CTX(dpy);

    if (strlen(driver_name) == 0 || strlen(driver_name) >= 256) {
        vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
        va_errorMessage(dpy, "vaSetDriverName returns %s\n",
                        vaErrorStr(vaStatus));
        return vaStatus;
    }

    override_driver_name = strdup(driver_name);
    if (!override_driver_name) {
        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
        va_errorMessage(dpy, "vaSetDriverName returns %s. Out of Memory\n",
                        vaErrorStr(vaStatus));
        return vaStatus;
    }

    ctx->override_driver_name = override_driver_name;
    return VA_STATUS_SUCCESS;
}

VAStatus vaInitialize(
    VADisplay dpy,
    int *major_version,  /* out */
    int *minor_version   /* out */
)
{
    char *driver_name = NULL;
    int  num_candidates = 1;
    int  candidate_index = 0;
    VAStatus vaStatus;

    CHECK_DISPLAY(dpy);

    va_TraceInit(dpy);

    va_FoolInit(dpy);

    va_MessagingInit();

    va_infoMessage(dpy, "VA-API version %s\n", VA_VERSION_S);
    /*get backend driver candidate number, by default the value should be 1*/
    vaStatus = va_getDriverNumCandidates(dpy, &num_candidates);
    if (vaStatus != VA_STATUS_SUCCESS) {
        num_candidates = 1;
    }
    /*load driver one by one, until load success */
    for (candidate_index = 0; candidate_index < num_candidates; candidate_index ++) {
        if (driver_name)
            free(driver_name);
        vaStatus = va_getDriverNameByIndex(dpy, &driver_name, candidate_index);
        if (vaStatus != VA_STATUS_SUCCESS) {
            va_errorMessage(dpy, "vaGetDriverNameByIndex() failed with %s, driver_name = %s\n", vaErrorStr(vaStatus), driver_name);
            break;
        }
        vaStatus = va_openDriver(dpy, driver_name);
        va_infoMessage(dpy, "va_openDriver() returns %d\n", vaStatus);

        if (vaStatus == VA_STATUS_SUCCESS) {
            break;
        }

    }

    *major_version = VA_MAJOR_VERSION;
    *minor_version = VA_MINOR_VERSION;

    if (driver_name)
        free(driver_name);

    VA_TRACE_LOG(va_TraceInitialize, dpy, major_version, minor_version);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}


/*
 * After this call, all library internal resources will be cleaned up
 */
VAStatus vaTerminate(
    VADisplay dpy
)
{
    VAStatus vaStatus = VA_STATUS_SUCCESS;
    VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
    VADriverContextP old_ctx;

    CHECK_DISPLAY(dpy);
    old_ctx = CTX(dpy);

    if (old_ctx->handle) {
        vaStatus = old_ctx->vtable->vaTerminate(old_ctx);
        dlclose(old_ctx->handle);
        old_ctx->handle = NULL;
    }
    free(old_ctx->vtable);
    old_ctx->vtable = NULL;
    free(old_ctx->vtable_vpp);
    old_ctx->vtable_vpp = NULL;
    free(old_ctx->vtable_prot);
    old_ctx->vtable_prot = NULL;

    if (old_ctx->override_driver_name) {
        free(old_ctx->override_driver_name);
        old_ctx->override_driver_name = NULL;
    }

    VA_TRACE_LOG(va_TraceTerminate, dpy);
    VA_TRACE_RET(dpy, vaStatus);

    va_TraceEnd(dpy);

    va_FoolEnd(dpy);

    if (VA_STATUS_SUCCESS == vaStatus)
        pDisplayContext->vaDestroy(pDisplayContext);

    return vaStatus;
}

/*
 * vaQueryVendorString returns a pointer to a zero-terminated string
 * describing some aspects of the VA implemenation on a specific
 * hardware accelerator. The format of the returned string is:
 * <vendorname>-<major_version>-<minor_version>-<addtional_info>
 * e.g. for the Intel GMA500 implementation, an example would be:
 * "IntelGMA500-1.0-0.2-patch3
 */
const char *vaQueryVendorString(
    VADisplay dpy
)
{
    if (!vaDisplayIsValid(dpy))
        return NULL;

    return CTX(dpy)->str_vendor;
}


/* Get maximum number of profiles supported by the implementation */
int vaMaxNumProfiles(
    VADisplay dpy
)
{
    if (!vaDisplayIsValid(dpy))
        return 0;

    return CTX(dpy)->max_profiles;
}

/* Get maximum number of entrypoints supported by the implementation */
int vaMaxNumEntrypoints(
    VADisplay dpy
)
{
    if (!vaDisplayIsValid(dpy))
        return 0;

    return CTX(dpy)->max_entrypoints;
}


/* Get maximum number of attributs supported by the implementation */
int vaMaxNumConfigAttributes(
    VADisplay dpy
)
{
    if (!vaDisplayIsValid(dpy))
        return 0;

    return CTX(dpy)->max_attributes;
}

VAStatus vaQueryConfigEntrypoints(
    VADisplay dpy,
    VAProfile profile,
    VAEntrypoint *entrypoints,  /* out */
    int *num_entrypoints    /* out */
)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    vaStatus = ctx->vtable->vaQueryConfigEntrypoints(ctx, profile, entrypoints, num_entrypoints);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

VAStatus vaGetConfigAttributes(
    VADisplay dpy,
    VAProfile profile,
    VAEntrypoint entrypoint,
    VAConfigAttrib *attrib_list, /* in/out */
    int num_attribs
)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    vaStatus = ctx->vtable->vaGetConfigAttributes(ctx, profile, entrypoint, attrib_list, num_attribs);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

VAStatus vaQueryConfigProfiles(
    VADisplay dpy,
    VAProfile *profile_list,    /* out */
    int *num_profiles       /* out */
)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    vaStatus =  ctx->vtable->vaQueryConfigProfiles(ctx, profile_list, num_profiles);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

VAStatus vaCreateConfig(
    VADisplay dpy,
    VAProfile profile,
    VAEntrypoint entrypoint,
    VAConfigAttrib *attrib_list,
    int num_attribs,
    VAConfigID *config_id /* out */
)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    vaStatus = ctx->vtable->vaCreateConfig(ctx, profile, entrypoint, attrib_list, num_attribs, config_id);

    /* record the current entrypoint for further trace/fool determination */
    VA_TRACE_ALL(va_TraceCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
    VA_FOOL_FUNC(va_FoolCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

VAStatus vaDestroyConfig(
    VADisplay dpy,
    VAConfigID config_id
)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    vaStatus = ctx->vtable->vaDestroyConfig(ctx, config_id);

    VA_TRACE_ALL(va_TraceDestroyConfig, dpy, config_id);
    VA_TRACE_RET(dpy, vaStatus);

    return vaStatus;
}

VAStatus vaQueryConfigAttributes(
    VADisplay dpy,
    VAConfigID config_id,
    VAProfile *profile,     /* out */
    VAEntrypoint *entrypoint,   /* out */
    VAConfigAttrib *attrib_list,/* out */
    int *num_attribs        /* out */
)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    vaStatus = ctx->vtable->vaQueryConfigAttributes(ctx, config_id, profile, entrypoint, attrib_list, num_attribs);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

VAStatus vaQueryProcessingRate(
    VADisplay dpy,
    VAConfigID config_id,
    VAProcessingRateParameter *proc_buf,
    unsigned int *processing_rate   /* out */
)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);
    if (!ctx->vtable->vaQueryProcessingRate)
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
    else
        vaStatus = ctx->vtable->vaQueryProcessingRate(ctx, config_id, proc_buf, processing_rate);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

/* XXX: this is a slow implementation that will be removed */
static VAStatus
va_impl_query_surface_attributes(
    VADriverContextP    ctx,
    VAConfigID          config,
    VASurfaceAttrib    *out_attribs,
    unsigned int       *out_num_attribs_ptr
)
{
    VASurfaceAttrib *attribs = NULL;
    unsigned int num_attribs, n;
    VASurfaceAttrib *out_attrib;
    unsigned int out_num_attribs;
    VAImageFormat *image_formats = NULL;
    int num_image_formats, i;
    VAStatus va_status;

    /* List of surface attributes to query */
    struct va_surface_attrib_map {
        VASurfaceAttribType type;
        VAGenericValueType  value_type;
    };
    static const struct va_surface_attrib_map attribs_map[] = {
        { VASurfaceAttribMinWidth,      VAGenericValueTypeInteger },
        { VASurfaceAttribMaxWidth,      VAGenericValueTypeInteger },
        { VASurfaceAttribMinHeight,     VAGenericValueTypeInteger },
        { VASurfaceAttribMaxHeight,     VAGenericValueTypeInteger },
        { VASurfaceAttribMemoryType,    VAGenericValueTypeInteger },
        { VASurfaceAttribNone,          VAGenericValueTypeInteger }
    };

    if (!out_attribs || !out_num_attribs_ptr)
        return VA_STATUS_ERROR_INVALID_PARAMETER;
    if (!ctx->vtable->vaGetSurfaceAttributes)
        return VA_STATUS_ERROR_UNIMPLEMENTED;

    num_image_formats = ctx->max_image_formats;
    image_formats = malloc(num_image_formats * sizeof(*image_formats));
    if (!image_formats) {
        va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
        goto end;
    }

    va_status = ctx->vtable->vaQueryImageFormats(
                    ctx, image_formats, &num_image_formats);
    if (va_status != VA_STATUS_SUCCESS)
        goto end;

    num_attribs = VASurfaceAttribCount + num_image_formats;
    attribs = malloc(num_attribs * sizeof(*attribs));
    if (!attribs) {
        va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
        goto end;
    }

    /* Initialize with base surface attributes, except pixel-formats */
    for (n = 0; attribs_map[n].type != VASurfaceAttribNone; n++) {
        VASurfaceAttrib * const attrib = &attribs[n];
        attrib->type = attribs_map[n].type;
        attrib->flags = VA_SURFACE_ATTRIB_GETTABLE;
        attrib->value.type = attribs_map[n].value_type;
    }

    /* Append image formats */
    for (i = 0; i < num_image_formats; i++) {
        VASurfaceAttrib * const attrib = &attribs[n];
        attrib->type = VASurfaceAttribPixelFormat;
        attrib->flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE;
        attrib->value.type = VAGenericValueTypeInteger;
        attrib->value.value.i = image_formats[i].fourcc;
        if (++n == num_attribs) {
            va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
            goto end;
        }
    }
    num_attribs = n;

    va_status = ctx->vtable->vaGetSurfaceAttributes(
                    ctx, config, attribs, num_attribs);
    if (va_status != VA_STATUS_SUCCESS)
        goto end;

    /* Remove invalid entries */
    out_num_attribs = 0;
    for (n = 0; n < num_attribs; n++) {
        VASurfaceAttrib * const attrib = &attribs[n];

        if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
            continue;

        // Accept all surface attributes that are not pixel-formats
        if (attrib->type != VASurfaceAttribPixelFormat) {
            out_num_attribs++;
            continue;
        }

        // Drop invalid pixel-format attribute
        if (!attrib->value.value.i) {
            attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
            continue;
        }

        // Check for duplicates
        int is_duplicate = 0;
        for (i = n - 1; i >= 0 && !is_duplicate; i--) {
            const VASurfaceAttrib * const prev_attrib = &attribs[i];
            if (prev_attrib->type != VASurfaceAttribPixelFormat)
                break;
            is_duplicate = prev_attrib->value.value.i == attrib->value.value.i;
        }
        if (is_duplicate)
            attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
        else
            out_num_attribs++;
    }

    if (*out_num_attribs_ptr < out_num_attribs) {
        *out_num_attribs_ptr = out_num_attribs;
        va_status = VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
        goto end;
    }

    out_attrib = out_attribs;
    for (n = 0; n < num_attribs; n++) {
        const VASurfaceAttrib * const attrib = &attribs[n];
        if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
            continue;
        *out_attrib++ = *attrib;
    }

end:
    free(attribs);
    free(image_formats);
    return va_status;
}

VAStatus
vaQuerySurfaceAttributes(
    VADisplay           dpy,
    VAConfigID          config,
    VASurfaceAttrib    *attrib_list,
    unsigned int       *num_attribs
)
{
    VADriverContextP ctx;
    VAStatus vaStatus;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);
    if (!ctx)
        return VA_STATUS_ERROR_INVALID_DISPLAY;

    if (!ctx->vtable->vaQuerySurfaceAttributes)
        vaStatus = va_impl_query_surface_attributes(ctx, config,
                   attrib_list, num_attribs);
    else
        vaStatus = ctx->vtable->vaQuerySurfaceAttributes(ctx, config,
                   attrib_list, num_attribs);

    VA_TRACE_LOG(va_TraceQuerySurfaceAttributes, dpy, config, attrib_list, num_attribs);
    VA_TRACE_RET(dpy, vaStatus);

    return vaStatus;
}

VAStatus
vaCreateSurfaces(
    VADisplay           dpy,
    unsigned int        format,
    unsigned int        width,
    unsigned int        height,
    VASurfaceID        *surfaces,
    unsigned int        num_surfaces,
    VASurfaceAttrib    *attrib_list,
    unsigned int        num_attribs
)
{
    VADriverContextP ctx;
    VAStatus vaStatus;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);
    if (!ctx)
        return VA_STATUS_ERROR_INVALID_DISPLAY;

    if (ctx->vtable->vaCreateSurfaces2)
        vaStatus = ctx->vtable->vaCreateSurfaces2(ctx, format, width, height,
                   surfaces, num_surfaces,
                   attrib_list, num_attribs);
    else if (attrib_list && num_attribs > 0)
        vaStatus = VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
    else
        vaStatus = ctx->vtable->vaCreateSurfaces(ctx, width, height, format,
                   num_surfaces, surfaces);
    VA_TRACE_LOG(va_TraceCreateSurfaces,
                 dpy, width, height, format, num_surfaces, surfaces,
                 attrib_list, num_attribs);
    VA_TRACE_RET(dpy, vaStatus);

    return vaStatus;
}


VAStatus vaDestroySurfaces(
    VADisplay dpy,
    VASurfaceID *surface_list,
    int num_surfaces
)
{
    VADriverContextP ctx;
    VAStatus vaStatus;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    VA_TRACE_LOG(va_TraceDestroySurfaces,
                 dpy, surface_list, num_surfaces);

    vaStatus = ctx->vtable->vaDestroySurfaces(ctx, surface_list, num_surfaces);
    VA_TRACE_RET(dpy, vaStatus);

    return vaStatus;
}

VAStatus vaCreateContext(
    VADisplay dpy,
    VAConfigID config_id,
    int picture_width,
    int picture_height,
    int flag,
    VASurfaceID *render_targets,
    int num_render_targets,
    VAContextID *context        /* out */
)
{
    VADriverContextP ctx;
    VAStatus vaStatus;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    vaStatus = ctx->vtable->vaCreateContext(ctx, config_id, picture_width, picture_height,
                                            flag, render_targets, num_render_targets, context);

    /* keep current encode/decode resoluton */
    VA_TRACE_ALL(va_TraceCreateContext, dpy, config_id, picture_width, picture_height, flag, render_targets, num_render_targets, context);
    VA_TRACE_RET(dpy, vaStatus);

    return vaStatus;
}

VAStatus vaDestroyContext(
    VADisplay dpy,
    VAContextID context
)
{
    VADriverContextP ctx;
    VAStatus vaStatus;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    vaStatus = ctx->vtable->vaDestroyContext(ctx, context);

    VA_TRACE_ALL(va_TraceDestroyContext, dpy, context);
    VA_TRACE_RET(dpy, vaStatus);

    return vaStatus;
}

VAStatus vaCreateMFContext(
    VADisplay dpy,
    VAMFContextID *mf_context    /* out */
)
{
    VADriverContextP ctx;
    VAStatus vaStatus;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);
    if (ctx->vtable->vaCreateMFContext == NULL)
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
    else {
        vaStatus = ctx->vtable->vaCreateMFContext(ctx, mf_context);
        VA_TRACE_ALL(va_TraceCreateMFContext, dpy, mf_context);
    }

    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

VAStatus vaMFAddContext(
    VADisplay dpy,
    VAMFContextID mf_context,
    VAContextID context
)
{
    VADriverContextP ctx;
    VAStatus vaStatus;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    if (ctx->vtable->vaMFAddContext == NULL)
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
    else {
        vaStatus = ctx->vtable->vaMFAddContext(ctx, context, mf_context);
        VA_TRACE_ALL(va_TraceMFAddContext, dpy, context, mf_context);
    }

    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

VAStatus vaMFReleaseContext(
    VADisplay dpy,
    VAMFContextID mf_context,
    VAContextID context
)
{
    VADriverContextP ctx;
    VAStatus vaStatus;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);
    if (ctx->vtable->vaMFReleaseContext == NULL)
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
    else {
        vaStatus = ctx->vtable->vaMFReleaseContext(ctx, context, mf_context);
        VA_TRACE_ALL(va_TraceMFReleaseContext, dpy, context, mf_context);
    }
    VA_TRACE_RET(dpy, vaStatus);

    return vaStatus;
}

VAStatus vaMFSubmit(
    VADisplay dpy,
    VAMFContextID mf_context,
    VAContextID *contexts,
    int num_contexts
)
{
    VADriverContextP ctx;
    VAStatus vaStatus;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);
    CHECK_VTABLE(vaStatus, ctx, MFSubmit);
    if (ctx->vtable->vaMFSubmit == NULL)
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
    else {
        vaStatus = ctx->vtable->vaMFSubmit(ctx, mf_context, contexts, num_contexts);
        VA_TRACE_ALL(va_TraceMFSubmit, dpy, mf_context, contexts, num_contexts);
    }
    VA_TRACE_RET(dpy, vaStatus);

    return vaStatus;
}

VAStatus vaCreateBuffer(
    VADisplay dpy,
    VAContextID context,    /* in */
    VABufferType type,      /* in */
    unsigned int size,      /* in */
    unsigned int num_elements,  /* in */
    void *data,         /* in */
    VABufferID *buf_id      /* out */
)
{
    VADriverContextP ctx;
    VAStatus vaStatus;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    VA_FOOL_FUNC(va_FoolCreateBuffer, dpy, context, type, size, num_elements, data, buf_id);

    vaStatus = ctx->vtable->vaCreateBuffer(ctx, context, type, size, num_elements, data, buf_id);

    VA_TRACE_LOG(va_TraceCreateBuffer,
                 dpy, context, type, size, num_elements, data, buf_id);

    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

VAStatus vaCreateBuffer2(
    VADisplay dpy,
    VAContextID context,
    VABufferType type,
    unsigned int width,
    unsigned int height,
    unsigned int *unit_size,
    unsigned int *pitch,
    VABufferID *buf_id
)
{
    VADriverContextP ctx;
    VAStatus vaStatus;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);
    if (!ctx->vtable->vaCreateBuffer2)
        return VA_STATUS_ERROR_UNIMPLEMENTED;

    vaStatus = ctx->vtable->vaCreateBuffer2(ctx, context, type, width, height, unit_size, pitch, buf_id);

    VA_TRACE_LOG(va_TraceCreateBuffer,
                 dpy, context, type, *pitch, height, NULL, buf_id);
    VA_TRACE_RET(dpy, vaStatus);

    return vaStatus;
}

VAStatus vaBufferSetNumElements(
    VADisplay dpy,
    VABufferID buf_id,  /* in */
    unsigned int num_elements /* in */
)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);

    vaStatus = ctx->vtable->vaBufferSetNumElements(ctx, buf_id, num_elements);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}


VAStatus vaMapBuffer(
    VADisplay dpy,
    VABufferID buf_id,  /* in */
    void **pbuf     /* out */
)
{
    VADriverContextP ctx;
    VAStatus va_status;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    VA_FOOL_FUNC(va_FoolMapBuffer, dpy, buf_id, pbuf);

    va_status = ctx->vtable->vaMapBuffer(ctx, buf_id, pbuf);

    VA_TRACE_ALL(va_TraceMapBuffer, dpy, buf_id, pbuf);
    VA_TRACE_RET(dpy, va_status);

    return va_status;
}

VAStatus vaUnmapBuffer(
    VADisplay dpy,
    VABufferID buf_id   /* in */
)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);

    vaStatus = ctx->vtable->vaUnmapBuffer(ctx, buf_id);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

VAStatus vaDestroyBuffer(
    VADisplay dpy,
    VABufferID buffer_id
)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);

    VA_TRACE_LOG(va_TraceDestroyBuffer,
                 dpy, buffer_id);

    vaStatus = ctx->vtable->vaDestroyBuffer(ctx, buffer_id);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

VAStatus vaBufferInfo(
    VADisplay dpy,
    VAContextID context,    /* in */
    VABufferID buf_id,      /* in */
    VABufferType *type,     /* out */
    unsigned int *size,     /* out */
    unsigned int *num_elements  /* out */
)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    VA_FOOL_FUNC(va_FoolBufferInfo, dpy, buf_id, type, size, num_elements);

    vaStatus = ctx->vtable->vaBufferInfo(ctx, buf_id, type, size, num_elements);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

/* Locks buffer for external API usage */
VAStatus
vaAcquireBufferHandle(VADisplay dpy, VABufferID buf_id, VABufferInfo *buf_info)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    if (!ctx->vtable->vaAcquireBufferHandle)
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
    else
        vaStatus = ctx->vtable->vaAcquireBufferHandle(ctx, buf_id, buf_info);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

/* Unlocks buffer after usage from external API */
VAStatus
vaReleaseBufferHandle(VADisplay dpy, VABufferID buf_id)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    if (!ctx->vtable->vaReleaseBufferHandle)
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
    else
        vaStatus = ctx->vtable->vaReleaseBufferHandle(ctx, buf_id);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

VAStatus
vaExportSurfaceHandle(VADisplay dpy, VASurfaceID surface_id,
                      uint32_t mem_type, uint32_t flags,
                      void *descriptor)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    if (!ctx->vtable->vaExportSurfaceHandle)
        vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
    else
        vaStatus = ctx->vtable->vaExportSurfaceHandle(ctx, surface_id,
                   mem_type, flags,
                   descriptor);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

VAStatus vaBeginPicture(
    VADisplay dpy,
    VAContextID context,
    VASurfaceID render_target
)
{
    VADriverContextP ctx;
    VAStatus va_status;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    VA_TRACE_ALL(va_TraceBeginPicture, dpy, context, render_target);
    VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);

    va_status = ctx->vtable->vaBeginPicture(ctx, context, render_target);
    VA_TRACE_RET(dpy, va_status);

    return va_status;
}

VAStatus vaRenderPicture(
    VADisplay dpy,
    VAContextID context,
    VABufferID *buffers,
    int num_buffers
)
{
    VADriverContextP ctx;
    VAStatus vaStatus = VA_STATUS_SUCCESS;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    VA_TRACE_LOG(va_TraceRenderPicture, dpy, context, buffers, num_buffers);
    VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);

    vaStatus = ctx->vtable->vaRenderPicture(ctx, context, buffers, num_buffers);
    VA_TRACE_RET(dpy, vaStatus);
    return vaStatus;
}

VAStatus vaEndPicture(
    VADisplay dpy,
    VAContextID context
)
{
    VAStatus va_status = VA_STATUS_SUCCESS;
    VADriverContextP ctx;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
    VA_TRACE_ALL(va_TraceEndPicture, dpy, context, 0);
    va_status = ctx->vtable->vaEndPicture(ctx, context);
    VA_TRACE_RET(dpy, va_status);
    /* dump surface content */
    VA_TRACE_ALL(va_TraceEndPictureExt, dpy, context, 1);

    return va_status;
}

VAStatus vaSyncSurface(
    VADisplay dpy,
    VASurfaceID render_target
)
{
    VAStatus va_status;
    VADriverContextP ctx;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    va_status = ctx->vtable->vaSyncSurface(ctx, render_target);
    VA_TRACE_LOG(va_TraceSyncSurface, dpy, render_target);
    VA_TRACE_RET(dpy, va_status);

    return va_status;
}

VAStatus vaSyncSurface2(
    VADisplay dpy,
    VASurfaceID surface,
    uint64_t timeout_ns
)
{
    VAStatus va_status;
    VADriverContextP ctx;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    if (ctx->vtable->vaSyncSurface2)
        va_status = ctx->vtable->vaSyncSurface2(ctx, surface, timeout_ns);
    else
        va_status = VA_STATUS_ERROR_UNIMPLEMENTED;
    VA_TRACE_LOG(va_TraceSyncSurface2, dpy, surface, timeout_ns);
    VA_TRACE_RET(dpy, va_status);

    return va_status;
}

VAStatus vaQuerySurfaceStatus(
    VADisplay dpy,
    VASurfaceID render_target,
    VASurfaceStatus *status /* out */
)
{
    VAStatus va_status;
    VADriverContextP ctx;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    va_status = ctx->vtable->vaQuerySurfaceStatus(ctx, render_target, status);

    VA_TRACE_LOG(va_TraceQuerySurfaceStatus, dpy, render_target, status);
    VA_TRACE_RET(dpy, va_status);

    return va_status;
}

VAStatus vaQuerySurfaceError(
    VADisplay dpy,
    VASurfaceID surface,
    VAStatus error_status,
    void **error_info /*out*/
)
{
    VAStatus va_status;
    VADriverContextP ctx;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    va_status = ctx->vtable->vaQuerySurfaceError(ctx, surface, error_status, error_info);

    VA_TRACE_LOG(va_TraceQuerySurfaceError, dpy, surface, error_status, error_info);
    VA_TRACE_RET(dpy, va_status);

    return va_status;
}

VAStatus vaSyncBuffer(
    VADisplay dpy,
    VABufferID buf_id,
    uint64_t timeout_ns
)
{
    VAStatus va_status;
    VADriverContextP ctx;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    VA_TRACE_LOG(va_TraceSyncBuffer, dpy, buf_id, timeout_ns);

    if (ctx->vtable->vaSyncBuffer)
        va_status = ctx->vtable->vaSyncBuffer(ctx, buf_id, timeout_ns);
    else
        va_status = VA_STATUS_ERROR_UNIMPLEMENTED;
    VA_TRACE_RET(dpy, va_status);

    return va_status;
}

/* Get maximum number of image formats supported by the implementation */
int vaMaxNumImageFormats(
    VADisplay dpy
)
{
    if (!vaDisplayIsValid(dpy))
        return 0;

    return CTX(dpy)->max_image_formats;
}

VAStatus vaQueryImageFormats(
    VADisplay dpy,
    VAImageFormat *format_list, /* out */
    int *num_formats        /* out */
)
{
    VADriverContextP ctx;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    return ctx->vtable->vaQueryImageFormats(ctx, format_list, num_formats);
}

/*
 * The width and height fields returned in the VAImage structure may get
 * enlarged for some YUV formats. The size of the data buffer that needs
 * to be allocated will be given in the "data_size" field in VAImage.
 * Image data is not allocated by this function.  The client should
 * allocate the memory and fill in the VAImage structure's data field
 * after looking at "data_size" returned from the library.
 */
VAStatus vaCreateImage(
    VADisplay dpy,
    VAImageFormat *format,
    int width,
    int height,
    VAImage *image  /* out */
)
{
    VADriverContextP ctx;
    VAStatus va_status = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    va_status = ctx->vtable->vaCreateImage(ctx, format, width, height, image);
    VA_TRACE_RET(dpy, va_status);
    return va_status;
}

/*
 * Should call DestroyImage before destroying the surface it is bound to
 */
VAStatus vaDestroyImage(
    VADisplay dpy,
    VAImageID image
)
{
    VADriverContextP ctx;
    VAStatus va_status = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    va_status = ctx->vtable->vaDestroyImage(ctx, image);
    VA_TRACE_RET(dpy, va_status);
    return va_status;
}

VAStatus vaSetImagePalette(
    VADisplay dpy,
    VAImageID image,
    unsigned char *palette
)
{
    VADriverContextP ctx;
    VAStatus va_status = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    va_status = ctx->vtable->vaSetImagePalette(ctx, image, palette);
    VA_TRACE_RET(dpy, va_status);
    return va_status;
}

/*
 * Retrieve surface data into a VAImage
 * Image must be in a format supported by the implementation
 */
VAStatus vaGetImage(
    VADisplay dpy,
    VASurfaceID surface,
    int x,  /* coordinates of the upper left source pixel */
    int y,
    unsigned int width, /* width and height of the region */
    unsigned int height,
    VAImageID image
)
{
    VADriverContextP ctx;
    VAStatus va_status = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    va_status = ctx->vtable->vaGetImage(ctx, surface, x, y, width, height, image);
    VA_TRACE_RET(dpy, va_status);
    return va_status;
}

/*
 * Copy data from a VAImage to a surface
 * Image must be in a format supported by the implementation
 */
VAStatus vaPutImage(
    VADisplay dpy,
    VASurfaceID surface,
    VAImageID image,
    int src_x,
    int src_y,
    unsigned int src_width,
    unsigned int src_height,
    int dest_x,
    int dest_y,
    unsigned int dest_width,
    unsigned int dest_height
)
{
    VADriverContextP ctx;
    VAStatus va_status = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    va_status = ctx->vtable->vaPutImage(ctx, surface, image, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height);
    VA_TRACE_RET(dpy, va_status);
    return va_status;
}

/*
 * Derive an VAImage from an existing surface.
 * This interface will derive a VAImage and corresponding image buffer from
 * an existing VA Surface. The image buffer can then be mapped/unmapped for
 * direct CPU access. This operation is only possible on implementations with
 * direct rendering capabilities and internal surface formats that can be
 * represented with a VAImage. When the operation is not possible this interface
 * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back
 * to using vaCreateImage + vaPutImage to accomplish the same task in an
 * indirect manner.
 *
 * Implementations should only return success when the resulting image buffer
 * would be useable with vaMap/Unmap.
 *
 * When directly accessing a surface special care must be taken to insure
 * proper synchronization with the graphics hardware. Clients should call
 * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent
 * rendering or currently being displayed by an overlay.
 *
 * Additionally nothing about the contents of a surface should be assumed
 * following a vaPutSurface. Implementations are free to modify the surface for
 * scaling or subpicture blending within a call to vaPutImage.
 *
 * Calls to vaPutImage or vaGetImage using the same surface from which the image
 * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or
 * vaGetImage with other surfaces is supported.
 *
 * An image created with vaDeriveImage should be freed with vaDestroyImage. The
 * image and image buffer structures will be destroyed; however, the underlying
 * surface will remain unchanged until freed with vaDestroySurfaces.
 */
VAStatus vaDeriveImage(
    VADisplay dpy,
    VASurfaceID surface,
    VAImage *image  /* out */
)
{
    VADriverContextP ctx;
    VAStatus va_status = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    va_status = ctx->vtable->vaDeriveImage(ctx, surface, image);
    VA_TRACE_RET(dpy, va_status);
    return va_status;
}


/* Get maximum number of subpicture formats supported by the implementation */
int vaMaxNumSubpictureFormats(
    VADisplay dpy
)
{
    if (!vaDisplayIsValid(dpy))
        return 0;

    return CTX(dpy)->max_subpic_formats;
}

/*
 * Query supported subpicture formats
 * The caller must provide a "format_list" array that can hold at
 * least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag
 * for each format to indicate additional capabilities for that format. The actual
 * number of formats returned in "format_list" is returned in "num_formats".
 */
VAStatus vaQuerySubpictureFormats(
    VADisplay dpy,
    VAImageFormat *format_list, /* out */
    unsigned int *flags,    /* out */
    unsigned int *num_formats   /* out */
)
{
    VADriverContextP ctx;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    return ctx->vtable->vaQuerySubpictureFormats(ctx, format_list, flags, num_formats);
}

/*
 * Subpictures are created with an image associated.
 */
VAStatus vaCreateSubpicture(
    VADisplay dpy,
    VAImageID image,
    VASubpictureID *subpicture  /* out */
)
{
    VADriverContextP ctx;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    return ctx->vtable->vaCreateSubpicture(ctx, image, subpicture);
}

/*
 * Destroy the subpicture before destroying the image it is assocated to
 */
VAStatus vaDestroySubpicture(
    VADisplay dpy,
    VASubpictureID subpicture
)
{
    VADriverContextP ctx;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    return ctx->vtable->vaDestroySubpicture(ctx, subpicture);
}

VAStatus vaSetSubpictureImage(
    VADisplay dpy,
    VASubpictureID subpicture,
    VAImageID image
)
{
    VADriverContextP ctx;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    return ctx->vtable->vaSetSubpictureImage(ctx, subpicture, image);
}


/*
 * If chromakey is enabled, then the area where the source value falls within
 * the chromakey [min, max] range is transparent
 */
VAStatus vaSetSubpictureChromakey(
    VADisplay dpy,
    VASubpictureID subpicture,
    unsigned int chromakey_min,
    unsigned int chromakey_max,
    unsigned int chromakey_mask
)
{
    VADriverContextP ctx;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    return ctx->vtable->vaSetSubpictureChromakey(ctx, subpicture, chromakey_min, chromakey_max, chromakey_mask);
}


/*
 * Global alpha value is between 0 and 1. A value of 1 means fully opaque and
 * a value of 0 means fully transparent. If per-pixel alpha is also specified then
 * the overall alpha is per-pixel alpha multiplied by the global alpha
 */
VAStatus vaSetSubpictureGlobalAlpha(
    VADisplay dpy,
    VASubpictureID subpicture,
    float global_alpha
)
{
    VADriverContextP ctx;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    return ctx->vtable->vaSetSubpictureGlobalAlpha(ctx, subpicture, global_alpha);
}

/*
  vaAssociateSubpicture associates the subpicture with the target_surface.
  It defines the region mapping between the subpicture and the target
  surface through source and destination rectangles (with the same width and height).
  Both will be displayed at the next call to vaPutSurface.  Additional
  associations before the call to vaPutSurface simply overrides the association.
*/
VAStatus vaAssociateSubpicture(
    VADisplay dpy,
    VASubpictureID subpicture,
    VASurfaceID *target_surfaces,
    int num_surfaces,
    short src_x, /* upper left offset in subpicture */
    short src_y,
    unsigned short src_width,
    unsigned short src_height,
    short dest_x, /* upper left offset in surface */
    short dest_y,
    unsigned short dest_width,
    unsigned short dest_height,
    /*
     * whether to enable chroma-keying or global-alpha
     * see VA_SUBPICTURE_XXX values
     */
    unsigned int flags
)
{
    VADriverContextP ctx;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    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);
}

/*
 * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces.
 */
VAStatus vaDeassociateSubpicture(
    VADisplay dpy,
    VASubpictureID subpicture,
    VASurfaceID *target_surfaces,
    int num_surfaces
)
{
    VADriverContextP ctx;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    return ctx->vtable->vaDeassociateSubpicture(ctx, subpicture, target_surfaces, num_surfaces);
}


/* Get maximum number of display attributes supported by the implementation */
int vaMaxNumDisplayAttributes(
    VADisplay dpy
)
{
    int tmp;

    if (!vaDisplayIsValid(dpy))
        return 0;

    tmp = CTX(dpy)->max_display_attributes;

    VA_TRACE_LOG(va_TraceMaxNumDisplayAttributes, dpy, tmp);

    return tmp;
}

/*
 * Query display attributes
 * The caller must provide a "attr_list" array that can hold at
 * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
 * returned in "attr_list" is returned in "num_attributes".
 */
VAStatus vaQueryDisplayAttributes(
    VADisplay dpy,
    VADisplayAttribute *attr_list,  /* out */
    int *num_attributes         /* out */
)
{
    VADriverContextP ctx;
    VAStatus va_status;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);
    va_status = ctx->vtable->vaQueryDisplayAttributes(ctx, attr_list, num_attributes);

    VA_TRACE_LOG(va_TraceQueryDisplayAttributes, dpy, attr_list, num_attributes);
    VA_TRACE_RET(dpy, va_status);

    return va_status;

}

/*
 * Get display attributes
 * This function returns the current attribute values in "attr_list".
 * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
 * from vaQueryDisplayAttributes() can have their values retrieved.
 */
VAStatus vaGetDisplayAttributes(
    VADisplay dpy,
    VADisplayAttribute *attr_list,  /* in/out */
    int num_attributes
)
{
    VADriverContextP ctx;
    VAStatus va_status;

    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);
    va_status = ctx->vtable->vaGetDisplayAttributes(ctx, attr_list, num_attributes);

    VA_TRACE_LOG(va_TraceGetDisplayAttributes, dpy, attr_list, num_attributes);
    VA_TRACE_RET(dpy, va_status);

    return va_status;
}

/*
 * Set display attributes
 * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
 * from vaQueryDisplayAttributes() can be set.  If the attribute is not settable or
 * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
 */
VAStatus vaSetDisplayAttributes(
    VADisplay dpy,
    VADisplayAttribute *attr_list,
    int num_attributes
)
{
    VADriverContextP ctx;
    VAStatus va_status;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    va_status = ctx->vtable->vaSetDisplayAttributes(ctx, attr_list, num_attributes);
    VA_TRACE_LOG(va_TraceSetDisplayAttributes, dpy, attr_list, num_attributes);
    VA_TRACE_RET(dpy, va_status);

    return va_status;
}

VAStatus vaLockSurface(VADisplay dpy,
                       VASurfaceID surface,
                       unsigned int *fourcc, /* following are output argument */
                       unsigned int *luma_stride,
                       unsigned int *chroma_u_stride,
                       unsigned int *chroma_v_stride,
                       unsigned int *luma_offset,
                       unsigned int *chroma_u_offset,
                       unsigned int *chroma_v_offset,
                       unsigned int *buffer_name,
                       void **buffer
                      )
{
    VADriverContextP ctx;
    VAStatus va_status = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    va_status = 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);
    VA_TRACE_RET(dpy, va_status);

    return va_status;
}


VAStatus vaUnlockSurface(VADisplay dpy,
                         VASurfaceID surface
                        )
{
    VADriverContextP ctx;
    VAStatus va_status = VA_STATUS_SUCCESS;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    va_status = ctx->vtable->vaUnlockSurface(ctx, surface);
    VA_TRACE_RET(dpy, va_status);

    return va_status;
}

/* Video Processing */
#define VA_VPP_INIT_CONTEXT(ctx, dpy) do {              \
        CHECK_DISPLAY(dpy);                             \
        ctx = CTX(dpy);                                 \
        if (!ctx)                                       \
            return VA_STATUS_ERROR_INVALID_DISPLAY;     \
    } while (0)

#define VA_VPP_INVOKE(dpy, func, args) do {             \
        if (!ctx->vtable_vpp->va##func)                 \
            return VA_STATUS_ERROR_UNIMPLEMENTED;       \
        status = ctx->vtable_vpp->va##func args;        \
    } while (0)

VAStatus
vaQueryVideoProcFilters(
    VADisplay           dpy,
    VAContextID         context,
    VAProcFilterType   *filters,
    unsigned int       *num_filters
)
{
    VADriverContextP ctx;
    VAStatus status;

    VA_VPP_INIT_CONTEXT(ctx, dpy);
    VA_VPP_INVOKE(
        ctx,
        QueryVideoProcFilters,
        (ctx, context, filters, num_filters)
    );
    VA_TRACE_RET(dpy, status);

    return status;
}

VAStatus
vaQueryVideoProcFilterCaps(
    VADisplay           dpy,
    VAContextID         context,
    VAProcFilterType    type,
    void               *filter_caps,
    unsigned int       *num_filter_caps
)
{
    VADriverContextP ctx;
    VAStatus status;

    VA_VPP_INIT_CONTEXT(ctx, dpy);
    VA_VPP_INVOKE(
        ctx,
        QueryVideoProcFilterCaps,
        (ctx, context, type, filter_caps, num_filter_caps)
    );
    VA_TRACE_RET(dpy, status);
    return status;
}

VAStatus
vaQueryVideoProcPipelineCaps(
    VADisplay           dpy,
    VAContextID         context,
    VABufferID         *filters,
    unsigned int        num_filters,
    VAProcPipelineCaps *pipeline_caps
)
{
    VADriverContextP ctx;
    VAStatus status;

    VA_VPP_INIT_CONTEXT(ctx, dpy);
    VA_VPP_INVOKE(
        ctx,
        QueryVideoProcPipelineCaps,
        (ctx, context, filters, num_filters, pipeline_caps)
    );
    VA_TRACE_RET(dpy, status);
    return status;
}

VAStatus
vaCopy(
    VADisplay         dpy,
    VACopyObject      *dst,
    VACopyObject      *src,
    VACopyOption      option
)
{
    VAStatus va_status;
    VADriverContextP ctx;
    CHECK_DISPLAY(dpy);
    ctx = CTX(dpy);

    if (ctx->vtable->vaCopy  == NULL)
        va_status = VA_STATUS_ERROR_UNIMPLEMENTED;
    else
        va_status = ctx->vtable->vaCopy(ctx, dst, src, option);
    return va_status;
}

/* Protected content */
#define VA_PROT_INIT_CONTEXT(ctx, dpy) do {              \
        CHECK_DISPLAY(dpy);                             \
        ctx = CTX(dpy);                                 \
        if (!ctx)                                       \
            return VA_STATUS_ERROR_INVALID_DISPLAY;     \
    } while (0)

#define VA_PROT_INVOKE(dpy, func, args) do {             \
        if (!ctx->vtable_prot->va##func)                 \
            return VA_STATUS_ERROR_UNIMPLEMENTED;       \
        status = ctx->vtable_prot->va##func args;        \
    } while (0)

VAStatus vaCreateProtectedSession(
    VADisplay dpy,
    VAConfigID config_id,
    VAProtectedSessionID *protected_session
)
{
    VADriverContextP ctx;
    VAStatus status;

    VA_PROT_INIT_CONTEXT(ctx, dpy);
    VA_PROT_INVOKE(
        ctx,
        CreateProtectedSession,
        (ctx, config_id, protected_session)
    );
    VA_TRACE_RET(dpy, status);

    return status;
}

VAStatus vaDestroyProtectedSession(
    VADisplay dpy,
    VAProtectedSessionID protected_session
)
{
    VADriverContextP ctx;
    VAStatus status;

    VA_PROT_INIT_CONTEXT(ctx, dpy);
    VA_PROT_INVOKE(
        ctx,
        DestroyProtectedSession,
        (ctx, protected_session)
    );
    VA_TRACE_RET(dpy, status);

    return status;
}

VAStatus vaAttachProtectedSession(
    VADisplay dpy,
    VAContextID context,
    VAProtectedSessionID protected_session
)
{
    VADriverContextP ctx;
    VAStatus status;

    VA_PROT_INIT_CONTEXT(ctx, dpy);
    VA_PROT_INVOKE(
        ctx,
        AttachProtectedSession,
        (ctx, context, protected_session)
    );
    VA_TRACE_RET(dpy, status);

    return status;
}

VAStatus vaDetachProtectedSession(
    VADisplay dpy,
    VAContextID context
)
{
    VADriverContextP ctx;
    VAStatus status;

    VA_PROT_INIT_CONTEXT(ctx, dpy);
    VA_PROT_INVOKE(
        ctx,
        DetachProtectedSession,
        (ctx, context)
    );
    VA_TRACE_RET(dpy, status);

    return status;
}

VAStatus vaProtectedSessionExecute(
    VADisplay dpy,
    VAProtectedSessionID protected_session,
    VABufferID data
)
{
    VADriverContextP ctx;
    VAStatus status;

    VA_PROT_INIT_CONTEXT(ctx, dpy);
    VA_PROT_INVOKE(
        ctx,
        ProtectedSessionExecute,
        (ctx, protected_session, data)
    );
    VA_TRACE_RET(dpy, status);

    return status;
}

