ffprobe: do not treat array elements as nested in the compact writer
authorStefano Sabatini <stefasab@gmail.com>
Sat, 27 Jul 2013 12:09:05 +0000 (14:09 +0200)
committerStefano Sabatini <stefasab@gmail.com>
Sun, 28 Jul 2013 14:38:50 +0000 (16:38 +0200)
This fixes rendering of sections containing nested elements followed by
an array, for example as in the case:
programs->streams->stream

enabled by the -show_programs option.

ffprobe.c

index d4adde0..17c05b5 100644 (file)
--- a/ffprobe.c
+++ b/ffprobe.c
@@ -675,6 +675,8 @@ typedef struct CompactContext {
     char *escape_mode_str;
     const char * (*escape_str)(AVBPrint *dst, const char *src, const char sep, void *log_ctx);
     int nested_section[SECTION_MAX_NB_LEVELS];
+    int has_nested_elems[SECTION_MAX_NB_LEVELS];
+    int terminate_line[SECTION_MAX_NB_LEVELS];
 } CompactContext;
 
 #undef OFFSET
@@ -722,18 +724,28 @@ static void compact_print_section_header(WriterContext *wctx)
     const struct section *section = wctx->section[wctx->level];
     const struct section *parent_section = wctx->level ?
         wctx->section[wctx->level-1] : NULL;
+    compact->terminate_line[wctx->level] = 1;
+    compact->has_nested_elems[wctx->level] = 0;
 
     av_bprint_clear(&wctx->section_pbuf[wctx->level]);
-    if (parent_section &&
+    if (!(section->flags & SECTION_FLAG_IS_ARRAY) && parent_section &&
         !(parent_section->flags & (SECTION_FLAG_IS_WRAPPER|SECTION_FLAG_IS_ARRAY))) {
         compact->nested_section[wctx->level] = 1;
+        compact->has_nested_elems[wctx->level-1] = 1;
         av_bprintf(&wctx->section_pbuf[wctx->level], "%s%s:",
                    wctx->section_pbuf[wctx->level-1].str,
                    (char *)av_x_if_null(section->element_name, section->name));
         wctx->nb_item[wctx->level] = wctx->nb_item[wctx->level-1];
-    } else if (compact->print_section &&
-        !(section->flags & (SECTION_FLAG_IS_WRAPPER|SECTION_FLAG_IS_ARRAY)))
-       printf("%s%c", section->name, compact->item_sep);
+    } else {
+        if (parent_section && compact->has_nested_elems[wctx->level-1] &&
+            (section->flags & SECTION_FLAG_IS_ARRAY)) {
+            compact->terminate_line[wctx->level-1] = 0;
+            printf("\n");
+        }
+        if (compact->print_section &&
+            !(section->flags & (SECTION_FLAG_IS_WRAPPER|SECTION_FLAG_IS_ARRAY)))
+            printf("%s%c", section->name, compact->item_sep);
+    }
 }
 
 static void compact_print_section_footer(WriterContext *wctx)
@@ -741,6 +753,7 @@ static void compact_print_section_footer(WriterContext *wctx)
     CompactContext *compact = wctx->priv;
 
     if (!compact->nested_section[wctx->level] &&
+        compact->terminate_line[wctx->level] &&
         !(wctx->section[wctx->level]->flags & (SECTION_FLAG_IS_WRAPPER|SECTION_FLAG_IS_ARRAY)))
         printf("\n");
 }