2 * av_log to mp_msg converter
3 * Copyright (C) 2006 Michael Niedermayer
4 * Copyright (C) 2009 Uoti Urpala
6 * This file is part of MPlayer.
8 * MPlayer is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * MPlayer is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License along
19 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
29 #include <libavutil/avutil.h>
30 #include <libavutil/log.h>
32 #include <libavcodec/avcodec.h>
33 #include <libavformat/avformat.h>
34 #include <libswscale/swscale.h>
35 #include <libpostproc/postprocess.h>
37 static int av_log_level_to_mp_level(int av_level
)
39 if (av_level
> AV_LOG_VERBOSE
)
41 if (av_level
> AV_LOG_INFO
)
43 if (av_level
> AV_LOG_WARNING
)
45 if (av_level
> AV_LOG_ERROR
)
47 if (av_level
> AV_LOG_FATAL
)
52 static int extract_msg_type_from_ctx(void *ptr
)
57 AVClass
*avc
= *(AVClass
**)ptr
;
59 mp_msg(MSGT_FIXME
, MSGL_WARN
,
60 "av_log callback called with bad parameters (NULL AVClass).\n"
61 "This is a bug in one of Libav/FFmpeg libraries used.\n");
65 if (!strcmp(avc
->class_name
, "AVCodecContext")) {
66 AVCodecContext
*s
= ptr
;
68 if (s
->codec
->type
== AVMEDIA_TYPE_AUDIO
) {
71 } else if (s
->codec
->type
== AVMEDIA_TYPE_VIDEO
) {
75 // FIXME subtitles, encoders
76 // What msgt for them? There is nothing appropriate...
81 if (!strcmp(avc
->class_name
, "AVFormatContext")) {
82 AVFormatContext
*s
= ptr
;
93 static void mp_msg_av_log_callback(void *ptr
, int level
, const char *fmt
,
96 static bool print_prefix
= 1;
97 AVClass
*avc
= ptr
? *(AVClass
**)ptr
: NULL
;
98 int mp_level
= av_log_level_to_mp_level(level
);
99 int type
= extract_msg_type_from_ctx(ptr
);
101 if (!mp_msg_test(type
, mp_level
))
104 if (print_prefix
&& avc
)
105 mp_msg(type
, mp_level
, "[%s @ %p]", avc
->item_name(ptr
), avc
);
106 print_prefix
= fmt
[strlen(fmt
) - 1] == '\n';
108 mp_msg_va(type
, mp_level
, fmt
, vl
);
111 void init_libav(void)
113 av_log_set_callback(mp_msg_av_log_callback
);
116 avcodec_register_all();
121 #define V(x) (x)>>16, (x)>>8 & 255, (x) & 255
122 static void print_version(char *name
, unsigned buildv
, unsigned runv
)
126 mp_msg(MSGT_CPLAYER
, MSGL_V
, "Compiled against %s version %d.%d.%d\n",
129 mp_msg(MSGT_CPLAYER
, MSGL_V
, "Compiled against %s version %d.%d.%d "
130 "(runtime %d.%d.%d)\n", name
, V(buildv
), V(runv
));
134 void print_libav_versions(void)
136 print_version("libavutil", LIBAVUTIL_VERSION_INT
, avutil_version());
137 print_version("libavcodec", LIBAVCODEC_VERSION_INT
, avcodec_version());
138 print_version("libavformat", LIBAVFORMAT_VERSION_INT
, avformat_version());
139 print_version("libswscale", LIBSWSCALE_VERSION_INT
, swscale_version());
140 print_version("libpostproc", LIBPOSTPROC_VERSION_INT
, postproc_version());