[FFmpeg-devel] [PATCH] ffprobe: add -show_data option.

Nicolas George nicolas.george at normalesup.org
Sun Apr 8 00:33:54 CEST 2012


Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
---
 doc/ffprobe.texi |    7 +++++++
 ffprobe.c        |   35 +++++++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+), 0 deletions(-)


The output syntax is probably not ok, but I did not have any better idea,
and the feature is probably useful (it was to me at least).


diff --git a/doc/ffprobe.texi b/doc/ffprobe.texi
index 12fe29f..7daf7a2 100644
--- a/doc/ffprobe.texi
+++ b/doc/ffprobe.texi
@@ -94,6 +94,13 @@ For example for printing the output in JSON format, specify:
 For more details on the available output printing formats, see the
 Writers section below.
 
+ at item -show_data
+Show payload data, as an hexadecimal and ASCII dump. Coupled with
+ at option{-show_packets}, it will dump the packets' data. Coupled with
+ at option{-show_streams}, it will dump the codec extradata.
+
+The dump is printed as the "data" field. It may contain newlines.
+
 @item -show_error
 Show information about the error found when trying to probe the input.
 
diff --git a/ffprobe.c b/ffprobe.c
index 8a76a0b..992f690 100644
--- a/ffprobe.c
+++ b/ffprobe.c
@@ -52,6 +52,7 @@ static int do_show_format  = 0;
 static int do_show_frames  = 0;
 static int do_show_packets = 0;
 static int do_show_streams = 0;
+static int do_show_data    = 0;
 static int do_show_program_version  = 0;
 static int do_show_library_versions = 0;
 
@@ -320,6 +321,34 @@ static inline void writer_show_tags(WriterContext *wctx, AVDictionary *dict)
     wctx->writer->show_tags(wctx, dict);
 }
 
+static void writer_print_data(WriterContext *wctx, const char *name,
+                              uint8_t *data, int size)
+{
+    AVBPrint bp;
+    int offset = 0, l, i;
+
+    av_bprint_init(&bp, 0, AV_BPRINT_SIZE_UNLIMITED);
+    av_bprintf(&bp, "\n");
+    while (size) {
+        av_bprintf(&bp, "%08x: ", offset);
+        l = FFMIN(size, 16);
+        for (i = 0; i < l; i++) {
+            av_bprintf(&bp, "%02x", data[i]);
+            if (i & 1)
+                av_bprintf(&bp, " ");
+        }
+        av_bprint_chars(&bp, ' ', 41 - 2 * i - i / 2);
+        for (i = 0; i < l; i++)
+            av_bprint_chars(&bp, data[i] - 32U < 95 ? data[i] : '.', 1);
+        av_bprintf(&bp, "\n");
+        offset += l;
+        data   += l;
+        size   -= l;
+    }
+    writer_print_string(wctx, name, bp.str, 0);
+    av_bprint_finalize(&bp, NULL);
+}
+
 #define MAX_REGISTERED_WRITERS_NB 64
 
 static const Writer *registered_writers[MAX_REGISTERED_WRITERS_NB + 1];
@@ -1181,6 +1210,8 @@ static void show_packet(WriterContext *w, AVFormatContext *fmt_ctx, AVPacket *pk
     if (pkt->pos != -1) print_fmt    ("pos", "%"PRId64, pkt->pos);
     else                print_str_opt("pos", "N/A");
     print_fmt("flags", "%c",      pkt->flags & AV_PKT_FLAG_KEY ? 'K' : '_');
+    if (do_show_data)
+        writer_print_data(w, "data", pkt->data, pkt->size);
     print_section_footer("packet");
 
     av_free(pbuf.s);
@@ -1415,6 +1446,9 @@ static void show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_i
     if (nb_streams_packets[stream_idx]) print_fmt    ("nb_read_packets", "%"PRIu64, nb_streams_packets[stream_idx]);
     else                                print_str_opt("nb_read_packets", "N/A");
     show_tags(stream->metadata);
+    if (do_show_data)
+        writer_print_data(w, "extradata", dec_ctx->extradata,
+                                          dec_ctx->extradata_size);
 
     print_section_footer("stream");
     av_free(pbuf.s);
@@ -1675,6 +1709,7 @@ static const OptionDef options[] = {
       "prettify the format of displayed values, make it more human readable" },
     { "print_format", OPT_STRING | HAS_ARG, {(void*)&print_format},
       "set the output printing format (available formats are: default, compact, csv, json, xml)", "format" },
+    { "show_data",    OPT_BOOL, {(void*)&do_show_data}, "show packets data" },
     { "show_error",   OPT_BOOL, {(void*)&do_show_error} ,  "show probing error" },
     { "show_format",  OPT_BOOL, {(void*)&do_show_format} , "show format/container info" },
     { "show_frames",  OPT_BOOL, {(void*)&do_show_frames} , "show frames info" },
-- 
1.7.9.1



More information about the ffmpeg-devel mailing list