summaryrefslogtreecommitdiffstats
path: root/common/av_log.c
diff options
context:
space:
mode:
authorKacper Michajłow <kasper93@gmail.com>2023-11-24 05:02:30 +0100
committersfan5 <sfan5@live.de>2023-11-28 10:46:16 +0100
commit2bcdf591fdb1d54a6f9d97cf6d32606cbada3a76 (patch)
treebec44d0264129203a3eeed4d122e7776cd57a282 /common/av_log.c
parent0262ec38296ddcdeabf5182912dfe83a7dd206d3 (diff)
downloadmpv-2bcdf591fdb1d54a6f9d97cf6d32606cbada3a76.tar.bz2
mpv-2bcdf591fdb1d54a6f9d97cf6d32606cbada3a76.tar.xz
common/av_log: use bstr for log callback
- don't use 4KiB stack array - keep one bstr allocation for lifetime of the log - avoid dummy strlen
Diffstat (limited to 'common/av_log.c')
-rw-r--r--common/av_log.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/common/av_log.c b/common/av_log.c
index b6bad041e1..fa62b9d071 100644
--- a/common/av_log.c
+++ b/common/av_log.c
@@ -28,6 +28,7 @@
#include "common/global.h"
#include "common/msg.h"
#include "config.h"
+#include "misc/bstr.h"
#include "osdep/threads.h"
#include <libavutil/avutil.h>
@@ -55,6 +56,7 @@ static mp_static_mutex log_lock = MP_STATIC_MUTEX_INITIALIZER;
static struct mpv_global *log_mpv_instance;
static struct mp_log *log_root, *log_decaudio, *log_decvideo, *log_demuxer;
static bool log_print_prefix = true;
+static bstr log_buffer;
static int av_log_level_to_mp_level(int av_level)
{
@@ -125,19 +127,20 @@ static void mp_msg_av_log_callback(void *ptr, int level, const char *fmt,
struct mp_log *log = get_av_log(ptr);
if (mp_msg_test(log, mp_level)) {
- char buffer[4096] = "";
- int pos = 0;
+ log_buffer.len = 0;
+ bstr_xappend_vasprintf(log_root, &log_buffer, fmt, vl);
+ if (!log_buffer.len)
+ goto done;
const char *prefix = avc ? avc->item_name(ptr) : NULL;
- if (log_print_prefix && prefix)
- pos = snprintf(buffer, sizeof(buffer), "%s: ", prefix);
- log_print_prefix = fmt[strlen(fmt) - 1] == '\n';
-
- pos = MPMIN(MPMAX(pos, 0), sizeof(buffer));
- vsnprintf(buffer + pos, sizeof(buffer) - pos, fmt, vl);
-
- mp_msg(log, mp_level, "%s", buffer);
+ if (log_print_prefix && prefix) {
+ mp_msg(log, mp_level, "%s: %.*s", prefix, BSTR_P(log_buffer));
+ } else {
+ mp_msg(log, mp_level, "%.*s", BSTR_P(log_buffer));
+ }
+ log_print_prefix = log_buffer.start[log_buffer.len - 1] == '\n';
}
+done:
mp_mutex_unlock(&log_lock);
}
@@ -150,6 +153,7 @@ void init_libav(struct mpv_global *global)
log_decaudio = mp_log_new(log_root, log_root, "audio");
log_decvideo = mp_log_new(log_root, log_root, "video");
log_demuxer = mp_log_new(log_root, log_root, "demuxer");
+ log_buffer = (bstr){0};
av_log_set_callback(mp_msg_av_log_callback);
}
mp_mutex_unlock(&log_lock);