diff options
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | av_log.c | 111 | ||||
-rw-r--r-- | av_log.h | 1 | ||||
-rw-r--r-- | libmpcodecs/vd_ffmpeg.c | 51 | ||||
-rw-r--r-- | mencoder.c | 2 | ||||
-rw-r--r-- | mplayer.c | 2 |
6 files changed, 117 insertions, 51 deletions
@@ -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); @@ -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(); |