[FFmpeg-devel] [PATCH] ffprobe: add "print_wrappers" option to default writer
Stefano Sabatini
stefasab at gmail.com
Wed May 9 01:36:05 CEST 2012
The option is useful for simplifying parsing.
---
doc/ffprobe.texi | 13 +++++++++++
ffprobe.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 69 insertions(+), 4 deletions(-)
diff --git a/doc/ffprobe.texi b/doc/ffprobe.texi
index 47c2156..263bbe3 100644
--- a/doc/ffprobe.texi
+++ b/doc/ffprobe.texi
@@ -195,6 +195,19 @@ keyN=valN
Metadata tags are printed as a line in the corresponding FORMAT or
STREAM section, and are prefixed by the string "TAG:".
+This writer accepts options as a list of @var{key}=@var{value} pairs,
+separated by ":".
+
+A description of the accepted options follows.
+
+ at table @option
+
+ at item print_wrappers, w
+If set to 1 specify to print the section header and footer, if set to
+0 it will not. Default value is 1.
+
+ at end table
+
@section compact
Compact format.
diff --git a/ffprobe.c b/ffprobe.c
index fb37d08..e90d82a 100644
--- a/ffprobe.c
+++ b/ffprobe.c
@@ -401,14 +401,60 @@ fail:
/* Default output */
+typedef struct DefaultContext {
+ const AVClass *class;
+ int print_wrappers;
+} DefaultContext;
+
+#define OFFSET(x) offsetof(DefaultContext, x)
+
+static const AVOption default_options[] = {
+ { "print_wrappers", "print headers and footers", OFFSET(print_wrappers), AV_OPT_TYPE_INT, {.dbl=1}, 0, 1 },
+ { "w", "print headers and footers", OFFSET(print_wrappers), AV_OPT_TYPE_INT, {.dbl=1}, 0, 1 },
+ {NULL},
+};
+
+static const char *default_get_name(void *ctx)
+{
+ return "default";
+}
+
+static const AVClass default_class = {
+ "DefaultContext",
+ default_get_name,
+ default_options
+};
+
+static av_cold int default_init(WriterContext *wctx, const char *args, void *opaque)
+{
+ DefaultContext *def = wctx->priv;
+ int err;
+
+ def->class = &default_class;
+ av_opt_set_defaults(def);
+
+ if (args &&
+ (err = (av_set_options_string(def, args, "=", ":"))) < 0) {
+ av_log(wctx, AV_LOG_ERROR, "Error parsing options string: '%s'\n", args);
+ return err;
+ }
+
+ return 0;
+}
+
static void default_print_footer(WriterContext *wctx)
{
- printf("\n");
+ DefaultContext *def = wctx->priv;
+
+ if (def->print_wrappers)
+ printf("\n");
}
static void default_print_chapter_header(WriterContext *wctx, const char *chapter)
{
- if (wctx->nb_chapter)
+ DefaultContext *def = wctx->priv;
+
+ if (def->print_wrappers && wctx->nb_chapter)
printf("\n");
}
@@ -424,18 +470,22 @@ static inline char *upcase_string(char *dst, size_t dst_size, const char *src)
static void default_print_section_header(WriterContext *wctx, const char *section)
{
+ DefaultContext *def = wctx->priv;
char buf[32];
if (wctx->nb_section)
printf("\n");
- printf("[%s]\n", upcase_string(buf, sizeof(buf), section));
+ if (def->print_wrappers)
+ printf("[%s]\n", upcase_string(buf, sizeof(buf), section));
}
static void default_print_section_footer(WriterContext *wctx, const char *section)
{
+ DefaultContext *def = wctx->priv;
char buf[32];
- printf("[/%s]", upcase_string(buf, sizeof(buf), section));
+ if (def->print_wrappers)
+ printf("[/%s]", upcase_string(buf, sizeof(buf), section));
}
static void default_print_str(WriterContext *wctx, const char *key, const char *value)
@@ -460,6 +510,7 @@ static void default_show_tags(WriterContext *wctx, AVDictionary *dict)
static const Writer default_writer = {
.name = "default",
+ .init = default_init,
.print_footer = default_print_footer,
.print_chapter_header = default_print_chapter_header,
.print_section_header = default_print_section_header,
@@ -534,6 +585,7 @@ typedef struct CompactContext {
const char * (*escape_str)(AVBPrint *dst, const char *src, const char sep, void *log_ctx);
} CompactContext;
+#undef OFFSET
#define OFFSET(x) offsetof(CompactContext, x)
static const AVOption compact_options[]= {
--
1.7.5.4
More information about the ffmpeg-devel
mailing list