[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