|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* Copyright (c) 2007 Intel Corporation. All Rights Reserved.
|
|
Packit Service |
9402ce |
*
|
|
Packit Service |
9402ce |
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
Packit Service |
9402ce |
* copy of this software and associated documentation files (the
|
|
Packit Service |
9402ce |
* "Software"), to deal in the Software without restriction, including
|
|
Packit Service |
9402ce |
* without limitation the rights to use, copy, modify, merge, publish,
|
|
Packit Service |
9402ce |
* distribute, sub license, and/or sell copies of the Software, and to
|
|
Packit Service |
9402ce |
* permit persons to whom the Software is furnished to do so, subject to
|
|
Packit Service |
9402ce |
* the following conditions:
|
|
Packit Service |
9402ce |
*
|
|
Packit Service |
9402ce |
* The above copyright notice and this permission notice (including the
|
|
Packit Service |
9402ce |
* next paragraph) shall be included in all copies or substantial portions
|
|
Packit Service |
9402ce |
* of the Software.
|
|
Packit Service |
9402ce |
*
|
|
Packit Service |
9402ce |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
Packit Service |
9402ce |
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit Service |
9402ce |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
|
Packit Service |
9402ce |
* IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
|
|
Packit Service |
9402ce |
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
Packit Service |
9402ce |
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
Packit Service |
9402ce |
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
#define _GNU_SOURCE 1
|
|
Packit Service |
9402ce |
#include "sysdeps.h"
|
|
Packit Service |
9402ce |
#include "va.h"
|
|
Packit Service |
9402ce |
#include "va_backend.h"
|
|
Packit Service |
9402ce |
#include "va_backend_vpp.h"
|
|
Packit Service |
9402ce |
#include "va_internal.h"
|
|
Packit Service |
9402ce |
#include "va_trace.h"
|
|
Packit Service |
9402ce |
#include "va_fool.h"
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
#include <assert.h>
|
|
Packit Service |
9402ce |
#include <stdarg.h>
|
|
Packit Service |
9402ce |
#include <stdio.h>
|
|
Packit Service |
9402ce |
#include <stdlib.h>
|
|
Packit Service |
9402ce |
#include <string.h>
|
|
Packit Service |
9402ce |
#include <dlfcn.h>
|
|
Packit Service |
9402ce |
#include <unistd.h>
|
|
Packit Service |
9402ce |
#ifdef ANDROID
|
|
Packit Service |
9402ce |
#include <log/log.h>
|
|
Packit Service |
9402ce |
/* support versions < JellyBean */
|
|
Packit Service |
9402ce |
#ifndef ALOGE
|
|
Packit Service |
9402ce |
#define ALOGE LOGE
|
|
Packit Service |
9402ce |
#endif
|
|
Packit Service |
9402ce |
#ifndef ALOGI
|
|
Packit Service |
9402ce |
#define ALOGI LOGI
|
|
Packit Service |
9402ce |
#endif
|
|
Packit Service |
9402ce |
#endif
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
#define DRIVER_EXTENSION "_drv_video.so"
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
#define ASSERT assert
|
|
Packit Service |
9402ce |
#define CHECK_VTABLE(s, ctx, func) if (!va_checkVtable(dpy, ctx->vtable->va##func, #func)) s = VA_STATUS_ERROR_UNKNOWN;
|
|
Packit Service |
9402ce |
#define CHECK_MAXIMUM(s, ctx, var) if (!va_checkMaximum(dpy, ctx->max_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
|
|
Packit Service |
9402ce |
#define CHECK_STRING(s, ctx, var) if (!va_checkString(dpy, ctx->str_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* read a config "env" for libva.conf or from environment setting
|
|
Packit Service |
9402ce |
* libva.conf has higher priority
|
|
Packit Service |
9402ce |
* return 0: the "env" is set, and the value is copied into env_value
|
|
Packit Service |
9402ce |
* 1: the env is not set
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
int va_parseConfig(char *env, char *env_value)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
char *token, *value, *saveptr;
|
|
Packit Service |
9402ce |
char oneline[1024];
|
|
Packit Service |
9402ce |
FILE *fp=NULL;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (env == NULL)
|
|
Packit Service |
9402ce |
return 1;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
fp = fopen("/etc/libva.conf", "r");
|
|
Packit Service |
9402ce |
while (fp && (fgets(oneline, 1024, fp) != NULL)) {
|
|
Packit Service |
9402ce |
if (strlen(oneline) == 1)
|
|
Packit Service |
9402ce |
continue;
|
|
Packit Service |
9402ce |
token = strtok_r(oneline, "=\n", &saveptr);
|
|
Packit Service |
9402ce |
value = strtok_r(NULL, "=\n", &saveptr);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (NULL == token || NULL == value)
|
|
Packit Service |
9402ce |
continue;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (strcmp(token, env) == 0) {
|
|
Packit Service |
9402ce |
if (env_value) {
|
|
Packit Service |
9402ce |
strncpy(env_value,value, 1024);
|
|
Packit Service |
9402ce |
env_value[1023] = '\0';
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
fclose(fp);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return 0;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
if (fp)
|
|
Packit Service |
9402ce |
fclose(fp);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* no setting in config file, use env setting */
|
|
Packit Service |
9402ce |
value = getenv(env);
|
|
Packit Service |
9402ce |
if (value) {
|
|
Packit Service |
9402ce |
if (env_value) {
|
|
Packit Service |
9402ce |
strncpy(env_value, value, 1024);
|
|
Packit Service |
9402ce |
env_value[1023] = '\0';
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
return 0;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return 1;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
int vaDisplayIsValid(VADisplay dpy)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
|
|
Packit Service |
9402ce |
return pDisplayContext && (pDisplayContext->vadpy_magic == VA_DISPLAY_MAGIC) && pDisplayContext->vaIsValid(pDisplayContext);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* Global log level configured from the config file or environment, which sets
|
|
Packit Service |
9402ce |
* whether default logging appears or not (always overridden by explicitly
|
|
Packit Service |
9402ce |
* user-configured logging).
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
static int default_log_level = 2;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
static void default_log_error(void *user_context, const char *buffer)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
if (default_log_level < 1)
|
|
Packit Service |
9402ce |
return;
|
|
Packit Service |
9402ce |
# ifdef ANDROID
|
|
Packit Service |
9402ce |
ALOGE("%s", buffer);
|
|
Packit Service |
9402ce |
# else
|
|
Packit Service |
9402ce |
fprintf(stderr, "libva error: %s", buffer);
|
|
Packit Service |
9402ce |
# endif
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
static void default_log_info(void *user_context, const char *buffer)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
if (default_log_level < 2)
|
|
Packit Service |
9402ce |
return;
|
|
Packit Service |
9402ce |
# ifdef ANDROID
|
|
Packit Service |
9402ce |
ALOGI("%s", buffer);
|
|
Packit Service |
9402ce |
# else
|
|
Packit Service |
9402ce |
fprintf(stderr, "libva info: %s", buffer);
|
|
Packit Service |
9402ce |
# endif
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/**
|
|
Packit Service |
9402ce |
* Set the callback for error messages, or NULL for no logging.
|
|
Packit Service |
9402ce |
* Returns the previous one, or NULL if it was disabled.
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAMessageCallback vaSetErrorCallback(VADisplay dpy, VAMessageCallback callback, void *user_context)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADisplayContextP dctx;
|
|
Packit Service |
9402ce |
VAMessageCallback old_callback;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (!vaDisplayIsValid(dpy))
|
|
Packit Service |
9402ce |
return NULL;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
dctx = (VADisplayContextP)dpy;
|
|
Packit Service |
9402ce |
old_callback = dctx->error_callback;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
dctx->error_callback = callback;
|
|
Packit Service |
9402ce |
dctx->error_callback_user_context = user_context;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return old_callback;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/**
|
|
Packit Service |
9402ce |
* Set the callback for info messages, or NULL for no logging.
|
|
Packit Service |
9402ce |
* Returns the previous one, or NULL if it was disabled.
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAMessageCallback vaSetInfoCallback(VADisplay dpy, VAMessageCallback callback, void *user_context)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADisplayContextP dctx;
|
|
Packit Service |
9402ce |
VAMessageCallback old_callback;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (!vaDisplayIsValid(dpy))
|
|
Packit Service |
9402ce |
return NULL;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
dctx = (VADisplayContextP)dpy;
|
|
Packit Service |
9402ce |
old_callback = dctx->info_callback;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
dctx->info_callback = callback;
|
|
Packit Service |
9402ce |
dctx->info_callback_user_context = user_context;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return old_callback;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
static void va_MessagingInit()
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
#if ENABLE_VA_MESSAGING
|
|
Packit Service |
9402ce |
char env_value[1024];
|
|
Packit Service |
9402ce |
int ret;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (va_parseConfig("LIBVA_MESSAGING_LEVEL", &env_value[0]) == 0) {
|
|
Packit Service |
9402ce |
ret = sscanf(env_value, "%d", &default_log_level);
|
|
Packit Service |
9402ce |
if (ret < 1 || default_log_level < 0 || default_log_level > 2)
|
|
Packit Service |
9402ce |
default_log_level = 2;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
#endif
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
void va_errorMessage(VADisplay dpy, const char *msg, ...)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
#if ENABLE_VA_MESSAGING
|
|
Packit Service |
9402ce |
VADisplayContextP dctx = (VADisplayContextP)dpy;
|
|
Packit Service |
9402ce |
char buf[512], *dynbuf;
|
|
Packit Service |
9402ce |
va_list args;
|
|
Packit Service |
9402ce |
int n, len;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (dctx->error_callback == NULL)
|
|
Packit Service |
9402ce |
return;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_start(args, msg);
|
|
Packit Service |
9402ce |
len = vsnprintf(buf, sizeof(buf), msg, args);
|
|
Packit Service |
9402ce |
va_end(args);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (len >= (int)sizeof(buf)) {
|
|
Packit Service |
9402ce |
dynbuf = malloc(len + 1);
|
|
Packit Service |
9402ce |
if (!dynbuf)
|
|
Packit Service |
9402ce |
return;
|
|
Packit Service |
9402ce |
va_start(args, msg);
|
|
Packit Service |
9402ce |
n = vsnprintf(dynbuf, len + 1, msg, args);
|
|
Packit Service |
9402ce |
va_end(args);
|
|
Packit Service |
9402ce |
if (n == len)
|
|
Packit Service |
9402ce |
dctx->error_callback(dctx->error_callback_user_context, dynbuf);
|
|
Packit Service |
9402ce |
free(dynbuf);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
else if (len > 0)
|
|
Packit Service |
9402ce |
dctx->error_callback(dctx->error_callback_user_context, buf);
|
|
Packit Service |
9402ce |
#endif
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
void va_infoMessage(VADisplay dpy, const char *msg, ...)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
#if ENABLE_VA_MESSAGING
|
|
Packit Service |
9402ce |
VADisplayContextP dctx = (VADisplayContextP)dpy;
|
|
Packit Service |
9402ce |
char buf[512], *dynbuf;
|
|
Packit Service |
9402ce |
va_list args;
|
|
Packit Service |
9402ce |
int n, len;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (dctx->info_callback == NULL)
|
|
Packit Service |
9402ce |
return;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_start(args, msg);
|
|
Packit Service |
9402ce |
len = vsnprintf(buf, sizeof(buf), msg, args);
|
|
Packit Service |
9402ce |
va_end(args);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (len >= (int)sizeof(buf)) {
|
|
Packit Service |
9402ce |
dynbuf = malloc(len + 1);
|
|
Packit Service |
9402ce |
if (!dynbuf)
|
|
Packit Service |
9402ce |
return;
|
|
Packit Service |
9402ce |
va_start(args, msg);
|
|
Packit Service |
9402ce |
n = vsnprintf(dynbuf, len + 1, msg, args);
|
|
Packit Service |
9402ce |
va_end(args);
|
|
Packit Service |
9402ce |
if (n == len)
|
|
Packit Service |
9402ce |
dctx->info_callback(dctx->info_callback_user_context, dynbuf);
|
|
Packit Service |
9402ce |
free(dynbuf);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
else if (len > 0)
|
|
Packit Service |
9402ce |
dctx->info_callback(dctx->info_callback_user_context, buf);
|
|
Packit Service |
9402ce |
#endif
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
static void va_driverErrorCallback(VADriverContextP ctx,
|
|
Packit Service |
9402ce |
const char *message)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADisplayContextP dctx = ctx->pDisplayContext;
|
|
Packit Service |
9402ce |
if (!dctx)
|
|
Packit Service |
9402ce |
return;
|
|
Packit Service |
9402ce |
dctx->error_callback(dctx->error_callback_user_context, message);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
static void va_driverInfoCallback(VADriverContextP ctx,
|
|
Packit Service |
9402ce |
const char *message)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADisplayContextP dctx = ctx->pDisplayContext;
|
|
Packit Service |
9402ce |
if (!dctx)
|
|
Packit Service |
9402ce |
return;
|
|
Packit Service |
9402ce |
dctx->info_callback(dctx->info_callback_user_context, message);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VADisplayContextP va_newDisplayContext(void)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADisplayContextP dctx = calloc(1, sizeof(*dctx));
|
|
Packit Service |
9402ce |
if (!dctx)
|
|
Packit Service |
9402ce |
return NULL;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
dctx->vadpy_magic = VA_DISPLAY_MAGIC;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
dctx->error_callback = default_log_error;
|
|
Packit Service |
9402ce |
dctx->info_callback = default_log_info;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return dctx;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VADriverContextP va_newDriverContext(VADisplayContextP dctx)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx = calloc(1, sizeof(*ctx));
|
|
Packit Service |
9402ce |
if (!ctx)
|
|
Packit Service |
9402ce |
return NULL;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
dctx->pDriverContext = ctx;
|
|
Packit Service |
9402ce |
ctx->pDisplayContext = dctx;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
ctx->error_callback = va_driverErrorCallback;
|
|
Packit Service |
9402ce |
ctx->info_callback = va_driverInfoCallback;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return ctx;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
static bool va_checkVtable(VADisplay dpy, void *ptr, char *function)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
if (!ptr) {
|
|
Packit Service |
9402ce |
va_errorMessage(dpy, "No valid vtable entry for va%s\n", function);
|
|
Packit Service |
9402ce |
return false;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
return true;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
static bool va_checkMaximum(VADisplay dpy, int value, char *variable)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
if (!value) {
|
|
Packit Service |
9402ce |
va_errorMessage(dpy, "Failed to define max_%s in init\n", variable);
|
|
Packit Service |
9402ce |
return false;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
return true;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
static bool va_checkString(VADisplay dpy, const char* value, char *variable)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
if (!value) {
|
|
Packit Service |
9402ce |
va_errorMessage(dpy, "Failed to define str_%s in init\n", variable);
|
|
Packit Service |
9402ce |
return false;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
return true;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
static inline int
|
|
Packit Service |
9402ce |
va_getDriverInitName(char *name, int namelen, int major, int minor)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
int ret = snprintf(name, namelen, "__vaDriverInit_%d_%d", major, minor);
|
|
Packit Service |
9402ce |
return ret > 0 && ret < namelen;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
static VAStatus va_getDriverName(VADisplay dpy, char **driver_name)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return pDisplayContext->vaGetDriverName(pDisplayContext, driver_name);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
static char *va_getDriverPath(const char *driver_dir, const char *driver_name)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
int n = snprintf(0, 0, "%s/%s%s", driver_dir, driver_name, DRIVER_EXTENSION);
|
|
Packit Service |
9402ce |
if (n < 0)
|
|
Packit Service |
9402ce |
return NULL;
|
|
Packit Service |
9402ce |
char *driver_path = (char *) malloc(n + 1);
|
|
Packit Service |
9402ce |
if (!driver_path)
|
|
Packit Service |
9402ce |
return NULL;
|
|
Packit Service |
9402ce |
n = snprintf(driver_path, n + 1, "%s/%s%s",
|
|
Packit Service |
9402ce |
driver_dir, driver_name, DRIVER_EXTENSION);
|
|
Packit Service |
9402ce |
if (n < 0) {
|
|
Packit Service |
9402ce |
free(driver_path);
|
|
Packit Service |
9402ce |
return NULL;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
return driver_path;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
static VAStatus va_openDriver(VADisplay dpy, char *driver_name)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN;
|
|
Packit Service |
9402ce |
char *search_path = NULL;
|
|
Packit Service |
9402ce |
char *saveptr;
|
|
Packit Service |
9402ce |
char *driver_dir;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (geteuid() == getuid())
|
|
Packit Service |
9402ce |
/* don't allow setuid apps to use LIBVA_DRIVERS_PATH */
|
|
Packit Service |
9402ce |
search_path = getenv("LIBVA_DRIVERS_PATH");
|
|
Packit Service |
9402ce |
if (!search_path)
|
|
Packit Service |
9402ce |
search_path = VA_DRIVERS_PATH;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
search_path = strdup((const char *)search_path);
|
|
Packit Service |
9402ce |
if (!search_path) {
|
|
Packit Service |
9402ce |
va_errorMessage(dpy, "%s L%d Out of memory\n",
|
|
Packit Service |
9402ce |
__FUNCTION__, __LINE__);
|
|
Packit Service |
9402ce |
return VA_STATUS_ERROR_ALLOCATION_FAILED;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
driver_dir = strtok_r(search_path, ":", &saveptr);
|
|
Packit Service |
9402ce |
while (driver_dir) {
|
|
Packit Service |
9402ce |
void *handle = NULL;
|
|
Packit Service |
9402ce |
char *driver_path = va_getDriverPath(driver_dir, driver_name);
|
|
Packit Service |
9402ce |
if (!driver_path) {
|
|
Packit Service |
9402ce |
va_errorMessage(dpy, "%s L%d Out of memory\n",
|
|
Packit Service |
9402ce |
__FUNCTION__, __LINE__);
|
|
Packit Service |
9402ce |
free(search_path);
|
|
Packit Service |
9402ce |
return VA_STATUS_ERROR_ALLOCATION_FAILED;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_infoMessage(dpy, "Trying to open %s\n", driver_path);
|
|
Packit Service |
9402ce |
#ifndef ANDROID
|
|
Packit Service |
9402ce |
handle = dlopen( driver_path, RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE );
|
|
Packit Service |
9402ce |
#else
|
|
Packit Service |
9402ce |
handle = dlopen( driver_path, RTLD_NOW| RTLD_GLOBAL);
|
|
Packit Service |
9402ce |
#endif
|
|
Packit Service |
9402ce |
if (!handle) {
|
|
Packit Service |
9402ce |
/* Don't give errors for non-existing files */
|
|
Packit Service |
9402ce |
if (0 == access( driver_path, F_OK))
|
|
Packit Service |
9402ce |
va_errorMessage(dpy, "dlopen of %s failed: %s\n", driver_path, dlerror());
|
|
Packit Service |
9402ce |
} else {
|
|
Packit Service |
9402ce |
VADriverInit init_func = NULL;
|
|
Packit Service |
9402ce |
char init_func_s[256];
|
|
Packit Service |
9402ce |
int i;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
static const struct {
|
|
Packit Service |
9402ce |
int major;
|
|
Packit Service |
9402ce |
int minor;
|
|
Packit Service |
9402ce |
} compatible_versions[] = {
|
|
Packit Service |
9402ce |
{ VA_MAJOR_VERSION, VA_MINOR_VERSION },
|
|
Packit Service |
9402ce |
{ VA_MAJOR_VERSION, 4 },
|
|
Packit Service |
9402ce |
{ VA_MAJOR_VERSION, 3 },
|
|
Packit Service |
9402ce |
{ VA_MAJOR_VERSION, 2 },
|
|
Packit Service |
9402ce |
{ VA_MAJOR_VERSION, 1 },
|
|
Packit Service |
9402ce |
{ VA_MAJOR_VERSION, 0 },
|
|
Packit Service |
9402ce |
{ -1, -1}
|
|
Packit Service |
9402ce |
};
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
for (i = 0; compatible_versions[i].major >= 0; i++) {
|
|
Packit Service |
9402ce |
if (va_getDriverInitName(init_func_s, sizeof(init_func_s),
|
|
Packit Service |
9402ce |
compatible_versions[i].major,
|
|
Packit Service |
9402ce |
compatible_versions[i].minor)) {
|
|
Packit Service |
9402ce |
init_func = (VADriverInit)dlsym(handle, init_func_s);
|
|
Packit Service |
9402ce |
if (init_func) {
|
|
Packit Service |
9402ce |
va_infoMessage(dpy, "Found init function %s\n", init_func_s);
|
|
Packit Service |
9402ce |
break;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (compatible_versions[i].major < 0) {
|
|
Packit Service |
9402ce |
va_errorMessage(dpy, "%s has no function %s\n",
|
|
Packit Service |
9402ce |
driver_path, init_func_s);
|
|
Packit Service |
9402ce |
dlclose(handle);
|
|
Packit Service |
9402ce |
} else {
|
|
Packit Service |
9402ce |
struct VADriverVTable *vtable = ctx->vtable;
|
|
Packit Service |
9402ce |
struct VADriverVTableVPP *vtable_vpp = ctx->vtable_vpp;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
if (!vtable) {
|
|
Packit Service |
9402ce |
vtable = calloc(1, sizeof(*vtable));
|
|
Packit Service |
9402ce |
if (!vtable)
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
ctx->vtable = vtable;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (!vtable_vpp) {
|
|
Packit Service |
9402ce |
vtable_vpp = calloc(1, sizeof(*vtable_vpp));
|
|
Packit Service |
9402ce |
if (vtable_vpp)
|
|
Packit Service |
9402ce |
vtable_vpp->version = VA_DRIVER_VTABLE_VPP_VERSION;
|
|
Packit Service |
9402ce |
else
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
ctx->vtable_vpp = vtable_vpp;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (init_func && VA_STATUS_SUCCESS == vaStatus)
|
|
Packit Service |
9402ce |
vaStatus = (*init_func)(ctx);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (VA_STATUS_SUCCESS == vaStatus) {
|
|
Packit Service |
9402ce |
CHECK_MAXIMUM(vaStatus, ctx, profiles);
|
|
Packit Service |
9402ce |
CHECK_MAXIMUM(vaStatus, ctx, entrypoints);
|
|
Packit Service |
9402ce |
CHECK_MAXIMUM(vaStatus, ctx, attributes);
|
|
Packit Service |
9402ce |
CHECK_MAXIMUM(vaStatus, ctx, image_formats);
|
|
Packit Service |
9402ce |
CHECK_MAXIMUM(vaStatus, ctx, subpic_formats);
|
|
Packit Service |
9402ce |
CHECK_STRING(vaStatus, ctx, vendor);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, Terminate);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, QueryConfigProfiles);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, QueryConfigEntrypoints);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, QueryConfigAttributes);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, CreateConfig);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, DestroyConfig);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, GetConfigAttributes);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, CreateSurfaces);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, DestroySurfaces);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, CreateContext);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, DestroyContext);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, CreateBuffer);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, BufferSetNumElements);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, MapBuffer);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, UnmapBuffer);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, DestroyBuffer);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, BeginPicture);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, RenderPicture);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, EndPicture);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, SyncSurface);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, QuerySurfaceStatus);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, PutSurface);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, QueryImageFormats);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, CreateImage);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, DeriveImage);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, DestroyImage);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, SetImagePalette);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, GetImage);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, PutImage);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, QuerySubpictureFormats);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, CreateSubpicture);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, DestroySubpicture);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, SetSubpictureImage);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, SetSubpictureChromakey);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, SetSubpictureGlobalAlpha);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, AssociateSubpicture);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, DeassociateSubpicture);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, QueryDisplayAttributes);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, GetDisplayAttributes);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, SetDisplayAttributes);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
if (VA_STATUS_SUCCESS != vaStatus) {
|
|
Packit Service |
9402ce |
va_errorMessage(dpy, "%s init failed\n", driver_path);
|
|
Packit Service |
9402ce |
dlclose(handle);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
if (VA_STATUS_SUCCESS == vaStatus)
|
|
Packit Service |
9402ce |
ctx->handle = handle;
|
|
Packit Service |
9402ce |
free(driver_path);
|
|
Packit Service |
9402ce |
break;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
free(driver_path);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
driver_dir = strtok_r(NULL, ":", &saveptr);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
free(search_path);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAPrivFunc vaGetLibFunc(VADisplay dpy, const char *func)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
if (!vaDisplayIsValid(dpy))
|
|
Packit Service |
9402ce |
return NULL;
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (NULL == ctx->handle)
|
|
Packit Service |
9402ce |
return NULL;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return (VAPrivFunc) dlsym(ctx->handle, func);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* Returns a short english description of error_status
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
const char *vaErrorStr(VAStatus error_status)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
switch(error_status) {
|
|
Packit Service |
9402ce |
case VA_STATUS_SUCCESS:
|
|
Packit Service |
9402ce |
return "success (no error)";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_OPERATION_FAILED:
|
|
Packit Service |
9402ce |
return "operation failed";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_ALLOCATION_FAILED:
|
|
Packit Service |
9402ce |
return "resource allocation failed";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_INVALID_DISPLAY:
|
|
Packit Service |
9402ce |
return "invalid VADisplay";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_INVALID_CONFIG:
|
|
Packit Service |
9402ce |
return "invalid VAConfigID";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_INVALID_CONTEXT:
|
|
Packit Service |
9402ce |
return "invalid VAContextID";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_INVALID_SURFACE:
|
|
Packit Service |
9402ce |
return "invalid VASurfaceID";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_INVALID_BUFFER:
|
|
Packit Service |
9402ce |
return "invalid VABufferID";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_INVALID_IMAGE:
|
|
Packit Service |
9402ce |
return "invalid VAImageID";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_INVALID_SUBPICTURE:
|
|
Packit Service |
9402ce |
return "invalid VASubpictureID";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_ATTR_NOT_SUPPORTED:
|
|
Packit Service |
9402ce |
return "attribute not supported";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_MAX_NUM_EXCEEDED:
|
|
Packit Service |
9402ce |
return "list argument exceeds maximum number";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_UNSUPPORTED_PROFILE:
|
|
Packit Service |
9402ce |
return "the requested VAProfile is not supported";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT:
|
|
Packit Service |
9402ce |
return "the requested VAEntryPoint is not supported";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT:
|
|
Packit Service |
9402ce |
return "the requested RT Format is not supported";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE:
|
|
Packit Service |
9402ce |
return "the requested VABufferType is not supported";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_SURFACE_BUSY:
|
|
Packit Service |
9402ce |
return "surface is in use";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_FLAG_NOT_SUPPORTED:
|
|
Packit Service |
9402ce |
return "flag not supported";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_INVALID_PARAMETER:
|
|
Packit Service |
9402ce |
return "invalid parameter";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED:
|
|
Packit Service |
9402ce |
return "resolution not supported";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_UNIMPLEMENTED:
|
|
Packit Service |
9402ce |
return "the requested function is not implemented";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_SURFACE_IN_DISPLAYING:
|
|
Packit Service |
9402ce |
return "surface is in displaying (may by overlay)" ;
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_INVALID_IMAGE_FORMAT:
|
|
Packit Service |
9402ce |
return "invalid VAImageFormat";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_DECODING_ERROR:
|
|
Packit Service |
9402ce |
return "internal decoding error";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_ENCODING_ERROR:
|
|
Packit Service |
9402ce |
return "internal encoding error";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_INVALID_VALUE:
|
|
Packit Service |
9402ce |
return "an invalid/unsupported value was supplied";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_UNSUPPORTED_FILTER:
|
|
Packit Service |
9402ce |
return "the requested filter is not supported";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_INVALID_FILTER_CHAIN:
|
|
Packit Service |
9402ce |
return "an invalid filter chain was supplied";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_HW_BUSY:
|
|
Packit Service |
9402ce |
return "HW busy now";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE:
|
|
Packit Service |
9402ce |
return "an unsupported memory type was supplied";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_NOT_ENOUGH_BUFFER:
|
|
Packit Service |
9402ce |
return "allocated memory size is not enough for input or output";
|
|
Packit Service |
9402ce |
case VA_STATUS_ERROR_UNKNOWN:
|
|
Packit Service |
9402ce |
return "unknown libva error";
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
return "unknown libva error / description missing";
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaSetDriverName(
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
char *driver_name
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
char *override_driver_name = NULL;
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (strlen(driver_name) == 0 || strlen(driver_name) >=256) {
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
|
|
Packit Service |
9402ce |
va_errorMessage(dpy, "vaSetDriverName returns %s\n",
|
|
Packit Service |
9402ce |
vaErrorStr(vaStatus));
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
override_driver_name = strdup(driver_name);
|
|
Packit Service |
9402ce |
if (!override_driver_name) {
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
|
|
Packit Service |
9402ce |
va_errorMessage(dpy, "vaSetDriverName returns %s. Out of Memory\n",
|
|
Packit Service |
9402ce |
vaErrorStr(vaStatus));
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
ctx->override_driver_name = override_driver_name;
|
|
Packit Service |
9402ce |
return VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaInitialize (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
int *major_version, /* out */
|
|
Packit Service |
9402ce |
int *minor_version /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
const char *driver_name_env = NULL;
|
|
Packit Service |
9402ce |
char *driver_name = NULL;
|
|
Packit Service |
9402ce |
VAStatus vaStatus;
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_TraceInit(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_FoolInit(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_MessagingInit();
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_infoMessage(dpy, "VA-API version %s\n", VA_VERSION_S);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = va_getDriverName(dpy, &driver_name);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (!ctx->override_driver_name) {
|
|
Packit Service |
9402ce |
va_infoMessage(dpy, "va_getDriverName() returns %d\n", vaStatus);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
driver_name_env = getenv("LIBVA_DRIVER_NAME");
|
|
Packit Service |
9402ce |
} else if (vaStatus == VA_STATUS_SUCCESS) {
|
|
Packit Service |
9402ce |
if (driver_name)
|
|
Packit Service |
9402ce |
free(driver_name);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
driver_name = strdup(ctx->override_driver_name);
|
|
Packit Service |
9402ce |
if (!driver_name) {
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
|
|
Packit Service |
9402ce |
va_errorMessage(dpy, "vaInitialize() failed with %s, out of memory\n",
|
|
Packit Service |
9402ce |
vaErrorStr(vaStatus));
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (driver_name_env && (geteuid() == getuid())) {
|
|
Packit Service |
9402ce |
/* Don't allow setuid apps to use LIBVA_DRIVER_NAME */
|
|
Packit Service |
9402ce |
if (driver_name) /* memory is allocated in va_getDriverName */
|
|
Packit Service |
9402ce |
free(driver_name);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
driver_name = strdup(driver_name_env);
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if ((VA_STATUS_SUCCESS == vaStatus) && (driver_name != NULL)) {
|
|
Packit Service |
9402ce |
vaStatus = va_openDriver(dpy, driver_name);
|
|
Packit Service |
9402ce |
va_infoMessage(dpy, "va_openDriver() returns %d\n", vaStatus);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
*major_version = VA_MAJOR_VERSION;
|
|
Packit Service |
9402ce |
*minor_version = VA_MINOR_VERSION;
|
|
Packit Service |
9402ce |
} else
|
|
Packit Service |
9402ce |
va_errorMessage(dpy, "va_getDriverName() failed with %s,driver_name=%s\n",
|
|
Packit Service |
9402ce |
vaErrorStr(vaStatus), driver_name);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (driver_name)
|
|
Packit Service |
9402ce |
free(driver_name);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceInitialize, dpy, major_version, minor_version);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* After this call, all library internal resources will be cleaned up
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaTerminate (
|
|
Packit Service |
9402ce |
VADisplay dpy
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
|
|
Packit Service |
9402ce |
VADriverContextP old_ctx;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
old_ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (old_ctx->handle) {
|
|
Packit Service |
9402ce |
vaStatus = old_ctx->vtable->vaTerminate(old_ctx);
|
|
Packit Service |
9402ce |
dlclose(old_ctx->handle);
|
|
Packit Service |
9402ce |
old_ctx->handle = NULL;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
free(old_ctx->vtable);
|
|
Packit Service |
9402ce |
old_ctx->vtable = NULL;
|
|
Packit Service |
9402ce |
free(old_ctx->vtable_vpp);
|
|
Packit Service |
9402ce |
old_ctx->vtable_vpp = NULL;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (old_ctx->override_driver_name) {
|
|
Packit Service |
9402ce |
free(old_ctx->override_driver_name);
|
|
Packit Service |
9402ce |
old_ctx->override_driver_name = NULL;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceTerminate, dpy);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_TraceEnd(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_FoolEnd(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (VA_STATUS_SUCCESS == vaStatus)
|
|
Packit Service |
9402ce |
pDisplayContext->vaDestroy(pDisplayContext);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* vaQueryVendorString returns a pointer to a zero-terminated string
|
|
Packit Service |
9402ce |
* describing some aspects of the VA implemenation on a specific
|
|
Packit Service |
9402ce |
* hardware accelerator. The format of the returned string is:
|
|
Packit Service |
9402ce |
* <vendorname>-<major_version>-<minor_version>-<addtional_info>
|
|
Packit Service |
9402ce |
* e.g. for the Intel GMA500 implementation, an example would be:
|
|
Packit Service |
9402ce |
* "IntelGMA500-1.0-0.2-patch3
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
const char *vaQueryVendorString (
|
|
Packit Service |
9402ce |
VADisplay dpy
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
if (!vaDisplayIsValid(dpy))
|
|
Packit Service |
9402ce |
return NULL;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return CTX(dpy)->str_vendor;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* Get maximum number of profiles supported by the implementation */
|
|
Packit Service |
9402ce |
int vaMaxNumProfiles (
|
|
Packit Service |
9402ce |
VADisplay dpy
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
if (!vaDisplayIsValid(dpy))
|
|
Packit Service |
9402ce |
return 0;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return CTX(dpy)->max_profiles;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* Get maximum number of entrypoints supported by the implementation */
|
|
Packit Service |
9402ce |
int vaMaxNumEntrypoints (
|
|
Packit Service |
9402ce |
VADisplay dpy
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
if (!vaDisplayIsValid(dpy))
|
|
Packit Service |
9402ce |
return 0;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return CTX(dpy)->max_entrypoints;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* Get maximum number of attributs supported by the implementation */
|
|
Packit Service |
9402ce |
int vaMaxNumConfigAttributes (
|
|
Packit Service |
9402ce |
VADisplay dpy
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
if (!vaDisplayIsValid(dpy))
|
|
Packit Service |
9402ce |
return 0;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return CTX(dpy)->max_attributes;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaQueryConfigEntrypoints (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAProfile profile,
|
|
Packit Service |
9402ce |
VAEntrypoint *entrypoints, /* out */
|
|
Packit Service |
9402ce |
int *num_entrypoints /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaQueryConfigEntrypoints ( ctx, profile, entrypoints, num_entrypoints);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaGetConfigAttributes (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAProfile profile,
|
|
Packit Service |
9402ce |
VAEntrypoint entrypoint,
|
|
Packit Service |
9402ce |
VAConfigAttrib *attrib_list, /* in/out */
|
|
Packit Service |
9402ce |
int num_attribs
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaGetConfigAttributes ( ctx, profile, entrypoint, attrib_list, num_attribs );
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaQueryConfigProfiles (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAProfile *profile_list, /* out */
|
|
Packit Service |
9402ce |
int *num_profiles /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaQueryConfigProfiles ( ctx, profile_list, num_profiles );
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaCreateConfig (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAProfile profile,
|
|
Packit Service |
9402ce |
VAEntrypoint entrypoint,
|
|
Packit Service |
9402ce |
VAConfigAttrib *attrib_list,
|
|
Packit Service |
9402ce |
int num_attribs,
|
|
Packit Service |
9402ce |
VAConfigID *config_id /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaCreateConfig ( ctx, profile, entrypoint, attrib_list, num_attribs, config_id );
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* record the current entrypoint for further trace/fool determination */
|
|
Packit Service |
9402ce |
VA_TRACE_ALL(va_TraceCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
|
|
Packit Service |
9402ce |
VA_FOOL_FUNC(va_FoolCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaDestroyConfig (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAConfigID config_id
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaDestroyConfig ( ctx, config_id );
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_ALL(va_TraceDestroyConfig, dpy, config_id);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaQueryConfigAttributes (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAConfigID config_id,
|
|
Packit Service |
9402ce |
VAProfile *profile, /* out */
|
|
Packit Service |
9402ce |
VAEntrypoint *entrypoint, /* out */
|
|
Packit Service |
9402ce |
VAConfigAttrib *attrib_list,/* out */
|
|
Packit Service |
9402ce |
int *num_attribs /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaQueryConfigAttributes( ctx, config_id, profile, entrypoint, attrib_list, num_attribs);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaQueryProcessingRate (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAConfigID config_id,
|
|
Packit Service |
9402ce |
VAProcessingRateParameter *proc_buf,
|
|
Packit Service |
9402ce |
unsigned int *processing_rate /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
if(!ctx->vtable->vaQueryProcessingRate)
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
|
|
Packit Service |
9402ce |
else
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaQueryProcessingRate( ctx, config_id, proc_buf, processing_rate);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* XXX: this is a slow implementation that will be removed */
|
|
Packit Service |
9402ce |
static VAStatus
|
|
Packit Service |
9402ce |
va_impl_query_surface_attributes(
|
|
Packit Service |
9402ce |
VADriverContextP ctx,
|
|
Packit Service |
9402ce |
VAConfigID config,
|
|
Packit Service |
9402ce |
VASurfaceAttrib *out_attribs,
|
|
Packit Service |
9402ce |
unsigned int *out_num_attribs_ptr
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VASurfaceAttrib *attribs = NULL;
|
|
Packit Service |
9402ce |
unsigned int num_attribs, n;
|
|
Packit Service |
9402ce |
VASurfaceAttrib *out_attrib;
|
|
Packit Service |
9402ce |
unsigned int out_num_attribs;
|
|
Packit Service |
9402ce |
VAImageFormat *image_formats = NULL;
|
|
Packit Service |
9402ce |
int num_image_formats, i;
|
|
Packit Service |
9402ce |
VAStatus va_status;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* List of surface attributes to query */
|
|
Packit Service |
9402ce |
struct va_surface_attrib_map {
|
|
Packit Service |
9402ce |
VASurfaceAttribType type;
|
|
Packit Service |
9402ce |
VAGenericValueType value_type;
|
|
Packit Service |
9402ce |
};
|
|
Packit Service |
9402ce |
static const struct va_surface_attrib_map attribs_map[] = {
|
|
Packit Service |
9402ce |
{ VASurfaceAttribMinWidth, VAGenericValueTypeInteger },
|
|
Packit Service |
9402ce |
{ VASurfaceAttribMaxWidth, VAGenericValueTypeInteger },
|
|
Packit Service |
9402ce |
{ VASurfaceAttribMinHeight, VAGenericValueTypeInteger },
|
|
Packit Service |
9402ce |
{ VASurfaceAttribMaxHeight, VAGenericValueTypeInteger },
|
|
Packit Service |
9402ce |
{ VASurfaceAttribMemoryType, VAGenericValueTypeInteger },
|
|
Packit Service |
9402ce |
{ VASurfaceAttribNone, VAGenericValueTypeInteger }
|
|
Packit Service |
9402ce |
};
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (!out_attribs || !out_num_attribs_ptr)
|
|
Packit Service |
9402ce |
return VA_STATUS_ERROR_INVALID_PARAMETER;
|
|
Packit Service |
9402ce |
if (!ctx->vtable->vaGetSurfaceAttributes)
|
|
Packit Service |
9402ce |
return VA_STATUS_ERROR_UNIMPLEMENTED;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
num_image_formats = ctx->max_image_formats;
|
|
Packit Service |
9402ce |
image_formats = malloc(num_image_formats * sizeof(*image_formats));
|
|
Packit Service |
9402ce |
if (!image_formats) {
|
|
Packit Service |
9402ce |
va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
|
|
Packit Service |
9402ce |
goto end;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaQueryImageFormats(
|
|
Packit Service |
9402ce |
ctx, image_formats, &num_image_formats);
|
|
Packit Service |
9402ce |
if (va_status != VA_STATUS_SUCCESS)
|
|
Packit Service |
9402ce |
goto end;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
num_attribs = VASurfaceAttribCount + num_image_formats;
|
|
Packit Service |
9402ce |
attribs = malloc(num_attribs * sizeof(*attribs));
|
|
Packit Service |
9402ce |
if (!attribs) {
|
|
Packit Service |
9402ce |
va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
|
|
Packit Service |
9402ce |
goto end;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* Initialize with base surface attributes, except pixel-formats */
|
|
Packit Service |
9402ce |
for (n = 0; attribs_map[n].type != VASurfaceAttribNone; n++) {
|
|
Packit Service |
9402ce |
VASurfaceAttrib * const attrib = &attribs[n];
|
|
Packit Service |
9402ce |
attrib->type = attribs_map[n].type;
|
|
Packit Service |
9402ce |
attrib->flags = VA_SURFACE_ATTRIB_GETTABLE;
|
|
Packit Service |
9402ce |
attrib->value.type = attribs_map[n].value_type;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* Append image formats */
|
|
Packit Service |
9402ce |
for (i = 0; i < num_image_formats; i++) {
|
|
Packit Service |
9402ce |
VASurfaceAttrib * const attrib = &attribs[n];
|
|
Packit Service |
9402ce |
attrib->type = VASurfaceAttribPixelFormat;
|
|
Packit Service |
9402ce |
attrib->flags = VA_SURFACE_ATTRIB_GETTABLE|VA_SURFACE_ATTRIB_SETTABLE;
|
|
Packit Service |
9402ce |
attrib->value.type = VAGenericValueTypeInteger;
|
|
Packit Service |
9402ce |
attrib->value.value.i = image_formats[i].fourcc;
|
|
Packit Service |
9402ce |
if (++n == num_attribs) {
|
|
Packit Service |
9402ce |
va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
|
|
Packit Service |
9402ce |
goto end;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
num_attribs = n;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaGetSurfaceAttributes(
|
|
Packit Service |
9402ce |
ctx, config, attribs, num_attribs);
|
|
Packit Service |
9402ce |
if (va_status != VA_STATUS_SUCCESS)
|
|
Packit Service |
9402ce |
goto end;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* Remove invalid entries */
|
|
Packit Service |
9402ce |
out_num_attribs = 0;
|
|
Packit Service |
9402ce |
for (n = 0; n < num_attribs; n++) {
|
|
Packit Service |
9402ce |
VASurfaceAttrib * const attrib = &attribs[n];
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
|
|
Packit Service |
9402ce |
continue;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
// Accept all surface attributes that are not pixel-formats
|
|
Packit Service |
9402ce |
if (attrib->type != VASurfaceAttribPixelFormat) {
|
|
Packit Service |
9402ce |
out_num_attribs++;
|
|
Packit Service |
9402ce |
continue;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
// Drop invalid pixel-format attribute
|
|
Packit Service |
9402ce |
if (!attrib->value.value.i) {
|
|
Packit Service |
9402ce |
attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
|
|
Packit Service |
9402ce |
continue;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
// Check for duplicates
|
|
Packit Service |
9402ce |
int is_duplicate = 0;
|
|
Packit Service |
9402ce |
for (i = n - 1; i >= 0 && !is_duplicate; i--) {
|
|
Packit Service |
9402ce |
const VASurfaceAttrib * const prev_attrib = &attribs[i];
|
|
Packit Service |
9402ce |
if (prev_attrib->type != VASurfaceAttribPixelFormat)
|
|
Packit Service |
9402ce |
break;
|
|
Packit Service |
9402ce |
is_duplicate = prev_attrib->value.value.i == attrib->value.value.i;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
if (is_duplicate)
|
|
Packit Service |
9402ce |
attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
|
|
Packit Service |
9402ce |
else
|
|
Packit Service |
9402ce |
out_num_attribs++;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (*out_num_attribs_ptr < out_num_attribs) {
|
|
Packit Service |
9402ce |
*out_num_attribs_ptr = out_num_attribs;
|
|
Packit Service |
9402ce |
va_status = VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
|
|
Packit Service |
9402ce |
goto end;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
out_attrib = out_attribs;
|
|
Packit Service |
9402ce |
for (n = 0; n < num_attribs; n++) {
|
|
Packit Service |
9402ce |
const VASurfaceAttrib * const attrib = &attribs[n];
|
|
Packit Service |
9402ce |
if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
|
|
Packit Service |
9402ce |
continue;
|
|
Packit Service |
9402ce |
*out_attrib++ = *attrib;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
end:
|
|
Packit Service |
9402ce |
free(attribs);
|
|
Packit Service |
9402ce |
free(image_formats);
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus
|
|
Packit Service |
9402ce |
vaQuerySurfaceAttributes(
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAConfigID config,
|
|
Packit Service |
9402ce |
VASurfaceAttrib *attrib_list,
|
|
Packit Service |
9402ce |
unsigned int *num_attribs
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
if (!ctx)
|
|
Packit Service |
9402ce |
return VA_STATUS_ERROR_INVALID_DISPLAY;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (!ctx->vtable->vaQuerySurfaceAttributes)
|
|
Packit Service |
9402ce |
vaStatus = va_impl_query_surface_attributes(ctx, config,
|
|
Packit Service |
9402ce |
attrib_list, num_attribs);
|
|
Packit Service |
9402ce |
else
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaQuerySurfaceAttributes(ctx, config,
|
|
Packit Service |
9402ce |
attrib_list, num_attribs);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceQuerySurfaceAttributes, dpy, config, attrib_list, num_attribs);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus
|
|
Packit Service |
9402ce |
vaCreateSurfaces(
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
unsigned int format,
|
|
Packit Service |
9402ce |
unsigned int width,
|
|
Packit Service |
9402ce |
unsigned int height,
|
|
Packit Service |
9402ce |
VASurfaceID *surfaces,
|
|
Packit Service |
9402ce |
unsigned int num_surfaces,
|
|
Packit Service |
9402ce |
VASurfaceAttrib *attrib_list,
|
|
Packit Service |
9402ce |
unsigned int num_attribs
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
if (!ctx)
|
|
Packit Service |
9402ce |
return VA_STATUS_ERROR_INVALID_DISPLAY;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (ctx->vtable->vaCreateSurfaces2)
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaCreateSurfaces2(ctx, format, width, height,
|
|
Packit Service |
9402ce |
surfaces, num_surfaces,
|
|
Packit Service |
9402ce |
attrib_list, num_attribs);
|
|
Packit Service |
9402ce |
else if (attrib_list && num_attribs > 0)
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
|
|
Packit Service |
9402ce |
else
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaCreateSurfaces(ctx, width, height, format,
|
|
Packit Service |
9402ce |
num_surfaces, surfaces);
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceCreateSurfaces,
|
|
Packit Service |
9402ce |
dpy, width, height, format, num_surfaces, surfaces,
|
|
Packit Service |
9402ce |
attrib_list, num_attribs);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaDestroySurfaces (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VASurfaceID *surface_list,
|
|
Packit Service |
9402ce |
int num_surfaces
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceDestroySurfaces,
|
|
Packit Service |
9402ce |
dpy, surface_list, num_surfaces);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaDestroySurfaces( ctx, surface_list, num_surfaces );
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaCreateContext (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAConfigID config_id,
|
|
Packit Service |
9402ce |
int picture_width,
|
|
Packit Service |
9402ce |
int picture_height,
|
|
Packit Service |
9402ce |
int flag,
|
|
Packit Service |
9402ce |
VASurfaceID *render_targets,
|
|
Packit Service |
9402ce |
int num_render_targets,
|
|
Packit Service |
9402ce |
VAContextID *context /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaCreateContext( ctx, config_id, picture_width, picture_height,
|
|
Packit Service |
9402ce |
flag, render_targets, num_render_targets, context );
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* keep current encode/decode resoluton */
|
|
Packit Service |
9402ce |
VA_TRACE_ALL(va_TraceCreateContext, dpy, config_id, picture_width, picture_height, flag, render_targets, num_render_targets, context);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaDestroyContext (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAContextID context
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaDestroyContext( ctx, context );
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_ALL(va_TraceDestroyContext, dpy, context);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaCreateMFContext (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAMFContextID *mf_context /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
if(ctx->vtable->vaCreateMFContext == NULL)
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
|
|
Packit Service |
9402ce |
else
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaCreateMFContext( ctx, mf_context);
|
|
Packit Service |
9402ce |
VA_TRACE_ALL(va_TraceCreateMFContext, dpy, mf_context);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaMFAddContext (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAMFContextID mf_context,
|
|
Packit Service |
9402ce |
VAContextID context
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if(ctx->vtable->vaMFAddContext == NULL)
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
|
|
Packit Service |
9402ce |
else
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaMFAddContext( ctx, context, mf_context);
|
|
Packit Service |
9402ce |
VA_TRACE_ALL(va_TraceMFAddContext, dpy, context, mf_context);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaMFReleaseContext (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAMFContextID mf_context,
|
|
Packit Service |
9402ce |
VAContextID context
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
if(ctx->vtable->vaMFReleaseContext == NULL)
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
|
|
Packit Service |
9402ce |
else
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaMFReleaseContext( ctx, context, mf_context);
|
|
Packit Service |
9402ce |
VA_TRACE_ALL(va_TraceMFReleaseContext, dpy, context, mf_context);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaMFSubmit (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAMFContextID mf_context,
|
|
Packit Service |
9402ce |
VAContextID *contexts,
|
|
Packit Service |
9402ce |
int num_contexts
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
CHECK_VTABLE(vaStatus, ctx, MFSubmit);
|
|
Packit Service |
9402ce |
if(ctx->vtable->vaMFSubmit == NULL)
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
|
|
Packit Service |
9402ce |
else
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaMFSubmit( ctx, mf_context, contexts, num_contexts);
|
|
Packit Service |
9402ce |
VA_TRACE_ALL(va_TraceMFSubmit, dpy, mf_context, contexts, num_contexts);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaCreateBuffer (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAContextID context, /* in */
|
|
Packit Service |
9402ce |
VABufferType type, /* in */
|
|
Packit Service |
9402ce |
unsigned int size, /* in */
|
|
Packit Service |
9402ce |
unsigned int num_elements, /* in */
|
|
Packit Service |
9402ce |
void *data, /* in */
|
|
Packit Service |
9402ce |
VABufferID *buf_id /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_FOOL_FUNC(va_FoolCreateBuffer, dpy, context, type, size, num_elements, data, buf_id);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaCreateBuffer( ctx, context, type, size, num_elements, data, buf_id);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceCreateBuffer,
|
|
Packit Service |
9402ce |
dpy, context, type, size, num_elements, data, buf_id);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaCreateBuffer2 (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAContextID context,
|
|
Packit Service |
9402ce |
VABufferType type,
|
|
Packit Service |
9402ce |
unsigned int width,
|
|
Packit Service |
9402ce |
unsigned int height,
|
|
Packit Service |
9402ce |
unsigned int *unit_size,
|
|
Packit Service |
9402ce |
unsigned int *pitch,
|
|
Packit Service |
9402ce |
VABufferID *buf_id
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
if(!ctx->vtable->vaCreateBuffer2)
|
|
Packit Service |
9402ce |
return VA_STATUS_ERROR_UNIMPLEMENTED;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaCreateBuffer2( ctx, context, type, width, height ,unit_size, pitch, buf_id);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceCreateBuffer,
|
|
Packit Service |
9402ce |
dpy, context, type, *pitch, height, NULL, buf_id);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaBufferSetNumElements (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VABufferID buf_id, /* in */
|
|
Packit Service |
9402ce |
unsigned int num_elements /* in */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaBufferSetNumElements( ctx, buf_id, num_elements );
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaMapBuffer (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VABufferID buf_id, /* in */
|
|
Packit Service |
9402ce |
void **pbuf /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus va_status;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_FOOL_FUNC(va_FoolMapBuffer, dpy, buf_id, pbuf);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaMapBuffer( ctx, buf_id, pbuf );
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_ALL(va_TraceMapBuffer, dpy, buf_id, pbuf);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaUnmapBuffer (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VABufferID buf_id /* in */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaUnmapBuffer( ctx, buf_id );
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaDestroyBuffer (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VABufferID buffer_id
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceDestroyBuffer,
|
|
Packit Service |
9402ce |
dpy, buffer_id);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaDestroyBuffer( ctx, buffer_id );
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaBufferInfo (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAContextID context, /* in */
|
|
Packit Service |
9402ce |
VABufferID buf_id, /* in */
|
|
Packit Service |
9402ce |
VABufferType *type, /* out */
|
|
Packit Service |
9402ce |
unsigned int *size, /* out */
|
|
Packit Service |
9402ce |
unsigned int *num_elements /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_FOOL_FUNC(va_FoolBufferInfo, dpy, buf_id, type, size, num_elements);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaBufferInfo( ctx, buf_id, type, size, num_elements );
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* Locks buffer for external API usage */
|
|
Packit Service |
9402ce |
VAStatus
|
|
Packit Service |
9402ce |
vaAcquireBufferHandle(VADisplay dpy, VABufferID buf_id, VABufferInfo *buf_info)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (!ctx->vtable->vaAcquireBufferHandle)
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
|
|
Packit Service |
9402ce |
else
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaAcquireBufferHandle(ctx, buf_id, buf_info);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* Unlocks buffer after usage from external API */
|
|
Packit Service |
9402ce |
VAStatus
|
|
Packit Service |
9402ce |
vaReleaseBufferHandle(VADisplay dpy, VABufferID buf_id)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (!ctx->vtable->vaReleaseBufferHandle)
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
|
|
Packit Service |
9402ce |
else
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaReleaseBufferHandle(ctx, buf_id);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus
|
|
Packit Service |
9402ce |
vaExportSurfaceHandle(VADisplay dpy, VASurfaceID surface_id,
|
|
Packit Service |
9402ce |
uint32_t mem_type, uint32_t flags,
|
|
Packit Service |
9402ce |
void *descriptor)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (!ctx->vtable->vaExportSurfaceHandle)
|
|
Packit Service |
9402ce |
vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
|
|
Packit Service |
9402ce |
else
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaExportSurfaceHandle(ctx, surface_id,
|
|
Packit Service |
9402ce |
mem_type, flags,
|
|
Packit Service |
9402ce |
descriptor);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaBeginPicture (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAContextID context,
|
|
Packit Service |
9402ce |
VASurfaceID render_target
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus va_status;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_ALL(va_TraceBeginPicture, dpy, context, render_target);
|
|
Packit Service |
9402ce |
VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaBeginPicture( ctx, context, render_target );
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaRenderPicture (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAContextID context,
|
|
Packit Service |
9402ce |
VABufferID *buffers,
|
|
Packit Service |
9402ce |
int num_buffers
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus vaStatus = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceRenderPicture, dpy, context, buffers, num_buffers);
|
|
Packit Service |
9402ce |
VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
vaStatus = ctx->vtable->vaRenderPicture( ctx, context, buffers, num_buffers );
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, vaStatus);
|
|
Packit Service |
9402ce |
return vaStatus;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaEndPicture (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAContextID context
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VAStatus va_status = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_FOOL_FUNC(va_FoolCheckContinuity, dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaEndPicture( ctx, context );
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* dump surface content */
|
|
Packit Service |
9402ce |
VA_TRACE_ALL(va_TraceEndPicture, dpy, context, 1);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaSyncSurface (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VASurfaceID render_target
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VAStatus va_status;
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaSyncSurface( ctx, render_target );
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceSyncSurface, dpy, render_target);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaQuerySurfaceStatus (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VASurfaceID render_target,
|
|
Packit Service |
9402ce |
VASurfaceStatus *status /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VAStatus va_status;
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaQuerySurfaceStatus( ctx, render_target, status );
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceQuerySurfaceStatus, dpy, render_target, status);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaQuerySurfaceError (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VASurfaceID surface,
|
|
Packit Service |
9402ce |
VAStatus error_status,
|
|
Packit Service |
9402ce |
void **error_info /*out*/
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VAStatus va_status;
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaQuerySurfaceError( ctx, surface, error_status, error_info );
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceQuerySurfaceError, dpy, surface, error_status, error_info);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* Get maximum number of image formats supported by the implementation */
|
|
Packit Service |
9402ce |
int vaMaxNumImageFormats (
|
|
Packit Service |
9402ce |
VADisplay dpy
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
if (!vaDisplayIsValid(dpy))
|
|
Packit Service |
9402ce |
return 0;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return CTX(dpy)->max_image_formats;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaQueryImageFormats (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAImageFormat *format_list, /* out */
|
|
Packit Service |
9402ce |
int *num_formats /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return ctx->vtable->vaQueryImageFormats ( ctx, format_list, num_formats);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* The width and height fields returned in the VAImage structure may get
|
|
Packit Service |
9402ce |
* enlarged for some YUV formats. The size of the data buffer that needs
|
|
Packit Service |
9402ce |
* to be allocated will be given in the "data_size" field in VAImage.
|
|
Packit Service |
9402ce |
* Image data is not allocated by this function. The client should
|
|
Packit Service |
9402ce |
* allocate the memory and fill in the VAImage structure's data field
|
|
Packit Service |
9402ce |
* after looking at "data_size" returned from the library.
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaCreateImage (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAImageFormat *format,
|
|
Packit Service |
9402ce |
int width,
|
|
Packit Service |
9402ce |
int height,
|
|
Packit Service |
9402ce |
VAImage *image /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus va_status = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaCreateImage ( ctx, format, width, height, image);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* Should call DestroyImage before destroying the surface it is bound to
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaDestroyImage (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAImageID image
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus va_status = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaDestroyImage ( ctx, image);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaSetImagePalette (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAImageID image,
|
|
Packit Service |
9402ce |
unsigned char *palette
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus va_status = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaSetImagePalette ( ctx, image, palette);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* Retrieve surface data into a VAImage
|
|
Packit Service |
9402ce |
* Image must be in a format supported by the implementation
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaGetImage (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VASurfaceID surface,
|
|
Packit Service |
9402ce |
int x, /* coordinates of the upper left source pixel */
|
|
Packit Service |
9402ce |
int y,
|
|
Packit Service |
9402ce |
unsigned int width, /* width and height of the region */
|
|
Packit Service |
9402ce |
unsigned int height,
|
|
Packit Service |
9402ce |
VAImageID image
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus va_status = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaGetImage ( ctx, surface, x, y, width, height, image);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* Copy data from a VAImage to a surface
|
|
Packit Service |
9402ce |
* Image must be in a format supported by the implementation
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaPutImage (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VASurfaceID surface,
|
|
Packit Service |
9402ce |
VAImageID image,
|
|
Packit Service |
9402ce |
int src_x,
|
|
Packit Service |
9402ce |
int src_y,
|
|
Packit Service |
9402ce |
unsigned int src_width,
|
|
Packit Service |
9402ce |
unsigned int src_height,
|
|
Packit Service |
9402ce |
int dest_x,
|
|
Packit Service |
9402ce |
int dest_y,
|
|
Packit Service |
9402ce |
unsigned int dest_width,
|
|
Packit Service |
9402ce |
unsigned int dest_height
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus va_status = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaPutImage ( ctx, surface, image, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height );
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* Derive an VAImage from an existing surface.
|
|
Packit Service |
9402ce |
* This interface will derive a VAImage and corresponding image buffer from
|
|
Packit Service |
9402ce |
* an existing VA Surface. The image buffer can then be mapped/unmapped for
|
|
Packit Service |
9402ce |
* direct CPU access. This operation is only possible on implementations with
|
|
Packit Service |
9402ce |
* direct rendering capabilities and internal surface formats that can be
|
|
Packit Service |
9402ce |
* represented with a VAImage. When the operation is not possible this interface
|
|
Packit Service |
9402ce |
* will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back
|
|
Packit Service |
9402ce |
* to using vaCreateImage + vaPutImage to accomplish the same task in an
|
|
Packit Service |
9402ce |
* indirect manner.
|
|
Packit Service |
9402ce |
*
|
|
Packit Service |
9402ce |
* Implementations should only return success when the resulting image buffer
|
|
Packit Service |
9402ce |
* would be useable with vaMap/Unmap.
|
|
Packit Service |
9402ce |
*
|
|
Packit Service |
9402ce |
* When directly accessing a surface special care must be taken to insure
|
|
Packit Service |
9402ce |
* proper synchronization with the graphics hardware. Clients should call
|
|
Packit Service |
9402ce |
* vaQuerySurfaceStatus to insure that a surface is not the target of concurrent
|
|
Packit Service |
9402ce |
* rendering or currently being displayed by an overlay.
|
|
Packit Service |
9402ce |
*
|
|
Packit Service |
9402ce |
* Additionally nothing about the contents of a surface should be assumed
|
|
Packit Service |
9402ce |
* following a vaPutSurface. Implementations are free to modify the surface for
|
|
Packit Service |
9402ce |
* scaling or subpicture blending within a call to vaPutImage.
|
|
Packit Service |
9402ce |
*
|
|
Packit Service |
9402ce |
* Calls to vaPutImage or vaGetImage using the same surface from which the image
|
|
Packit Service |
9402ce |
* has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or
|
|
Packit Service |
9402ce |
* vaGetImage with other surfaces is supported.
|
|
Packit Service |
9402ce |
*
|
|
Packit Service |
9402ce |
* An image created with vaDeriveImage should be freed with vaDestroyImage. The
|
|
Packit Service |
9402ce |
* image and image buffer structures will be destroyed; however, the underlying
|
|
Packit Service |
9402ce |
* surface will remain unchanged until freed with vaDestroySurfaces.
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaDeriveImage (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VASurfaceID surface,
|
|
Packit Service |
9402ce |
VAImage *image /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus va_status = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaDeriveImage ( ctx, surface, image );
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* Get maximum number of subpicture formats supported by the implementation */
|
|
Packit Service |
9402ce |
int vaMaxNumSubpictureFormats (
|
|
Packit Service |
9402ce |
VADisplay dpy
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
if (!vaDisplayIsValid(dpy))
|
|
Packit Service |
9402ce |
return 0;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return CTX(dpy)->max_subpic_formats;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* Query supported subpicture formats
|
|
Packit Service |
9402ce |
* The caller must provide a "format_list" array that can hold at
|
|
Packit Service |
9402ce |
* least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag
|
|
Packit Service |
9402ce |
* for each format to indicate additional capabilities for that format. The actual
|
|
Packit Service |
9402ce |
* number of formats returned in "format_list" is returned in "num_formats".
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaQuerySubpictureFormats (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAImageFormat *format_list, /* out */
|
|
Packit Service |
9402ce |
unsigned int *flags, /* out */
|
|
Packit Service |
9402ce |
unsigned int *num_formats /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return ctx->vtable->vaQuerySubpictureFormats ( ctx, format_list, flags, num_formats);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* Subpictures are created with an image associated.
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaCreateSubpicture (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAImageID image,
|
|
Packit Service |
9402ce |
VASubpictureID *subpicture /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return ctx->vtable->vaCreateSubpicture ( ctx, image, subpicture );
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* Destroy the subpicture before destroying the image it is assocated to
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaDestroySubpicture (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VASubpictureID subpicture
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return ctx->vtable->vaDestroySubpicture ( ctx, subpicture);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaSetSubpictureImage (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VASubpictureID subpicture,
|
|
Packit Service |
9402ce |
VAImageID image
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return ctx->vtable->vaSetSubpictureImage ( ctx, subpicture, image);
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* If chromakey is enabled, then the area where the source value falls within
|
|
Packit Service |
9402ce |
* the chromakey [min, max] range is transparent
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaSetSubpictureChromakey (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VASubpictureID subpicture,
|
|
Packit Service |
9402ce |
unsigned int chromakey_min,
|
|
Packit Service |
9402ce |
unsigned int chromakey_max,
|
|
Packit Service |
9402ce |
unsigned int chromakey_mask
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return ctx->vtable->vaSetSubpictureChromakey ( ctx, subpicture, chromakey_min, chromakey_max, chromakey_mask );
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* Global alpha value is between 0 and 1. A value of 1 means fully opaque and
|
|
Packit Service |
9402ce |
* a value of 0 means fully transparent. If per-pixel alpha is also specified then
|
|
Packit Service |
9402ce |
* the overall alpha is per-pixel alpha multiplied by the global alpha
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaSetSubpictureGlobalAlpha (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VASubpictureID subpicture,
|
|
Packit Service |
9402ce |
float global_alpha
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return ctx->vtable->vaSetSubpictureGlobalAlpha ( ctx, subpicture, global_alpha );
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
vaAssociateSubpicture associates the subpicture with the target_surface.
|
|
Packit Service |
9402ce |
It defines the region mapping between the subpicture and the target
|
|
Packit Service |
9402ce |
surface through source and destination rectangles (with the same width and height).
|
|
Packit Service |
9402ce |
Both will be displayed at the next call to vaPutSurface. Additional
|
|
Packit Service |
9402ce |
associations before the call to vaPutSurface simply overrides the association.
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaAssociateSubpicture (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VASubpictureID subpicture,
|
|
Packit Service |
9402ce |
VASurfaceID *target_surfaces,
|
|
Packit Service |
9402ce |
int num_surfaces,
|
|
Packit Service |
9402ce |
short src_x, /* upper left offset in subpicture */
|
|
Packit Service |
9402ce |
short src_y,
|
|
Packit Service |
9402ce |
unsigned short src_width,
|
|
Packit Service |
9402ce |
unsigned short src_height,
|
|
Packit Service |
9402ce |
short dest_x, /* upper left offset in surface */
|
|
Packit Service |
9402ce |
short dest_y,
|
|
Packit Service |
9402ce |
unsigned short dest_width,
|
|
Packit Service |
9402ce |
unsigned short dest_height,
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* whether to enable chroma-keying or global-alpha
|
|
Packit Service |
9402ce |
* see VA_SUBPICTURE_XXX values
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
unsigned int flags
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
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 );
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* vaDeassociateSubpicture removes the association of the subpicture with target_surfaces.
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaDeassociateSubpicture (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VASubpictureID subpicture,
|
|
Packit Service |
9402ce |
VASurfaceID *target_surfaces,
|
|
Packit Service |
9402ce |
int num_surfaces
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return ctx->vtable->vaDeassociateSubpicture ( ctx, subpicture, target_surfaces, num_surfaces );
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* Get maximum number of display attributes supported by the implementation */
|
|
Packit Service |
9402ce |
int vaMaxNumDisplayAttributes (
|
|
Packit Service |
9402ce |
VADisplay dpy
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
int tmp;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
if (!vaDisplayIsValid(dpy))
|
|
Packit Service |
9402ce |
return 0;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
tmp = CTX(dpy)->max_display_attributes;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceMaxNumDisplayAttributes, dpy, tmp);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return tmp;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* Query display attributes
|
|
Packit Service |
9402ce |
* The caller must provide a "attr_list" array that can hold at
|
|
Packit Service |
9402ce |
* least vaMaxNumDisplayAttributes() entries. The actual number of attributes
|
|
Packit Service |
9402ce |
* returned in "attr_list" is returned in "num_attributes".
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaQueryDisplayAttributes (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VADisplayAttribute *attr_list, /* out */
|
|
Packit Service |
9402ce |
int *num_attributes /* out */
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus va_status;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaQueryDisplayAttributes ( ctx, attr_list, num_attributes );
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceQueryDisplayAttributes, dpy, attr_list, num_attributes);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* Get display attributes
|
|
Packit Service |
9402ce |
* This function returns the current attribute values in "attr_list".
|
|
Packit Service |
9402ce |
* Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
|
|
Packit Service |
9402ce |
* from vaQueryDisplayAttributes() can have their values retrieved.
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaGetDisplayAttributes (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VADisplayAttribute *attr_list, /* in/out */
|
|
Packit Service |
9402ce |
int num_attributes
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus va_status;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaGetDisplayAttributes ( ctx, attr_list, num_attributes );
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceGetDisplayAttributes, dpy, attr_list, num_attributes);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/*
|
|
Packit Service |
9402ce |
* Set display attributes
|
|
Packit Service |
9402ce |
* Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
|
|
Packit Service |
9402ce |
* from vaQueryDisplayAttributes() can be set. If the attribute is not settable or
|
|
Packit Service |
9402ce |
* the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
|
|
Packit Service |
9402ce |
*/
|
|
Packit Service |
9402ce |
VAStatus vaSetDisplayAttributes (
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VADisplayAttribute *attr_list,
|
|
Packit Service |
9402ce |
int num_attributes
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus va_status;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaSetDisplayAttributes ( ctx, attr_list, num_attributes );
|
|
Packit Service |
9402ce |
VA_TRACE_LOG(va_TraceSetDisplayAttributes, dpy, attr_list, num_attributes);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaLockSurface(VADisplay dpy,
|
|
Packit Service |
9402ce |
VASurfaceID surface,
|
|
Packit Service |
9402ce |
unsigned int *fourcc, /* following are output argument */
|
|
Packit Service |
9402ce |
unsigned int *luma_stride,
|
|
Packit Service |
9402ce |
unsigned int *chroma_u_stride,
|
|
Packit Service |
9402ce |
unsigned int *chroma_v_stride,
|
|
Packit Service |
9402ce |
unsigned int *luma_offset,
|
|
Packit Service |
9402ce |
unsigned int *chroma_u_offset,
|
|
Packit Service |
9402ce |
unsigned int *chroma_v_offset,
|
|
Packit Service |
9402ce |
unsigned int *buffer_name,
|
|
Packit Service |
9402ce |
void **buffer
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus va_status = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
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);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus vaUnlockSurface(VADisplay dpy,
|
|
Packit Service |
9402ce |
VASurfaceID surface
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus va_status = VA_STATUS_SUCCESS;
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy);
|
|
Packit Service |
9402ce |
ctx = CTX(dpy);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
va_status = ctx->vtable->vaUnlockSurface( ctx, surface );
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, va_status);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return va_status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
/* Video Processing */
|
|
Packit Service |
9402ce |
#define VA_VPP_INIT_CONTEXT(ctx, dpy) do { \
|
|
Packit Service |
9402ce |
CHECK_DISPLAY(dpy); \
|
|
Packit Service |
9402ce |
ctx = CTX(dpy); \
|
|
Packit Service |
9402ce |
if (!ctx) \
|
|
Packit Service |
9402ce |
return VA_STATUS_ERROR_INVALID_DISPLAY; \
|
|
Packit Service |
9402ce |
} while (0)
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
#define VA_VPP_INVOKE(dpy, func, args) do { \
|
|
Packit Service |
9402ce |
if (!ctx->vtable_vpp->va##func) \
|
|
Packit Service |
9402ce |
return VA_STATUS_ERROR_UNIMPLEMENTED; \
|
|
Packit Service |
9402ce |
status = ctx->vtable_vpp->va##func args; \
|
|
Packit Service |
9402ce |
} while (0)
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus
|
|
Packit Service |
9402ce |
vaQueryVideoProcFilters(
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAContextID context,
|
|
Packit Service |
9402ce |
VAProcFilterType *filters,
|
|
Packit Service |
9402ce |
unsigned int *num_filters
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus status;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_VPP_INIT_CONTEXT(ctx, dpy);
|
|
Packit Service |
9402ce |
VA_VPP_INVOKE(
|
|
Packit Service |
9402ce |
ctx,
|
|
Packit Service |
9402ce |
QueryVideoProcFilters,
|
|
Packit Service |
9402ce |
(ctx, context, filters, num_filters)
|
|
Packit Service |
9402ce |
);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, status);
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
return status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus
|
|
Packit Service |
9402ce |
vaQueryVideoProcFilterCaps(
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAContextID context,
|
|
Packit Service |
9402ce |
VAProcFilterType type,
|
|
Packit Service |
9402ce |
void *filter_caps,
|
|
Packit Service |
9402ce |
unsigned int *num_filter_caps
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus status;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_VPP_INIT_CONTEXT(ctx, dpy);
|
|
Packit Service |
9402ce |
VA_VPP_INVOKE(
|
|
Packit Service |
9402ce |
ctx,
|
|
Packit Service |
9402ce |
QueryVideoProcFilterCaps,
|
|
Packit Service |
9402ce |
(ctx, context, type, filter_caps, num_filter_caps)
|
|
Packit Service |
9402ce |
);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, status);
|
|
Packit Service |
9402ce |
return status;
|
|
Packit Service |
9402ce |
}
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VAStatus
|
|
Packit Service |
9402ce |
vaQueryVideoProcPipelineCaps(
|
|
Packit Service |
9402ce |
VADisplay dpy,
|
|
Packit Service |
9402ce |
VAContextID context,
|
|
Packit Service |
9402ce |
VABufferID *filters,
|
|
Packit Service |
9402ce |
unsigned int num_filters,
|
|
Packit Service |
9402ce |
VAProcPipelineCaps *pipeline_caps
|
|
Packit Service |
9402ce |
)
|
|
Packit Service |
9402ce |
{
|
|
Packit Service |
9402ce |
VADriverContextP ctx;
|
|
Packit Service |
9402ce |
VAStatus status;
|
|
Packit Service |
9402ce |
|
|
Packit Service |
9402ce |
VA_VPP_INIT_CONTEXT(ctx, dpy);
|
|
Packit Service |
9402ce |
VA_VPP_INVOKE(
|
|
Packit Service |
9402ce |
ctx,
|
|
Packit Service |
9402ce |
QueryVideoProcPipelineCaps,
|
|
Packit Service |
9402ce |
(ctx, context, filters, num_filters, pipeline_caps)
|
|
Packit Service |
9402ce |
);
|
|
Packit Service |
9402ce |
VA_TRACE_RET(dpy, status);
|
|
Packit Service |
9402ce |
return status;
|
|
Packit Service |
9402ce |
}
|