diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2012-04-17 02:48:29 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2012-04-17 02:48:29 +0000 |
commit | da9a972184792f305f290bba3626829b9fe11dc9 (patch) | |
tree | 5b70b2310adc0cda477bd3603e0b057bf5d0cf2e /pjmedia/src/pjmedia/ffmpeg_util.c | |
parent | 17b954ad87d02051a2f0bf294e0478a747ca37c5 (diff) |
Misc (re #1446): redirect ffmpeg logging with custom log callback.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4056 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src/pjmedia/ffmpeg_util.c')
-rw-r--r-- | pjmedia/src/pjmedia/ffmpeg_util.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/pjmedia/src/pjmedia/ffmpeg_util.c b/pjmedia/src/pjmedia/ffmpeg_util.c index 0828515e..43d67c31 100644 --- a/pjmedia/src/pjmedia/ffmpeg_util.c +++ b/pjmedia/src/pjmedia/ffmpeg_util.c @@ -18,6 +18,8 @@ */ #include <pjmedia/types.h> #include <pj/errno.h> +#include <pj/log.h> +#include <pj/string.h> #if PJMEDIA_HAS_LIBAVFORMAT && PJMEDIA_HAS_LIBAVUTIL @@ -74,9 +76,13 @@ static const struct ffmpeg_codec_table_t static int pjmedia_ffmpeg_ref_cnt; +static void ffmpeg_log_cb(void* ptr, int level, const char* fmt, va_list vl); + void pjmedia_ffmpeg_add_ref() { if (pjmedia_ffmpeg_ref_cnt++ == 0) { + av_log_set_level(AV_LOG_ERROR); + av_log_set_callback(&ffmpeg_log_cb); av_register_all(); } } @@ -90,6 +96,42 @@ void pjmedia_ffmpeg_dec_ref() if (pjmedia_ffmpeg_ref_cnt < 0) pjmedia_ffmpeg_ref_cnt = 0; } + +static void ffmpeg_log_cb(void* ptr, int level, const char* fmt, va_list vl) +{ + const char *LOG_SENDER = "ffmpeg"; + enum { LOG_LEVEL = 5 }; + char buf[100]; + int bufsize = sizeof(buf), len; + pj_str_t fmt_st; + + /* Custom callback needs to filter log level by itself */ + if (level > av_log_get_level()) + return; + + /* Add original ffmpeg sender to log format */ + if (ptr) { + AVClass* avc = *(AVClass**)ptr; + len = pj_ansi_snprintf(buf, bufsize, "%s: ", avc->item_name(ptr)); + bufsize -= len; + } + + /* Copy original log format */ + len = pj_ansi_strlen(fmt); + if (len > bufsize-1) + len = bufsize-1; + pj_memcpy(buf+sizeof(buf)-bufsize, fmt, len); + bufsize -= len; + + /* Trim log format */ + pj_strset(&fmt_st, buf, sizeof(buf)-bufsize); + pj_strrtrim(&fmt_st); + buf[fmt_st.slen] = '\0'; + + pj_log(LOG_SENDER, LOG_LEVEL, buf, vl); +} + + pj_status_t pjmedia_format_id_to_PixelFormat(pjmedia_format_id fmt_id, enum PixelFormat *pixel_format) { |