# HG changeset patch # User michael # Date 1078328481 0 # Node ID bafde44145f94cb9671ff7ba32c86381139dc60b # Parent 73ee15c391bf1306fea850ee305cb09d7f0cdc42 av_log() patch by (Michel Bardiaux ) diff -r 73ee15c391bf -r bafde44145f9 avcodec.h --- a/avcodec.h Wed Mar 03 01:57:43 2004 +0000 +++ b/avcodec.h Wed Mar 03 15:41:21 2004 +0000 @@ -570,10 +570,27 @@ #define DEFAULT_FRAME_RATE_BASE 1001000 /** + * Used by av_log + */ +typedef struct AVCLASS AVClass; +struct AVCLASS { + const char* class_name; + const char* (*item_name)(void*); /* actually passing a pointer to an AVCodecContext + or AVFormatContext, which begin with an AVClass. + Needed because av_log is in libavcodec and has no visibility + of AVIn/OutputFormat */ +}; + +/** * main external api structure. */ typedef struct AVCodecContext { /** + * Info on struct for av_log + * - set by avcodec_alloc_context + */ + AVClass class; + /** * the average bitrate. * - encoding: set by user. unused for constant quantizer encoding * - decoding: set by lavc. 0 or some bitrate if this info is available in the stream @@ -2095,19 +2112,11 @@ #define AV_LOG_INFO 1 #define AV_LOG_DEBUG 2 -extern void av_log(AVCodecContext*, int level, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 3, 4))); -extern void av_vlog(AVCodecContext*, int level, const char *fmt, va_list); +extern void av_log(void*, int level, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 3, 4))); +extern void av_vlog(void*, int level, const char *fmt, va_list); extern int av_log_get_level(void); extern void av_log_set_level(int); -extern void av_log_set_callback(void (*)(AVCodecContext*, int, const char*, va_list)); - -#undef AV_LOG_TRAP_PRINTF -#ifdef AV_LOG_TRAP_PRINTF -#define printf DO NOT USE -#define fprintf DO NOT USE -#undef stderr -#define stderr DO NOT USE -#endif +extern void av_log_set_callback(void (*)(void*, int, const char*, va_list)); #ifdef __cplusplus } diff -r 73ee15c391bf -r bafde44145f9 utils.c --- a/utils.c Wed Mar 03 01:57:43 2004 +0000 +++ b/utils.c Wed Mar 03 15:41:21 2004 +0000 @@ -386,11 +386,16 @@ * allocates a AVCodecContext and set it to defaults. * this can be deallocated by simply calling free() */ +static const char* context_to_name(void* class_ptr) { return ((AVCodecContext*) class_ptr)->codec->name; } + +static AVClass av_codec_context_class = { "AVCodecContext", context_to_name }; + AVCodecContext *avcodec_alloc_context(void){ AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext)); if(avctx==NULL) return NULL; + avctx->class = av_codec_context_class; avcodec_get_context_defaults(avctx); return avctx; @@ -835,22 +840,24 @@ /* av_log API */ -#ifdef AV_LOG_TRAP_PRINTF -#undef stderr -#undef fprintf -#endif +static const char* null_to_name(void* class_ptr) { return "NULL"; } + +static AVClass av_null_class = { "NULL", null_to_name }; static int av_log_level = AV_LOG_DEBUG; -static void av_log_default_callback(AVCodecContext* avctx, int level, const char* fmt, va_list vl) +static void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl) { static int print_prefix=1; - + AVClass* avcl = ptr; + if(!avcl || !avcl->class_name) + avcl = &av_null_class; if(level>av_log_level) - return; + return; #undef fprintf - if(avctx && print_prefix) - fprintf(stderr, "[%s @ %p]", avctx->codec ? avctx->codec->name : "?", avctx); + if(print_prefix) { + fprintf(stderr, "[%s:%s @ %p]", avcl->class_name, avcl->item_name(avcl), avcl); + } #define fprintf please_use_av_log print_prefix= strstr(fmt, "\n") != NULL; @@ -858,19 +865,19 @@ vfprintf(stderr, fmt, vl); } -static void (*av_log_callback)(AVCodecContext*, int, const char*, va_list) = av_log_default_callback; +static void (*av_log_callback)(void*, int, const char*, va_list) = av_log_default_callback; -void av_log(AVCodecContext* avctx, int level, const char *fmt, ...) +void av_log(void* avcl, int level, const char *fmt, ...) { va_list vl; va_start(vl, fmt); - av_vlog(avctx, level, fmt, vl); + av_vlog(avcl, level, fmt, vl); va_end(vl); } -void av_vlog(AVCodecContext* avctx, int level, const char *fmt, va_list vl) +void av_vlog(void* avcl, int level, const char *fmt, va_list vl) { - av_log_callback(avctx, level, fmt, vl); + av_log_callback(avcl, level, fmt, vl); } int av_log_get_level(void) @@ -883,7 +890,7 @@ av_log_level = level; } -void av_log_set_callback(void (*callback)(AVCodecContext*, int, const char*, va_list)) +void av_log_set_callback(void (*callback)(void*, int, const char*, va_list)) { av_log_callback = callback; }