]> git.sesse.net Git - ffmpeg/blobdiff - avprobe.c
examples/decode_video: constify the AVCodec instance
[ffmpeg] / avprobe.c
index 5b9a7ec25c5f2fe898fce084f46573292e9955bf..ff28a0b343133bec740e93872890be840e615535 100644 (file)
--- a/avprobe.c
+++ b/avprobe.c
@@ -54,6 +54,11 @@ static AVDictionary *fmt_entries_to_show = NULL;
 static int nb_fmt_entries_to_show;
 static int do_show_packets = 0;
 static int do_show_streams = 0;
+static AVDictionary *stream_entries_to_show = NULL;
+static int nb_stream_entries_to_show;
+
+/* key used to print when probe_{int,str}(NULL, ..) is invoked */
+static const char *header_key;
 
 static int show_value_unit              = 0;
 static int use_value_prefix             = 0;
@@ -78,6 +83,7 @@ static const char unit_bit_per_second_str[] = "bit/s";
 static void avprobe_cleanup(int ret)
 {
     av_dict_free(&fmt_entries_to_show);
+    av_dict_free(&stream_entries_to_show);
 }
 
 /*
@@ -402,6 +408,37 @@ static void show_format_entry_string(const char *key, const char *value)
     }
 }
 
+static void show_stream_entry_header(const char *key, int value)
+{
+    header_key = key;
+}
+
+static void show_stream_entry_footer(const char *key, int value)
+{
+    header_key = NULL;
+}
+
+static void show_stream_entry_integer(const char *key, int64_t value)
+{
+    if (!key)
+        key = header_key;
+
+    if (key && av_dict_get(stream_entries_to_show, key, NULL, 0)) {
+        if (nb_stream_entries_to_show > 1)
+            avio_printf(probe_out, "%s=", key);
+        avio_printf(probe_out, "%"PRId64"\n", value);
+    }
+}
+
+static void show_stream_entry_string(const char *key, const char *value)
+{
+    if (key && av_dict_get(stream_entries_to_show, key, NULL, 0)) {
+        if (nb_stream_entries_to_show > 1)
+            avio_printf(probe_out, "%s=", key);
+        avio_printf(probe_out, "%s\n", value);
+    }
+}
+
 static void probe_group_enter(const char *name, int type)
 {
     int64_t count = -1;
@@ -973,6 +1010,23 @@ static int opt_show_format_entry(void *optctx, const char *opt, const char *arg)
     return 0;
 }
 
+static int opt_show_stream_entry(void *optctx, const char *opt, const char *arg)
+{
+    do_show_streams = 1;
+    nb_stream_entries_to_show++;
+    octx.print_header        = NULL;
+    octx.print_footer        = NULL;
+    octx.print_array_header  = show_stream_entry_header;
+    octx.print_array_footer  = show_stream_entry_footer;
+    octx.print_object_header = NULL;
+    octx.print_object_footer = NULL;
+
+    octx.print_integer = show_stream_entry_integer;
+    octx.print_string  = show_stream_entry_string;
+    av_dict_set(&stream_entries_to_show, arg, "", 0);
+    return 0;
+}
+
 static void opt_input_file(void *optctx, const char *arg)
 {
     if (input_filename) {
@@ -1023,6 +1077,8 @@ static const OptionDef real_options[] = {
       "show a particular entry from the format/container info", "entry" },
     { "show_packets", OPT_BOOL, {&do_show_packets}, "show packets info" },
     { "show_streams", OPT_BOOL, {&do_show_streams}, "show streams info" },
+    { "show_stream_entry", HAS_ARG, {.func_arg = opt_show_stream_entry},
+      "show a particular entry from all streams", "entry" },
     { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {.func_arg = opt_default},
       "generic catch all option", "" },
     { NULL, },
@@ -1039,7 +1095,7 @@ static int probe_buf_write(void *opaque, uint8_t *buf, int buf_size)
 int main(int argc, char **argv)
 {
     int ret;
-    uint8_t *buffer = av_mallocz(AVP_BUFFSIZE);
+    uint8_t *buffer = av_malloc(AVP_BUFFSIZE);
 
     if (!buffer)
         exit(1);
@@ -1089,7 +1145,7 @@ int main(int argc, char **argv)
     avio_flush(probe_out);
     av_freep(&probe_out);
     av_freep(&buffer);
-
+    uninit_opts();
     avformat_network_deinit();
 
     return ret;