diff --git a/ffprobe.c b/ffprobe.c index d4adde06e8..17c05b532a 100644 --- 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"); }