In addition to "no", also allow "no_", "disable" and "disable_".
---
On 20/08/2020 18:49, Nicolas George wrote:
Alexander Strasser (12020-08-17):
Here are some suggestions in no particular order:

* auto_conversion_filters (from Marton)

I can be ok with this one. I really dislike boolean options that default
to yes and have to be disabled with no, because it requires remembering
what the default is, but if that is what everybody else prefers.

But we can fix that to be nicer!

With this patch, -disable_auto_conversion_filters does what you want.

(The duplication below is because one part is used for ffmpeg and the other for 
ffplay/ffprobe.)

- Mark


 fftools/cmdutils.c | 42 +++++++++++++++++++++++++++++++++---------
 1 file changed, 33 insertions(+), 9 deletions(-)

diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
index 88fdbeaf1e..1a1740b46e 100644
--- a/fftools/cmdutils.c
+++ b/fftools/cmdutils.c
@@ -345,6 +345,13 @@ static int write_option(void *optctx, const OptionDef *po, 
const char *opt,
     return 0;
 }

+static const char *negative_prefixes[] = {
+    "no_",
+    "no",
+    "disable_",
+    "disable",
+};
+
 int parse_option(void *optctx, const char *opt, const char *arg,
                  const OptionDef *options)
 {
@@ -352,11 +359,18 @@ int parse_option(void *optctx, const char *opt, const 
char *arg,
     int ret;

     po = find_option(options, opt);
-    if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
-        /* handle 'no' bool option */
-        po = find_option(options, opt + 2);
-        if ((po->name && (po->flags & OPT_BOOL)))
-            arg = "0";
+    if (!po->name) {
+        /* Try to match a boolean option with a negative prefix. */
+        for (int i = 0; i < FF_ARRAY_ELEMS(negative_prefixes); i++) {
+            size_t len = strlen(negative_prefixes[i]);
+            if (!strncmp(opt, negative_prefixes[i], len)) {
+                po = find_option(options, opt + len);
+                if (po->name && (po->flags & OPT_BOOL)) {
+                    arg = "0";
+                    break;
+                }
+            }
+        }
     } else if (po->flags & OPT_BOOL)
         arg = "1";

@@ -764,6 +778,7 @@ int split_commandline(OptionParseContext *octx, int argc, 
char *argv[],
     while (optindex < argc) {
         const char *opt = argv[optindex++], *arg;
         const OptionDef *po;
+        int negative_match;
         int ret;

         av_log(NULL, AV_LOG_DEBUG, "Reading option '%s' ...", opt);
@@ -831,10 +846,19 @@ do {                                                      
                     \
             }
         }

-        /* boolean -nofoo options */
-        if (opt[0] == 'n' && opt[1] == 'o' &&
-            (po = find_option(options, opt + 2)) &&
-            po->name && po->flags & OPT_BOOL) {
+        /* Boolean options with a negative prefix. */
+        negative_match = 0;
+        for (int i = 0; i < FF_ARRAY_ELEMS(negative_prefixes); i++) {
+            size_t len = strlen(negative_prefixes[i]);
+            if (!strncmp(opt, negative_prefixes[i], len)) {
+                po = find_option(options, opt + len);
+                if (po->name && (po->flags & OPT_BOOL)) {
+                    negative_match = 1;
+                    break;
+                }
+            }
+        }
+        if (negative_match) {
             add_opt(octx, po, opt, "0");
             av_log(NULL, AV_LOG_DEBUG, " matched as option '%s' (%s) with "
                    "argument 0.\n", po->name, po->help);
--
2.28.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to