summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2009-10-31 23:03:48 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2009-10-31 23:59:16 +0200
commit8bbb79c03a594e452fb9109dd6fda781d390a798 (patch)
treedfcdec188bd26c205ef6b8163d24f1d74401d05f
parent4a35807e7272ee61882e597003a512e07f004f27 (diff)
downloadmpv-8bbb79c03a594e452fb9109dd6fda781d390a798.tar.bz2
mpv-8bbb79c03a594e452fb9109dd6fda781d390a798.tar.xz
av_log callback handling overhaul
Move av_log callback handling from vd_ffmpeg.c to a new file av_log.c and install the callback immediately when starting the program. Main functionality improvements of the new code: - The old version only installed the callback when opening an FFmpeg video decoder. If nothing had triggered that then av_log() messages from other sources (libavformat, audio decoding, swscale usage) bypassed MPlayer's output system completely. Now the callback is always installed. - Current av_log message severity levels are handled correctly. The old code used MSGL_ERR for some messages that should be MSGL_V. - Message type is now set for libavformat contexts (MSGT_DEMUXER / MSGT_MUXER). - The old code did "mp_msg_test(type, mp_level)" before actually determining the type, so that it always used MSGT_FIXME. This led to some messages being incorrectly dropped in case the user had specified module-specific verbosity levels. The old check in question was originally motivated by performance problems when there were a lot of callbacks; however it's not clear whether the part about it skipping the type determination was intentional (most of the performance problems must have come from the way the original code used snprintf) and in my tests current FFmpeg libraries have not generated unreasonable amounts of callbacks anyway.
-rw-r--r--Makefile1
-rw-r--r--av_log.c111
-rw-r--r--av_log.h1
-rw-r--r--libmpcodecs/vd_ffmpeg.c51
-rw-r--r--mencoder.c2
-rw-r--r--mplayer.c2
6 files changed, 117 insertions, 51 deletions
diff --git a/Makefile b/Makefile
index 6a756f1aa1..5e77679c76 100644
--- a/Makefile
+++ b/Makefile
@@ -328,6 +328,7 @@ SRCS_COMMON-$(XVID4) += libmpcodecs/vd_xvid4.c
SRCS_COMMON-$(ZR) += libmpcodecs/vd_zrmjpeg.c \
libmpcodecs/vf_zrmjpeg.c
SRCS_COMMON = asxparser.c \
+ av_log.c \
codec-cfg.c \
cpudetect.c \
defaultopts.c \
diff --git a/av_log.c b/av_log.c
new file mode 100644
index 0000000000..99f6e91a81
--- /dev/null
+++ b/av_log.c
@@ -0,0 +1,111 @@
+/*
+ * av_log to mp_msg converter
+ * Copyright (C) 2006 Michael Niedermayer
+ * Copyright (C) 2009 Uoti Urpala
+ *
+ * This file is part of MPlayer.
+ *
+ * MPlayer is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * MPlayer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with MPlayer; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <stdlib.h>
+#include <stdbool.h>
+
+#include "config.h"
+#include "mp_msg.h"
+#include <libavutil/log.h>
+
+#ifdef CONFIG_LIBAVCODEC
+#include <libavcodec/avcodec.h>
+#endif
+
+#ifdef CONFIG_LIBAVFORMAT
+#include <libavformat/avformat.h>
+#endif
+
+static int av_log_level_to_mp_level(int av_level)
+{
+ if (av_level > AV_LOG_INFO)
+ return MSGL_V;
+ if (av_level > AV_LOG_WARNING)
+ return MSGL_INFO;
+ if (av_level > AV_LOG_ERROR)
+ return MSGL_WARN;
+ if (av_level > AV_LOG_FATAL)
+ return MSGL_ERR;
+ return MSGL_FATAL;
+}
+
+static int extract_msg_type_from_ctx(void *ptr)
+{
+ if (!ptr)
+ return MSGT_FIXME;
+
+ AVClass *avc = *(AVClass **)ptr;
+
+#ifdef CONFIG_LIBAVCODEC
+ if (!strcmp(avc->class_name, "AVCodecContext")) {
+ AVCodecContext *s = ptr;
+ if (s->codec) {
+ if (s->codec->type == CODEC_TYPE_AUDIO) {
+ if (s->codec->decode)
+ return MSGT_DECAUDIO;
+ } else if (s->codec->type == CODEC_TYPE_VIDEO) {
+ if (s->codec->decode)
+ return MSGT_DECVIDEO;
+ }
+ // FIXME subtitles, encoders
+ // What msgt for them? There is nothing appropriate...
+ }
+ return MSGT_FIXME;
+ }
+#endif
+
+#ifdef CONFIG_LIBAVFORMAT
+ if (!strcmp(avc->class_name, "AVFormatContext")) {
+ AVFormatContext *s = ptr;
+ if (s->iformat)
+ return MSGT_DEMUXER;
+ else if (s->oformat)
+ return MSGT_MUXER;
+ return MSGT_FIXME;
+ }
+#endif
+
+ return MSGT_FIXME;
+}
+
+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);
+}
+
+void set_av_log_callback(void)
+{
+ av_log_set_callback(mp_msg_av_log_callback);
+}
diff --git a/av_log.h b/av_log.h
new file mode 100644
index 0000000000..baffb276ce
--- /dev/null
+++ b/av_log.h
@@ -0,0 +1 @@
+void set_av_log_callback(void);
diff --git a/libmpcodecs/vd_ffmpeg.c b/libmpcodecs/vd_ffmpeg.c
index 886a07f3cb..5e22bc6c81 100644
--- a/libmpcodecs/vd_ffmpeg.c
+++ b/libmpcodecs/vd_ffmpeg.c
@@ -138,56 +138,6 @@ static int control(sh_video_t *sh, int cmd, void *arg, ...){
return CONTROL_UNKNOWN;
}
-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;
- char buf[256];
-
- switch(level){
- 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= MSGL_ERR ; break;
- }
-
- if (!mp_msg_test(type, mp_level)) return;
-
- if(ptr){
- if(!strcmp(avc->class_name, "AVCodecContext")){
- AVCodecContext *s= ptr;
- if(s->codec){
- if(s->codec->type == CODEC_TYPE_AUDIO){
- if(s->codec->decode)
- type= MSGT_DECAUDIO;
- }else if(s->codec->type == CODEC_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")){
-#if 0 //needs libavformat include FIXME iam too lazy to do this cleanly, probably the whole should be moved out of this file ...
- AVFormatContext *s= ptr;
- if(s->iformat)
- type= MSGT_DEMUXER;
- else if(s->oformat)
- type= MSGT_MUXER;
-#endif
- }
- }
-
- if(print_prefix && avc) {
- mp_msg(type, mp_level, "[%s @ %p]", avc->item_name(ptr), avc);
- }
-
- print_prefix= strchr(fmt, '\n') != NULL;
- vsnprintf(buf, sizeof(buf), fmt, vl);
- mp_msg(type, mp_level, buf);
-}
-
static void set_format_params(struct AVCodecContext *avctx, enum PixelFormat fmt){
int imgfmt;
imgfmt = pixfmt2imgfmt(fmt);
@@ -219,7 +169,6 @@ static int init(sh_video_t *sh){
avcodec_init();
avcodec_register_all();
avcodec_initialized=1;
- av_log_set_callback(mp_msp_av_log_callback);
}
ctx = sh->context = malloc(sizeof(vd_ffmpeg_ctx));
diff --git a/mencoder.c b/mencoder.c
index 7f4094f663..2b80935b51 100644
--- a/mencoder.c
+++ b/mencoder.c
@@ -37,6 +37,7 @@
#include <sys/time.h>
#include "mp_msg.h"
+#include "av_log.h"
#include "help_mp.h"
#include "codec-cfg.h"
@@ -405,6 +406,7 @@ audio_encoding_params_t aparams;
audio_encoder_t *aencoder = NULL;
mp_msg_init();
+ set_av_log_callback();
// Create the config context and register the options
set_default_mencoder_options(&opts);
diff --git a/mplayer.c b/mplayer.c
index c306c73b4f..41aeff634c 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -39,6 +39,7 @@
#include <errno.h>
#include "mp_msg.h"
+#include "av_log.h"
#define HELP_MP_DEFINE_STATIC
#include "help_mp.h"
@@ -2900,6 +2901,7 @@ int i;
srand(GetTimerMS());
mp_msg_init();
+ set_av_log_callback();
#ifdef CONFIG_X11
mpctx->x11_state = vo_x11_init_state();