@ -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 ;