ffmpeg | branch: master | Gregory J. Wolfe <gregory.wo...@kodakalaris.com> | 
Wed Sep  9 15:32:42 2015 -0400| [1a4c5fe56008c61b0362c75bea5d446dc5b256bc] | 
committer: Martin Storsjö

libopenh264enc: Use av_log() to log messages

File libopenh264enc.c has been modified so that the encoder uses av_log()
to log messages (error, warning, info, etc.) instead of logging them
directly to stderr.  At the time the encoder is created, the current
libav log level is mapped to an equivalent libopenh264 log level.  This
log level, and a message logging function that invokes av_log() to
actually log messages, are then set on the encoder.

This contains further changes and simplifications by Michael Niedermayer
and Martin Storsjö.

Signed-off-by: Martin Storsjö <mar...@martin.st>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=1a4c5fe56008c61b0362c75bea5d446dc5b256bc
---

 libavcodec/libopenh264enc.c |   38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c
index fb153c4..0f18f80 100644
--- a/libavcodec/libopenh264enc.c
+++ b/libavcodec/libopenh264enc.c
@@ -59,6 +59,31 @@ static const AVClass class = {
     "libopenh264enc", av_default_item_name, options, LIBAVUTIL_VERSION_INT
 };
 
+// Convert libopenh264 log level to equivalent libav log level.
+static int libopenh264_to_libav_log_level(int libopenh264_log_level)
+{
+    if      (libopenh264_log_level >= WELS_LOG_DETAIL)  return AV_LOG_TRACE;
+    else if (libopenh264_log_level >= WELS_LOG_DEBUG)   return AV_LOG_DEBUG;
+    else if (libopenh264_log_level >= WELS_LOG_INFO)    return AV_LOG_VERBOSE;
+    else if (libopenh264_log_level >= WELS_LOG_WARNING) return AV_LOG_WARNING;
+    else if (libopenh264_log_level >= WELS_LOG_ERROR)   return AV_LOG_ERROR;
+    else                                                return AV_LOG_QUIET;
+}
+
+// This function will be provided to the libopenh264 library.  The function 
will be called
+// when libopenh264 wants to log a message (error, warning, info, etc.).  The 
signature for
+// this function (defined in .../codec/api/svc/codec_api.h) is:
+//
+//        typedef void (*WelsTraceCallback) (void* ctx, int level, const char* 
string);
+
+static void libopenh264_trace_callback(void *ctx, int level, char const *msg)
+{
+    // The message will be logged only if the requested EQUIVALENT libav log 
level is
+    // less than or equal to the current libav log level.
+    int equiv_libav_log_level = libopenh264_to_libav_log_level(level);
+    av_log(ctx, equiv_libav_log_level, "%s\n", msg);
+}
+
 static av_cold int svc_encode_close(AVCodecContext *avctx)
 {
     SVCContext *s = avctx->priv_data;
@@ -73,6 +98,8 @@ static av_cold int svc_encode_init(AVCodecContext *avctx)
     SVCContext *s = avctx->priv_data;
     SEncParamExt param = { 0 };
     int err = AVERROR_UNKNOWN;
+    int log_level;
+    WelsTraceCallback callback_function;
 
     // Mingw GCC < 4.7 on x86_32 uses an incorrect/buggy ABI for the 
WelsGetCodecVersion
     // function (for functions returning larger structs), thus skip the check 
in those
@@ -90,6 +117,17 @@ static av_cold int svc_encode_init(AVCodecContext *avctx)
         return AVERROR_UNKNOWN;
     }
 
+    // Pass all libopenh264 messages to our callback, to allow ourselves to 
filter them.
+    log_level = WELS_LOG_DETAIL;
+    (*s->encoder)->SetOption(s->encoder, ENCODER_OPTION_TRACE_LEVEL, 
&log_level);
+
+    // Set the logging callback function to one that uses av_log() (see 
implementation above).
+    callback_function = (WelsTraceCallback) libopenh264_trace_callback;
+    (*s->encoder)->SetOption(s->encoder, ENCODER_OPTION_TRACE_CALLBACK, (void 
*)&callback_function);
+
+    // Set the AVCodecContext as the libopenh264 callback context so that it 
can be passed to av_log().
+    (*s->encoder)->SetOption(s->encoder, 
ENCODER_OPTION_TRACE_CALLBACK_CONTEXT, (void *)&avctx);
+
     (*s->encoder)->GetDefaultParams(s->encoder, &param);
 
     param.fMaxFrameRate              = avctx->time_base.den / 
avctx->time_base.num;

_______________________________________________
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

Reply via email to