mirror of
https://github.com/mpv-player/mpv
synced 2025-03-03 12:47:49 +00:00
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
This commit is contained in:
parent
0262ec3829
commit
2bcdf591fd
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user