summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2012-04-17 02:48:29 +0000
committerNanang Izzuddin <nanang@teluu.com>2012-04-17 02:48:29 +0000
commitda9a972184792f305f290bba3626829b9fe11dc9 (patch)
tree5b70b2310adc0cda477bd3603e0b057bf5d0cf2e
parent17b954ad87d02051a2f0bf294e0478a747ca37c5 (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
-rw-r--r--pjmedia/src/pjmedia-codec/ffmpeg_vid_codecs.c4
-rw-r--r--pjmedia/src/pjmedia/converter_libswscale.c2
-rw-r--r--pjmedia/src/pjmedia/ffmpeg_util.c42
3 files changed, 47 insertions, 1 deletions
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 <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)
{