avutil/opt: print more meaningful default flags values
authorClément Bœsch <u@pkh.me>
Sat, 24 Oct 2015 13:14:33 +0000 (15:14 +0200)
committerClément Bœsch <u@pkh.me>
Sun, 25 Oct 2015 21:47:16 +0000 (22:47 +0100)
Example:
% ./ffmpeg -h encoder=gif
[...]
GIF encoder AVOptions:
  -gifflags          <flags>      E..V.... set GIF flags (default offsetting+transdiff)
     offsetting                   E..V.... enable picture offsetting
     transdiff                    E..V.... enable transparency detection between frames

libavutil/opt.c
tests/ref/fate/opt

index 36eeeb0..da1eb16 100644 (file)
@@ -941,6 +941,27 @@ static const char *get_opt_const_name(void *obj, const char *unit, int64_t value
     return NULL;
 }
 
     return NULL;
 }
 
+static char *get_opt_flags_string(void *obj, const char *unit, int64_t value)
+{
+    const AVOption *opt = NULL;
+    char flags[512];
+
+    flags[0] = 0;
+    if (!unit)
+        return NULL;
+    while ((opt = av_opt_next(obj, opt))) {
+        if (opt->type == AV_OPT_TYPE_CONST && !strcmp(opt->unit, unit) &&
+            opt->default_val.i64 & value) {
+            if (flags[0])
+                av_strlcatf(flags, sizeof(flags), "+");
+            av_strlcatf(flags, sizeof(flags), "%s", opt->name);
+        }
+    }
+    if (flags[0])
+        return av_strdup(flags);
+    return NULL;
+}
+
 static void opt_list(void *obj, void *av_log_obj, const char *unit,
                      int req_flags, int rej_flags)
 {
 static void opt_list(void *obj, void *av_log_obj, const char *unit,
                      int req_flags, int rej_flags)
 {
@@ -1066,9 +1087,16 @@ static void opt_list(void *obj, void *av_log_obj, const char *unit,
             case AV_OPT_TYPE_BOOL:
                 av_log(av_log_obj, AV_LOG_INFO, "%s", (char *)av_x_if_null(get_bool_name(opt->default_val.i64), "invalid"));
                 break;
             case AV_OPT_TYPE_BOOL:
                 av_log(av_log_obj, AV_LOG_INFO, "%s", (char *)av_x_if_null(get_bool_name(opt->default_val.i64), "invalid"));
                 break;
-            case AV_OPT_TYPE_FLAGS:
-                av_log(av_log_obj, AV_LOG_INFO, "%"PRIX64, opt->default_val.i64);
+            case AV_OPT_TYPE_FLAGS: {
+                char *def_flags = get_opt_flags_string(obj, opt->unit, opt->default_val.i64);
+                if (def_flags) {
+                    av_log(av_log_obj, AV_LOG_INFO, "%s", def_flags);
+                    av_freep(&def_flags);
+                } else {
+                    av_log(av_log_obj, AV_LOG_INFO, "%"PRIX64, opt->default_val.i64);
+                }
                 break;
                 break;
+            }
             case AV_OPT_TYPE_DURATION:
                 log_value(av_log_obj, AV_LOG_INFO, opt->default_val.i64);
                 break;
             case AV_OPT_TYPE_DURATION:
                 log_value(av_log_obj, AV_LOG_INFO, opt->default_val.i64);
                 break;
index 307da37..e9132a5 100644 (file)
@@ -23,7 +23,7 @@ TestContext AVOptions:
   -rational          <rational>   E....... set rational (from 0 to 10) (default 1/1)
   -string            <string>     E....... set string (default "default")
   -escape            <string>     E....... set escape str (default "\=,")
   -rational          <rational>   E....... set rational (from 0 to 10) (default 1/1)
   -string            <string>     E....... set string (default "default")
   -escape            <string>     E....... set escape str (default "\=,")
-  -flags             <flags>      E....... set flags (default 1)
+  -flags             <flags>      E....... set flags (default cool)
      cool                         E....... set cool flag
      lame                         E....... set lame flag
      mu                           E....... set mu flag
      cool                         E....... set cool flag
      lame                         E....... set lame flag
      mu                           E....... set mu flag