From 530bbe96c7ccd1716342c1eea0e30109f8eab0d4 Mon Sep 17 00:00:00 2001 From: Stefano Sabatini Date: Wed, 28 Jul 2010 23:17:59 +0000 Subject: [PATCH] Implement ffprobe -show_packets. Originally committed as revision 24577 to svn://svn.ffmpeg.org/ffmpeg/trunk --- Changelog | 1 + doc/ffprobe-doc.texi | 7 +++++++ ffprobe.c | 46 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/Changelog b/Changelog index b00e61c417..eded41763d 100644 --- a/Changelog +++ b/Changelog @@ -26,6 +26,7 @@ version : - libavcore added - SubRip subtitle file muxer and demuxer - Chinese AVS encoding via libxavs +- ffprobe -show_packets option added diff --git a/doc/ffprobe-doc.texi b/doc/ffprobe-doc.texi index 6792603375..d74a73fe42 100644 --- a/doc/ffprobe-doc.texi +++ b/doc/ffprobe-doc.texi @@ -95,6 +95,13 @@ stream. All the container format information is printed within a section with name ``FORMAT''. +@item -show_packets +Show information about each packet contained in the input multimedia +stream. + +The information for each single packet is printed within a dedicated +section with name ``PACKET''. + @item -show_streams Show information about each media stream contained in the input multimedia stream. diff --git a/ffprobe.c b/ffprobe.c index 4be5d0f875..311580df25 100644 --- a/ffprobe.c +++ b/ffprobe.c @@ -32,6 +32,7 @@ const char program_name[] = "FFprobe"; const int program_birth_year = 2007; static int do_show_format = 0; +static int do_show_packets = 0; static int do_show_streams = 0; static int convert_tags = 0; @@ -101,6 +102,17 @@ static char *time_value_string(char *buf, int buf_size, int64_t val, const AVRat return buf; } +static char *ts_value_string (char *buf, int buf_size, int64_t ts) +{ + if (ts == AV_NOPTS_VALUE) { + snprintf(buf, buf_size, "N/A"); + } else { + snprintf(buf, buf_size, "%"PRId64, ts); + } + + return buf; +} + static const char *media_type_string(enum AVMediaType media_type) { switch (media_type) { @@ -113,6 +125,36 @@ static const char *media_type_string(enum AVMediaType media_type) } } +static void show_packet(AVFormatContext *fmt_ctx, AVPacket *pkt) +{ + char val_str[128]; + AVStream *st = fmt_ctx->streams[pkt->stream_index]; + + printf("[PACKET]\n"); + printf("codec_type=%s\n" , media_type_string(st->codec->codec_type)); + printf("stream_index=%d\n" , pkt->stream_index); + printf("pts=%s\n" , ts_value_string (val_str, sizeof(val_str), pkt->pts)); + printf("pts_time=%s\n" , time_value_string(val_str, sizeof(val_str), pkt->pts, &st->time_base)); + printf("dts=%s\n" , ts_value_string (val_str, sizeof(val_str), pkt->dts)); + printf("dts_time=%s\n" , time_value_string(val_str, sizeof(val_str), pkt->dts, &st->time_base)); + printf("duration=%s\n" , ts_value_string (val_str, sizeof(val_str), pkt->duration)); + printf("duration_time=%s\n", time_value_string(val_str, sizeof(val_str), pkt->duration, &st->time_base)); + printf("size=%s\n" , value_string (val_str, sizeof(val_str), pkt->size, unit_byte_str)); + printf("pos=%"PRId64"\n" , pkt->pos); + printf("flags=%c\n" , pkt->flags & AV_PKT_FLAG_KEY ? 'K' : '_'); + printf("[/PACKET]\n"); +} + +static void show_packets(AVFormatContext *fmt_ctx) +{ + AVPacket pkt; + + av_init_packet(&pkt); + + while (!av_read_frame(fmt_ctx, &pkt)) + show_packet(fmt_ctx, &pkt); +} + static void show_stream(AVFormatContext *fmt_ctx, int stream_idx) { AVStream *stream = fmt_ctx->streams[stream_idx]; @@ -267,6 +309,9 @@ static int probe_file(const char *filename) if ((ret = open_input_file(&fmt_ctx, filename))) return ret; + if (do_show_packets) + show_packets(fmt_ctx); + if (do_show_streams) for (i = 0; i < fmt_ctx->nb_streams; i++) show_stream(fmt_ctx, i); @@ -334,6 +379,7 @@ static const OptionDef options[] = { { "pretty", 0, {(void*)&opt_pretty}, "prettify the format of displayed values, make it more human readable" }, { "show_format", OPT_BOOL, {(void*)&do_show_format} , "show format/container info" }, + { "show_packets", OPT_BOOL, {(void*)&do_show_packets}, "show packets info" }, { "show_streams", OPT_BOOL, {(void*)&do_show_streams}, "show streams info" }, { NULL, }, };