diff options
Diffstat (limited to 'va/va.c')
-rw-r--r-- | va/va.c | 141 |
1 files changed, 85 insertions, 56 deletions
@@ -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) |