diff --git a/Changelog b/Changelog index 2f038022cc..bca5568761 100644 --- a/Changelog +++ b/Changelog @@ -28,6 +28,7 @@ version : - new expansion syntax for drawtext - BRender PIX image decoder - ffprobe -show_entries option +- ffprobe -sections option version 1.0: diff --git a/doc/ffprobe.texi b/doc/ffprobe.texi index aacb14cfa3..08aef13dbf 100644 --- a/doc/ffprobe.texi +++ b/doc/ffprobe.texi @@ -45,6 +45,10 @@ ffprobe output is designed to be easily parsable by a textual filter, and consists of one or more sections of a form defined by the selected writer, which is specified by the @option{print_format} option. +Sections may contain other nested sections, and are identified by a +name (which may be shared by other sections), and an unique +name. See the output of @option{sections}. + Metadata tags stored in the container or in the streams are recognized and printed in the corresponding "FORMAT" or "STREAM" section. @@ -94,6 +98,10 @@ For example for printing the output in JSON format, specify: For more details on the available output printing formats, see the Writers section below. +@item -sections +Print sections structure and section information, and exit. The output +is not meant to be parsed by a machine. + @item -select_streams @var{stream_specifier} Select only the streams specified by @var{stream_specifier}. This option affects only the options related to streams diff --git a/ffprobe.c b/ffprobe.c index fc665a7a02..f7374b3877 100644 --- a/ffprobe.c +++ b/ffprobe.c @@ -2105,6 +2105,35 @@ static int opt_pretty(void *optctx, const char *opt, const char *arg) return 0; } +static void print_section(SectionID id, int level) +{ + const SectionID *pid; + const struct section *section = §ions[id]; + printf("%c%c%c", + section->flags & SECTION_FLAG_IS_WRAPPER ? 'W' : '.', + section->flags & SECTION_FLAG_IS_ARRAY ? 'A' : '.', + section->flags & SECTION_FLAG_HAS_VARIABLE_FIELDS ? 'V' : '.'); + printf("%*c %s", level * 4, ' ', section->name); + if (section->unique_name) + printf("/%s", section->unique_name); + printf("\n"); + + for (pid = section->children_ids; *pid != -1; pid++) + print_section(*pid, level+1); +} + +static int opt_sections(void *optctx, const char *opt, const char *arg) +{ + printf("Sections:\n" + "W.. = Section is a wrapper (contains other sections, no local entries)\n" + ".A. = Section contains an array of elements of the same type\n" + "..V = Section may contain a variable number of fields with variable keys\n" + "FLAGS NAME/UNIQUE_NAME\n" + "---\n"); + print_section(SECTION_ID_ROOT, 0); + return 0; +} + static int opt_show_versions(const char *opt, const char *arg) { mark_section_show_entries(SECTION_ID_PROGRAM_VERSION, 1, NULL); @@ -2142,6 +2171,7 @@ static const OptionDef real_options[] = { "set the output printing format (available formats are: default, compact, csv, flat, ini, json, xml)", "format" }, { "of", OPT_STRING | HAS_ARG, {(void*)&print_format}, "alias for -print_format", "format" }, { "select_streams", OPT_STRING | HAS_ARG, {(void*)&stream_specifier}, "select the specified streams", "stream_specifier" }, + { "sections", OPT_EXIT, {.func_arg = opt_sections}, "print sections structure and section information, and exit" }, { "show_data", OPT_BOOL, {(void*)&do_show_data}, "show packets data" }, { "show_error", 0, {(void*)&opt_show_error}, "show probing error" }, { "show_format", 0, {(void*)&opt_show_format}, "show format/container info" },