diff --git a/include/logging.h b/include/logging.h new file mode 100644 index 0000000..2202295 --- /dev/null +++ b/include/logging.h @@ -0,0 +1,19 @@ +#pragma once + +/* + * Copyright (c) 2022 Andri Yngvason + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +void nvnc__log_init(void); diff --git a/meson.build b/meson.build index 2916d74..d997a9e 100644 --- a/meson.build +++ b/meson.build @@ -115,6 +115,10 @@ if gbm.found() config.set('HAVE_GBM', true) endif +if libavutil.found() + config.set('HAVE_LIBAVUTIL', true) +endif + if gbm.found() and libdrm.found() and libavcodec.found() and libavfilter.found() and libavutil.found() sources += [ 'src/h264-encoder.c', 'src/open-h264.c' ] dependencies += [libdrm, libavcodec, libavfilter, libavutil] diff --git a/src/logging.c b/src/logging.c index 2254d1f..76dd15d 100644 --- a/src/logging.c +++ b/src/logging.c @@ -16,10 +16,19 @@ #include "neatvnc.h" #include "common.h" +#include "logging.h" +#include "config.h" #include #include +#include #include +#include +#include + +#ifdef HAVE_LIBAVUTIL +#include +#endif #define EXPORT __attribute__((visibility("default"))) @@ -34,6 +43,28 @@ static enum nvnc_log_level log_level = NVNC_LOG_DEBUG; static enum nvnc_log_level log_level = NVNC_LOG_WARNING; #endif +static bool is_initialised = false; + +static char* trim_left(char* str) +{ + while (isspace(*str)) + ++str; + return str; +} + +static char* trim_right(char* str) +{ + char* end = str + strlen(str) - 1; + while (str < end && isspace(*end)) + *end-- = '\0'; + return str; +} + +static inline char* trim(char* str) +{ + return trim_right(trim_left(str)); +} + static const char* log_level_to_string(enum nvnc_log_level level) { switch (level) { @@ -69,7 +100,7 @@ static void nvnc__vlog(const struct nvnc_log_data* meta, const char* fmt, if (meta->level <= log_level) { vsnprintf(message, sizeof(message), fmt, args); - log_fn(meta, message); + log_fn(meta, trim(message)); } if (meta->level == NVNC_LOG_PANIC) @@ -91,10 +122,57 @@ static void default_logger(const struct nvnc_log_data* meta, fflush(stream); } +#ifdef HAVE_LIBAVUTIL +static enum nvnc_log_level nvnc__log_level_from_av(int level) +{ + switch (level) { + case AV_LOG_PANIC: return NVNC_LOG_PANIC; + case AV_LOG_FATAL: return NVNC_LOG_ERROR; + case AV_LOG_ERROR: return NVNC_LOG_ERROR; + case AV_LOG_WARNING: return NVNC_LOG_WARNING; + case AV_LOG_INFO: return NVNC_LOG_INFO; + case AV_LOG_VERBOSE: return NVNC_LOG_INFO; + case AV_LOG_DEBUG: return NVNC_LOG_DEBUG; + case AV_LOG_TRACE: return NVNC_LOG_TRACE; + } + + return NVNC_LOG_TRACE; +} + +static int nvnc__log_level_to_av(enum nvnc_log_level level) +{ + switch (level) { + case NVNC_LOG_PANIC: return AV_LOG_PANIC; + case NVNC_LOG_ERROR: return AV_LOG_ERROR; + case NVNC_LOG_WARNING: return AV_LOG_WARNING; + case NVNC_LOG_INFO: return AV_LOG_INFO; + case NVNC_LOG_DEBUG: return AV_LOG_DEBUG; + case NVNC_LOG_TRACE: return AV_LOG_TRACE; + } + + return AV_LOG_TRACE; +} + +static void nvnc__av_log_callback(void* ptr, int level, const char* fmt, + va_list va) +{ + struct nvnc_log_data meta = { + .level = nvnc__log_level_from_av(level), + .file = "libav", + .line = 0, + }; + nvnc__vlog(&meta, fmt, va); +} +#endif + EXPORT void nvnc_set_log_level(enum nvnc_log_level level) { log_level = level; + +#ifdef HAVE_LIBAVUTIL + av_log_set_level(nvnc__log_level_to_av(level)); +#endif } EXPORT @@ -112,3 +190,15 @@ void nvnc__log(const struct nvnc_log_data* meta, nvnc__vlog(meta, fmt, ap); va_end(ap); } + +void nvnc__log_init(void) +{ + if (is_initialised) + return; + +#ifdef HAVE_LIBAVUTIL + av_log_set_callback(nvnc__av_log_callback); +#endif + + is_initialised = true; +} diff --git a/src/server.c b/src/server.c index 285639f..521fe8e 100644 --- a/src/server.c +++ b/src/server.c @@ -29,6 +29,7 @@ #include "tight.h" #include "enc-util.h" #include "cursor.h" +#include "logging.h" #include #include @@ -1234,6 +1235,8 @@ static int bind_address(const char* name, uint16_t port, enum addrtype type) static struct nvnc* open_common(const char* address, uint16_t port, enum addrtype type) { + nvnc__log_init(); + aml_require_workers(aml_get_default(), -1); struct nvnc* self = calloc(1, sizeof(*self));