Mercurial > mplayer.hg
diff av_helpers.c @ 33871:30f5e5cd3676
Move code for setting up libav* logging callbacks from vd_ffmpeg to a
separate file and also use it when only initializing libavformat.
author | reimar |
---|---|
date | Tue, 09 Aug 2011 19:57:00 +0000 |
parents | |
children | 5f1faa91717e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/av_helpers.c Tue Aug 09 19:57:00 2011 +0000 @@ -0,0 +1,76 @@ +#include "libavcodec/avcodec.h" +#include "libavformat/avformat.h" +#include "mp_msg.h" +#include "av_helpers.h" + +int avcodec_initialized; +int avformat_initialized; + +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); +} + +void init_avcodec(void) +{ + if (!avcodec_initialized) { + avcodec_init(); + avcodec_register_all(); + avcodec_initialized = 1; + av_log_set_callback(mp_msp_av_log_callback); + } +} + +void init_avformat(void) +{ + if (!avformat_initialized) { + av_register_all(); + avformat_initialized = 1; + av_log_set_callback(mp_msp_av_log_callback); + } +}