avprobe: Support writing arrays of integers without keys
authorMartin Storsjö <martin@martin.st>
Sat, 2 May 2015 08:22:13 +0000 (11:22 +0300)
committerMartin Storsjö <martin@martin.st>
Sat, 2 May 2015 19:09:09 +0000 (22:09 +0300)
Signed-off-by: Martin Storsjö <martin@martin.st>
avprobe.c

index d969257..ebc41df 100644 (file)
--- a/avprobe.c
+++ b/avprobe.c
@@ -97,8 +97,8 @@ typedef struct PrintContext {
     void (*print_header)(void);
     void (*print_footer)(void);
 
-    void (*print_array_header) (const char *name);
-    void (*print_array_footer) (const char *name);
+    void (*print_array_header) (const char *name, int plain_values);
+    void (*print_array_footer) (const char *name, int plain_values);
     void (*print_object_header)(const char *name);
     void (*print_object_footer)(const char *name);
 
@@ -157,9 +157,21 @@ static void ini_escape_print(const char *s)
     }
 }
 
-static void ini_print_array_header(const char *name)
+static void ini_print_array_header(const char *name, int plain_values)
 {
-    if (octx.prefix[octx.level -1].nb_elems)
+    if (!plain_values) {
+        /* Add a new line if we create a new full group */
+        if (octx.prefix[octx.level -1].nb_elems)
+            avio_printf(probe_out, "\n");
+    } else {
+        ini_escape_print(name);
+        avio_w8(probe_out, '=');
+    }
+}
+
+static void ini_print_array_footer(const char *name, int plain_values)
+{
+    if (plain_values)
         avio_printf(probe_out, "\n");
 }
 
@@ -188,8 +200,14 @@ static void ini_print_object_header(const char *name)
 
 static void ini_print_integer(const char *key, int64_t value)
 {
-    ini_escape_print(key);
-    avio_printf(probe_out, "=%"PRId64"\n", value);
+    if (key) {
+        ini_escape_print(key);
+        avio_printf(probe_out, "=%"PRId64"\n", value);
+    } else {
+        if (octx.prefix[octx.level -1].nb_elems)
+            avio_printf(probe_out, ",");
+        avio_printf(probe_out, "%"PRId64, value);
+    }
 }
 
 
@@ -214,7 +232,7 @@ static void json_print_footer(void)
     avio_printf(probe_out, "}\n");
 }
 
-static void json_print_array_header(const char *name)
+static void json_print_array_header(const char *name, int plain_values)
 {
     if (octx.prefix[octx.level -1].nb_elems)
         avio_printf(probe_out, ",\n");
@@ -223,7 +241,7 @@ static void json_print_array_header(const char *name)
     avio_printf(probe_out, "[\n");
 }
 
-static void json_print_array_footer(const char *name)
+static void json_print_array_footer(const char *name, int plain_values)
 {
     avio_printf(probe_out, "\n");
     AVP_INDENT();
@@ -249,10 +267,18 @@ static void json_print_object_footer(const char *name)
 
 static void json_print_integer(const char *key, int64_t value)
 {
-    if (octx.prefix[octx.level -1].nb_elems)
-        avio_printf(probe_out, ",\n");
-    AVP_INDENT();
-    avio_printf(probe_out, "\"%s\" : %"PRId64"", key, value);
+    if (key) {
+        if (octx.prefix[octx.level -1].nb_elems)
+            avio_printf(probe_out, ",\n");
+        AVP_INDENT();
+        avio_printf(probe_out, "\"%s\" : ", key);
+    } else {
+        if (octx.prefix[octx.level -1].nb_elems)
+            avio_printf(probe_out, ", ");
+        else
+            AVP_INDENT();
+    }
+    avio_printf(probe_out, "%"PRId64, value);
 }
 
 static void json_escape_print(const char *s)
@@ -403,19 +429,19 @@ static void probe_footer(void)
 }
 
 
-static void probe_array_header(const char *name)
+static void probe_array_header(const char *name, int plain_values)
 {
     if (octx.print_array_header)
-        octx.print_array_header(name);
+        octx.print_array_header(name, plain_values);
 
     probe_group_enter(name, ARRAY);
 }
 
-static void probe_array_footer(const char *name)
+static void probe_array_footer(const char *name, int plain_values)
 {
     probe_group_leave();
     if (octx.print_array_footer)
-        octx.print_array_footer(name);
+        octx.print_array_footer(name, plain_values);
 }
 
 static void probe_object_header(const char *name)
@@ -561,10 +587,10 @@ static void show_packets(AVFormatContext *fmt_ctx)
     AVPacket pkt;
 
     av_init_packet(&pkt);
-    probe_array_header("packets");
+    probe_array_header("packets", 0);
     while (!av_read_frame(fmt_ctx, &pkt))
         show_packet(fmt_ctx, &pkt);
-    probe_array_footer("packets");
+    probe_array_footer("packets", 0);
 }
 
 static void show_stream(AVFormatContext *fmt_ctx, int stream_idx)
@@ -779,10 +805,10 @@ static int probe_file(const char *filename)
         show_format(fmt_ctx);
 
     if (do_show_streams) {
-        probe_array_header("streams");
+        probe_array_header("streams", 0);
         for (i = 0; i < fmt_ctx->nb_streams; i++)
             show_stream(fmt_ctx, i);
-        probe_array_footer("streams");
+        probe_array_footer("streams", 0);
     }
 
     if (do_show_packets)
@@ -826,6 +852,7 @@ static int opt_output_format(void *optctx, const char *opt, const char *arg)
         octx.print_header        = ini_print_header;
         octx.print_footer        = ini_print_footer;
         octx.print_array_header  = ini_print_array_header;
+        octx.print_array_footer  = ini_print_array_footer;
         octx.print_object_header = ini_print_object_header;
 
         octx.print_integer = ini_print_integer;
@@ -948,6 +975,7 @@ int main(int argc, char **argv)
     octx.print_footer = ini_print_footer;
 
     octx.print_array_header = ini_print_array_header;
+    octx.print_array_footer = ini_print_array_footer;
     octx.print_object_header = ini_print_object_header;
 
     octx.print_integer = ini_print_integer;