From 750f0e1f8b6c04ca4562a64fd1049f322ba05aa8 Mon Sep 17 00:00:00 2001 From: Panagiotis Issaris Date: Mon, 12 Mar 2007 14:17:26 +0000 Subject: [PATCH] Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log() which use av_log() for logging instead of fprintf(). Originally committed as revision 8339 to svn://svn.ffmpeg.org/ffmpeg/trunk --- ffmpeg.c | 2 +- ffserver.c | 2 +- libavformat/avformat.h | 38 +++++++++++++++++++++++--- libavformat/mpegts.c | 10 +++---- libavformat/utils.c | 62 +++++++++++++++++++++++++++++------------- 5 files changed, 84 insertions(+), 30 deletions(-) diff --git a/ffmpeg.c b/ffmpeg.c index 48a77e844b..24777deaff 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -1878,7 +1878,7 @@ static int av_encode(AVFormatContext **output_files, } if (do_pkt_dump) { - av_pkt_dump(stdout, &pkt, do_hex_dump); + av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump); } /* the following test is needed in case new streams appear dynamically in stream : we ignore them */ diff --git a/ffserver.c b/ffserver.c index 899e4b7d8b..83cd4e4cf1 100644 --- a/ffserver.c +++ b/ffserver.c @@ -3347,7 +3347,7 @@ static void extract_mpeg4_header(AVFormatContext *infile) if (p[0] == 0x00 && p[1] == 0x00 && p[2] == 0x01 && p[3] == 0xb6) { size = p - pkt.data; - // av_hex_dump(pkt.data, size); + // av_hex_dump_log(infile, AV_LOG_DEBUG, pkt.data, size); st->codec->extradata = av_malloc(size); st->codec->extradata_size = size; memcpy(st->codec->extradata, pkt.data, size); diff --git a/libavformat/avformat.h b/libavformat/avformat.h index b6fefaf33b..f1b29b3fbd 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -444,21 +444,51 @@ enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name, const char *filename, const char *mime_type, enum CodecType type); /** - * Print nice hexa dump of a buffer - * @param f stream for output + * Send a nice hexadecimal dump of a buffer to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. * @param buf buffer * @param size buffer size + * + * @see av_hex_dump_log, av_pkt_dump, av_pkt_dump_log */ void av_hex_dump(FILE *f, uint8_t *buf, int size); /** - * Print on 'f' a nice dump of a packet - * @param f stream for output + * Send a nice hexadecimal dump of a buffer to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param buf buffer + * @param size buffer size + * + * @see av_hex_dump, av_pkt_dump, av_pkt_dump_log + */ +void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size); + +/** + * Send a nice dump of a packet to the specified file stream. + * + * @param f The file stream pointer where the dump should be sent to. * @param pkt packet to dump * @param dump_payload true if the payload must be displayed too */ void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload); +/** + * Send a nice dump of a packet to the log. + * + * @param avcl A pointer to an arbitrary struct of which the first field is a + * pointer to an AVClass struct. + * @param level The importance level of the message, lower values signifying + * higher importance. + * @param pkt packet to dump + * @param dump_payload true if the payload must be displayed too + */ +void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload); + void av_register_all(void); /** codec tag <-> codec id */ diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index ae6d3aa26c..c466710eee 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -401,7 +401,7 @@ static void pmt_cb(void *opaque, const uint8_t *section, int section_len) #ifdef DEBUG_SI av_log(ts->stream, AV_LOG_DEBUG, "PMT: len %i\n", section_len); - av_hex_dump(stdout, (uint8_t *)section, section_len); + av_hex_dump_log(ts->stream, AV_LOG_DEBUG, (uint8_t *)section, section_len); #endif p_end = section + section_len - 4; p = section; @@ -545,7 +545,7 @@ static void pat_cb(void *opaque, const uint8_t *section, int section_len) #ifdef DEBUG_SI av_log(ts->stream, AV_LOG_DEBUG, "PAT:\n"); - av_hex_dump(stdout, (uint8_t *)section, section_len); + av_hex_dump_log(ts->stream, AV_LOG_DEBUG, (uint8_t *)section, section_len); #endif p_end = section + section_len - 4; p = section; @@ -594,7 +594,7 @@ static void pat_scan_cb(void *opaque, const uint8_t *section, int section_len) #ifdef DEBUG_SI av_log(ts->stream, AV_LOG_DEBUG, "PAT:\n"); - av_hex_dump(stdout, (uint8_t *)section, section_len); + av_hex_dump_log(ts->stream, AV_LOG_DEBUG, (uint8_t *)section, section_len); #endif p_end = section + section_len - 4; p = section; @@ -655,7 +655,7 @@ static void sdt_cb(void *opaque, const uint8_t *section, int section_len) #ifdef DEBUG_SI av_log(ts->stream, AV_LOG_DEBUG, "SDT:\n"); - av_hex_dump(stdout, (uint8_t *)section, section_len); + av_hex_dump_log(ts->stream, AV_LOG_DEBUG, (uint8_t *)section, section_len); #endif p_end = section + section_len - 4; @@ -806,7 +806,7 @@ static void mpegts_push_data(void *opaque, /* we got all the PES or section header. We can now decide */ #if 0 - av_hex_dump(pes->header, pes->data_index); + av_hex_dump_log(pes->stream, AV_LOG_DEBUG, pes->header, pes->data_index); #endif if (pes->header[0] == 0x00 && pes->header[1] == 0x00 && pes->header[2] == 0x01) { diff --git a/libavformat/utils.c b/libavformat/utils.c index 768d0b8687..e05d02de7d 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2702,56 +2702,80 @@ int av_get_frame_filename(char *buf, int buf_size, return -1; } -void av_hex_dump(FILE *f, uint8_t *buf, int size) +static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size) { int len, i, j, c; +#define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0) for(i=0;i 16) len = 16; - fprintf(f, "%08x ", i); + PRINT("%08x ", i); for(j=0;j<16;j++) { if (j < len) - fprintf(f, " %02x", buf[i+j]); + PRINT(" %02x", buf[i+j]); else - fprintf(f, " "); + PRINT(" "); } - fprintf(f, " "); + PRINT(" "); for(j=0;j '~') c = '.'; - fprintf(f, "%c", c); + PRINT("%c", c); } - fprintf(f, "\n"); + PRINT("\n"); } +#undef PRINT +} + +void av_hex_dump(FILE *f, uint8_t *buf, int size) +{ + hex_dump_internal(NULL, f, 0, buf, size); +} + +void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size) +{ + hex_dump_internal(avcl, NULL, level, buf, size); } //FIXME needs to know the time_base -void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload) +static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload) { - fprintf(f, "stream #%d:\n", pkt->stream_index); - fprintf(f, " keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0)); - fprintf(f, " duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE); +#define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0) + PRINT("stream #%d:\n", pkt->stream_index); + PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0)); + PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE); /* DTS is _always_ valid after av_read_frame() */ - fprintf(f, " dts="); + PRINT(" dts="); if (pkt->dts == AV_NOPTS_VALUE) - fprintf(f, "N/A"); + PRINT("N/A"); else - fprintf(f, "%0.3f", (double)pkt->dts / AV_TIME_BASE); + PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE); /* PTS may be not known if B frames are present */ - fprintf(f, " pts="); + PRINT(" pts="); if (pkt->pts == AV_NOPTS_VALUE) - fprintf(f, "N/A"); + PRINT("N/A"); else - fprintf(f, "%0.3f", (double)pkt->pts / AV_TIME_BASE); - fprintf(f, "\n"); - fprintf(f, " size=%d\n", pkt->size); + PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE); + PRINT("\n"); + PRINT(" size=%d\n", pkt->size); +#undef PRINT if (dump_payload) av_hex_dump(f, pkt->data, pkt->size); } +void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload) +{ + pkt_dump_internal(NULL, f, 0, pkt, dump_payload); +} + +void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload) +{ + pkt_dump_internal(avcl, NULL, level, pkt, dump_payload); +} + void url_split(char *proto, int proto_size, char *authorization, int authorization_size, char *hostname, int hostname_size,