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 message_callback(int level, const char *format, va_list va, void *ctx) { mp_msg(MSGT_ASS, level, "[ass] "); mp_msg_va(MSGT_ASS, level, format, va); // libass messages lack trailing \n mp_msg(MSGT_ASS, level, "\n"); }
static void mp_msp_av_log_callback(void *ptr, int level, const char *fmt, va_list vl) { static int print_prefix=1; AVClass *avc= ptr ? *(AVClass **)ptr : NULL; int type= MSGT_FIXME; int mp_level; switch(level){ case AV_LOG_VERBOSE: mp_level = MSGL_V ; break; case AV_LOG_DEBUG: mp_level= MSGL_V ; break; case AV_LOG_INFO : mp_level= MSGL_INFO; break; case AV_LOG_ERROR: mp_level= MSGL_ERR ; break; default : mp_level= level > AV_LOG_DEBUG ? MSGL_DBG2 : MSGL_ERR; break; } if (ptr && !avc) mp_msg(MSGT_DECVIDEO, MSGL_ERR, "libav* called av_log with context containing a broken AVClass!\n"); if (avc) { if(!strcmp(avc->class_name, "AVCodecContext")){ AVCodecContext *s= ptr; if(s->codec){ if(s->codec->type == AVMEDIA_TYPE_AUDIO){ if(s->codec->decode) type= MSGT_DECAUDIO; }else if(s->codec->type == AVMEDIA_TYPE_VIDEO){ if(s->codec->decode) type= MSGT_DECVIDEO; } //FIXME subtitles, encoders (what msgt for them? there is no appropriate ...) } }else if(!strcmp(avc->class_name, "AVFormatContext")){ AVFormatContext *s= ptr; if(s->iformat) type= MSGT_DEMUXER; else if(s->oformat) type= MSGT_MUXER; } } if (!mp_msg_test(type, mp_level)) return; if(print_prefix && avc) { mp_msg(type, mp_level, "[%s @ %p]", avc->item_name(ptr), avc); } print_prefix= strchr(fmt, '\n') != NULL; mp_msg_va(type, mp_level, fmt, vl); }
static void mp_msg_av_log_callback(void *ptr, int level, const char *fmt, va_list vl) { static bool print_prefix = 1; AVClass *avc = ptr ? *(AVClass **)ptr : NULL; int mp_level = av_log_level_to_mp_level(level); int type = extract_msg_type_from_ctx(ptr); if (!mp_msg_test(type, mp_level)) return; if (print_prefix && avc) mp_msg(type, mp_level, "[%s @ %p]", avc->item_name(ptr), avc); print_prefix = fmt[strlen(fmt) - 1] == '\n'; mp_msg_va(type, mp_level, fmt, vl); }