static void mp_msg_av_log_callback(void *ptr, int level, const char *fmt, va_list vl) { AVClass *avc = ptr ? *(AVClass **)ptr : NULL; int mp_level = av_log_level_to_mp_level(level); // Note: mp_log is thread-safe, but destruction of the log instances is not. pthread_mutex_lock(&log_lock); if (!log_mpv_instance) { pthread_mutex_unlock(&log_lock); // Fallback to stderr vfprintf(stderr, fmt, vl); return; } struct mp_log *log = get_av_log(ptr); if (mp_msg_test(log, mp_level)) { if (log_print_prefix) mp_msg(log, mp_level, "%s: ", avc ? avc->item_name(ptr) : "?"); log_print_prefix = fmt[strlen(fmt) - 1] == '\n'; mp_msg_va(log, mp_level, fmt, vl); } pthread_mutex_unlock(&log_lock); }
static void mp_msg_av_log_callback(void *ptr, int level, const char *fmt, va_list vl) { AVClass *avc = ptr ? *(AVClass **)ptr : NULL; int mp_level = av_log_level_to_mp_level(level); // Note: mp_log is thread-safe, but destruction of the log instances is not. pthread_mutex_lock(&log_lock); if (!log_mpv_instance) { pthread_mutex_unlock(&log_lock); // Fallback to stderr vfprintf(stderr, fmt, vl); return; } struct mp_log *log = get_av_log(ptr); if (mp_msg_test(log, mp_level)) { char buffer[4096] = ""; int pos = 0; 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); } pthread_mutex_unlock(&log_lock); }