From da9a972184792f305f290bba3626829b9fe11dc9 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Tue, 17 Apr 2012 02:48:29 +0000 Subject: 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 --- pjmedia/src/pjmedia-codec/ffmpeg_vid_codecs.c | 4 ++- pjmedia/src/pjmedia/converter_libswscale.c | 2 ++ pjmedia/src/pjmedia/ffmpeg_util.c | 42 +++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/pjmedia/src/pjmedia-codec/ffmpeg_vid_codecs.c b/pjmedia/src/pjmedia-codec/ffmpeg_vid_codecs.c index 960267db..894a9def 100644 --- a/pjmedia/src/pjmedia-codec/ffmpeg_vid_codecs.c +++ b/pjmedia/src/pjmedia-codec/ffmpeg_vid_codecs.c @@ -593,9 +593,9 @@ PJ_DEF(pj_status_t) pjmedia_codec_ffmpeg_vid_init(pjmedia_vid_codec_mgr *mgr, if (status != PJ_SUCCESS) goto on_error; + pjmedia_ffmpeg_add_ref(); avcodec_init(); avcodec_register_all(); - av_log_set_level(AV_LOG_ERROR); /* Enum FFMPEG codecs */ for (c=av_codec_next(NULL); c; c=av_codec_next(c)) { @@ -854,6 +854,8 @@ PJ_DEF(pj_status_t) pjmedia_codec_ffmpeg_vid_deinit(void) pj_pool_release(ffmpeg_factory.pool); ffmpeg_factory.pool = NULL; + pjmedia_ffmpeg_dec_ref(); + return status; } diff --git a/pjmedia/src/pjmedia/converter_libswscale.c b/pjmedia/src/pjmedia/converter_libswscale.c index 7ab50dd8..ce8ad5ba 100644 --- a/pjmedia/src/pjmedia/converter_libswscale.c +++ b/pjmedia/src/pjmedia/converter_libswscale.c @@ -184,6 +184,7 @@ PJ_DEF(pj_status_t) pjmedia_libswscale_converter_init(pjmedia_converter_mgr *mgr) { libswscale_factory.op = &libswscale_factory_op; + pjmedia_ffmpeg_add_ref(); return pjmedia_converter_mgr_register_factory(mgr, &libswscale_factory); } @@ -193,6 +194,7 @@ pjmedia_libswscale_converter_shutdown(pjmedia_converter_mgr *mgr, pj_pool_t *pool) { PJ_UNUSED_ARG(pool); + pjmedia_ffmpeg_dec_ref(); return pjmedia_converter_mgr_unregister_factory(mgr, &libswscale_factory, PJ_TRUE); } 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 #include +#include +#include #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) { -- cgit v1.2.3