summaryrefslogtreecommitdiff
path: root/va/va.c
diff options
context:
space:
mode:
Diffstat (limited to 'va/va.c')
-rw-r--r--va/va.c141
1 files changed, 85 insertions, 56 deletions
diff --git a/va/va.c b/va/va.c
index 6378127..ffc0e31 100644
--- a/va/va.c
+++ b/va/va.c
@@ -52,9 +52,9 @@
#define DRIVER_EXTENSION "_drv_video.so"
#define ASSERT assert
-#define CHECK_VTABLE(s, ctx, func) if (!va_checkVtable(ctx->vtable->va##func, #func)) s = VA_STATUS_ERROR_UNKNOWN;
-#define CHECK_MAXIMUM(s, ctx, var) if (!va_checkMaximum(ctx->max_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
-#define CHECK_STRING(s, ctx, var) if (!va_checkString(ctx->str_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
+#define CHECK_VTABLE(s, ctx, func) if (!va_checkVtable(dpy, ctx->vtable->va##func, #func)) s = VA_STATUS_ERROR_UNKNOWN;
+#define CHECK_MAXIMUM(s, ctx, var) if (!va_checkMaximum(dpy, ctx->max_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
+#define CHECK_STRING(s, ctx, var) if (!va_checkString(dpy, ctx->str_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
/*
* read a config "env" for libva.conf or from environment setting
@@ -114,8 +114,17 @@ int vaDisplayIsValid(VADisplay dpy)
return pDisplayContext && (pDisplayContext->vadpy_magic == VA_DISPLAY_MAGIC) && pDisplayContext->vaIsValid(pDisplayContext);
}
-static void default_log_error(const char *buffer)
+/*
+ * Global log level configured from the config file or environment, which sets
+ * whether default logging appears or not (always overridden by explicitly
+ * user-configured logging).
+ */
+static int default_log_level = 2;
+
+static void default_log_error(void *user_context, const char *buffer)
{
+ if (default_log_level < 1)
+ return;
# ifdef ANDROID
ALOGE("%s", buffer);
# else
@@ -123,8 +132,10 @@ static void default_log_error(const char *buffer)
# endif
}
-static void default_log_info(const char *buffer)
+static void default_log_info(void *user_context, const char *buffer)
{
+ if (default_log_level < 2)
+ return;
# ifdef ANDROID
ALOGI("%s", buffer);
# else
@@ -132,17 +143,24 @@ static void default_log_info(const char *buffer)
# endif
}
-static vaMessageCallback va_log_error = default_log_error;
-static vaMessageCallback va_log_info = default_log_info;
-
/**
* Set the callback for error messages, or NULL for no logging.
* Returns the previous one, or NULL if it was disabled.
*/
-vaMessageCallback vaSetErrorCallback(vaMessageCallback callback)
+VAMessageCallback vaSetErrorCallback(VADisplay dpy, VAMessageCallback callback, void *user_context)
{
- vaMessageCallback old_callback = va_log_error;
- va_log_error = callback;
+ VADisplayContextP dctx;
+ VAMessageCallback old_callback;
+
+ if (!vaDisplayIsValid(dpy))
+ return NULL;
+
+ dctx = (VADisplayContextP)dpy;
+ old_callback = dctx->error_callback;
+
+ dctx->error_callback = callback;
+ dctx->error_callback_user_context = user_context;
+
return old_callback;
}
@@ -150,39 +168,46 @@ vaMessageCallback vaSetErrorCallback(vaMessageCallback callback)
* Set the callback for info messages, or NULL for no logging.
* Returns the previous one, or NULL if it was disabled.
*/
-vaMessageCallback vaSetInfoCallback(vaMessageCallback callback)
+VAMessageCallback vaSetInfoCallback(VADisplay dpy, VAMessageCallback callback, void *user_context)
{
- vaMessageCallback old_callback = va_log_info;
- va_log_info = callback;
+ VADisplayContextP dctx;
+ VAMessageCallback old_callback;
+
+ if (!vaDisplayIsValid(dpy))
+ return NULL;
+
+ dctx = (VADisplayContextP)dpy;
+ old_callback = dctx->error_callback;
+
+ dctx->info_callback = callback;
+ dctx->info_callback_user_context = user_context;
+
return old_callback;
}
-void va_MessagingInit()
+static void va_MessagingInit()
{
#if ENABLE_VA_MESSAGING
char env_value[1024];
+ int ret;
if (va_parseConfig("LIBVA_MESSAGING_LEVEL", &env_value[0]) == 0) {
- if (strcmp(env_value, "0") == 0) {
- vaSetInfoCallback(NULL);
- vaSetErrorCallback(NULL);
- }
-
- if (strcmp(env_value, "1") == 0) {
- vaSetInfoCallback(NULL);
- }
+ ret = sscanf(env_value, "%d", &default_log_level);
+ if (ret < 1 || default_log_level < 0 || default_log_level > 2)
+ default_log_level = 2;
}
#endif
}
-void va_errorMessage(const char *msg, ...)
+void va_errorMessage(VADisplay dpy, const char *msg, ...)
{
#if ENABLE_VA_MESSAGING
+ VADisplayContextP dctx = (VADisplayContextP)dpy;
char buf[512], *dynbuf;
va_list args;
int n, len;
- if (va_log_error == NULL)
+ if (dctx->error_callback == NULL)
return;
va_start(args, msg);
@@ -197,22 +222,23 @@ void va_errorMessage(const char *msg, ...)
n = vsnprintf(dynbuf, len + 1, msg, args);
va_end(args);
if (n == len)
- va_log_error(dynbuf);
+ dctx->error_callback(dctx->error_callback_user_context, dynbuf);
free(dynbuf);
}
else if (len > 0)
- va_log_error(buf);
+ dctx->error_callback(dctx->error_callback_user_context, buf);
#endif
}
-void va_infoMessage(const char *msg, ...)
+void va_infoMessage(VADisplay dpy, const char *msg, ...)
{
#if ENABLE_VA_MESSAGING
+ VADisplayContextP dctx = (VADisplayContextP)dpy;
char buf[512], *dynbuf;
va_list args;
int n, len;
- if (va_log_info == NULL)
+ if (dctx->info_callback == NULL)
return;
va_start(args, msg);
@@ -227,11 +253,11 @@ void va_infoMessage(const char *msg, ...)
n = vsnprintf(dynbuf, len + 1, msg, args);
va_end(args);
if (n == len)
- va_log_info(dynbuf);
+ dctx->info_callback(dctx->info_callback_user_context, dynbuf);
free(dynbuf);
}
else if (len > 0)
- va_log_info(buf);
+ dctx->info_callback(dctx->info_callback_user_context, buf);
#endif
}
@@ -243,31 +269,34 @@ VADisplayContextP va_newDisplayContext(void)
dctx->vadpy_magic = VA_DISPLAY_MAGIC;
+ dctx->error_callback = default_log_error;
+ dctx->info_callback = default_log_info;
+
return dctx;
}
-static bool va_checkVtable(void *ptr, char *function)
+static bool va_checkVtable(VADisplay dpy, void *ptr, char *function)
{
if (!ptr) {
- va_errorMessage("No valid vtable entry for va%s\n", function);
+ va_errorMessage(dpy, "No valid vtable entry for va%s\n", function);
return false;
}
return true;
}
-static bool va_checkMaximum(int value, char *variable)
+static bool va_checkMaximum(VADisplay dpy, int value, char *variable)
{
if (!value) {
- va_errorMessage("Failed to define max_%s in init\n", variable);
+ va_errorMessage(dpy, "Failed to define max_%s in init\n", variable);
return false;
}
return true;
}
-static bool va_checkString(const char* value, char *variable)
+static bool va_checkString(VADisplay dpy, const char* value, char *variable)
{
if (!value) {
- va_errorMessage("Failed to define str_%s in init\n", variable);
+ va_errorMessage(dpy, "Failed to define str_%s in init\n", variable);
return false;
}
return true;
@@ -309,9 +338,9 @@ static VAStatus va_openDriver(VADisplay dpy, char *driver_name)
strlen(driver_name) +
strlen(DRIVER_EXTENSION) + 2 );
if (!driver_path) {
- va_errorMessage("%s L%d Out of memory!n",
- __FUNCTION__, __LINE__);
- free(search_path);
+ va_errorMessage(dpy, "%s L%d Out of memory!n",
+ __FUNCTION__, __LINE__);
+ free(search_path);
return VA_STATUS_ERROR_ALLOCATION_FAILED;
}
@@ -320,7 +349,7 @@ static VAStatus va_openDriver(VADisplay dpy, char *driver_name)
strncat( driver_path, driver_name, strlen(driver_name) );
strncat( driver_path, DRIVER_EXTENSION, strlen(DRIVER_EXTENSION) );
- va_infoMessage("Trying to open %s\n", driver_path);
+ va_infoMessage(dpy, "Trying to open %s\n", driver_path);
#ifndef ANDROID
handle = dlopen( driver_path, RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE );
#else
@@ -329,7 +358,7 @@ static VAStatus va_openDriver(VADisplay dpy, char *driver_name)
if (!handle) {
/* Don't give errors for non-existing files */
if (0 == access( driver_path, F_OK))
- va_errorMessage("dlopen of %s failed: %s\n", driver_path, dlerror());
+ va_errorMessage(dpy, "dlopen of %s failed: %s\n", driver_path, dlerror());
} else {
VADriverInit init_func = NULL;
char init_func_s[256];
@@ -349,14 +378,14 @@ static VAStatus va_openDriver(VADisplay dpy, char *driver_name)
compatible_versions[i].minor)) {
init_func = (VADriverInit)dlsym(handle, init_func_s);
if (init_func) {
- va_infoMessage("Found init function %s\n", init_func_s);
+ va_infoMessage(dpy, "Found init function %s\n", init_func_s);
break;
}
}
}
if (compatible_versions[i].major < 0) {
- va_errorMessage("%s has no function %s\n",
+ va_errorMessage(dpy, "%s has no function %s\n",
driver_path, init_func_s);
dlclose(handle);
} else {
@@ -433,7 +462,7 @@ static VAStatus va_openDriver(VADisplay dpy, char *driver_name)
CHECK_VTABLE(vaStatus, ctx, SetDisplayAttributes);
}
if (VA_STATUS_SUCCESS != vaStatus) {
- va_errorMessage("%s init failed\n", driver_path);
+ va_errorMessage(dpy, "%s init failed\n", driver_path);
dlclose(handle);
}
if (VA_STATUS_SUCCESS == vaStatus)
@@ -550,13 +579,13 @@ VAStatus vaSetDriverName(
if (geteuid() != getuid()) {
vaStatus = VA_STATUS_ERROR_OPERATION_FAILED;
- va_errorMessage("no permission to vaSetDriverName\n");
+ va_errorMessage(dpy, "no permission to vaSetDriverName\n");
return vaStatus;
}
if (strlen(driver_name) == 0 || strlen(driver_name) >=256) {
vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
- va_errorMessage("vaSetDriverName returns %s\n",
+ va_errorMessage(dpy, "vaSetDriverName returns %s\n",
vaErrorStr(vaStatus));
return vaStatus;
}
@@ -573,7 +602,7 @@ VAStatus vaSetDriverName(
if (!found) {
vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
- va_errorMessage("vaSetDriverName returns %s. Incorrect parameter\n",
+ va_errorMessage(dpy, "vaSetDriverName returns %s. Incorrect parameter\n",
vaErrorStr(vaStatus));
return vaStatus;
}
@@ -582,7 +611,7 @@ VAStatus vaSetDriverName(
if (!override_driver_name) {
vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
- va_errorMessage("vaSetDriverName returns %s. Out of Memory\n",
+ va_errorMessage(dpy, "vaSetDriverName returns %s. Out of Memory\n",
vaErrorStr(vaStatus));
return vaStatus;
}
@@ -612,12 +641,12 @@ VAStatus vaInitialize (
va_MessagingInit();
- va_infoMessage("VA-API version %s\n", VA_VERSION_S);
+ va_infoMessage(dpy, "VA-API version %s\n", VA_VERSION_S);
vaStatus = va_getDriverName(dpy, &driver_name);
if (!ctx->override_driver_name) {
- va_infoMessage("va_getDriverName() returns %d\n", vaStatus);
+ va_infoMessage(dpy, "va_getDriverName() returns %d\n", vaStatus);
driver_name_env = getenv("LIBVA_DRIVER_NAME");
} else if (vaStatus == VA_STATUS_SUCCESS) {
@@ -627,11 +656,11 @@ VAStatus vaInitialize (
driver_name = strdup(ctx->override_driver_name);
if (!driver_name) {
vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
- va_errorMessage("vaInitialize() failed with %s, out of memory\n",
+ va_errorMessage(dpy, "vaInitialize() failed with %s, out of memory\n",
vaErrorStr(vaStatus));
return vaStatus;
}
- va_infoMessage("User requested driver '%s'\n", driver_name);
+ va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
}
if (driver_name_env && (geteuid() == getuid())) {
@@ -641,17 +670,17 @@ VAStatus vaInitialize (
driver_name = strdup(driver_name_env);
vaStatus = VA_STATUS_SUCCESS;
- va_infoMessage("User requested driver '%s'\n", driver_name);
+ va_infoMessage(dpy, "User requested driver '%s'\n", driver_name);
}
if ((VA_STATUS_SUCCESS == vaStatus) && (driver_name != NULL)) {
vaStatus = va_openDriver(dpy, driver_name);
- va_infoMessage("va_openDriver() returns %d\n", vaStatus);
+ va_infoMessage(dpy, "va_openDriver() returns %d\n", vaStatus);
*major_version = VA_MAJOR_VERSION;
*minor_version = VA_MINOR_VERSION;
} else
- va_errorMessage("va_getDriverName() failed with %s,driver_name=%s\n",
+ va_errorMessage(dpy, "va_getDriverName() failed with %s,driver_name=%s\n",
vaErrorStr(vaStatus), driver_name);
if (driver_name)