This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit 7304d104624536c620b2fdb92788d7cb617f7f33
Author:     James Almer <[email protected]>
AuthorDate: Tue Sep 29 00:15:00 2026 -0300
Commit:     James Almer <[email protected]>
CommitDate: Wed Oct 7 18:40:30 2026 -0300

    avutil/opt: add a serialization flag to exclude options with specific flags
    
    Useful for example for scenarios like wanting to serialize only options that
    are not marked as deprecated.
    
    Signed-off-by: James Almer <[email protected]>
---
 doc/APIchanges        |  3 +++
 libavutil/opt.c       | 16 ++++++++++++----
 libavutil/opt.h       | 11 ++++++++++-
 libavutil/tests/opt.c | 34 +++++++++++++++++++++++++++++-----
 libavutil/version.h   |  2 +-
 tests/ref/fate/opt    |  7 +++++++
 6 files changed, 62 insertions(+), 11 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index f6e68f5eac..01c9639022 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -2,6 +2,9 @@ The last version increases of all libraries were on 2026-06-23.
 
 API changes, most recent first:
 
+2026-10-07 - xxxxxxxxxx - lavu 61.12.100 - opt.h
+  Add AV_OPT_SERIALIZE_OPT_FLAGS_EXCLUDE.
+
 2026-10-03 - xxxxxxxxxx - lavu 61.11.100 - pixfmt.h
   Add AV_PIX_FMT_XYZP12LE, AV_PIX_FMT_XYZP12BE, and AV_PIX_FMT_XYZP12.
 
diff --git a/libavutil/opt.c b/libavutil/opt.c
index 8c3678d1be..b02efb9ff9 100644
--- a/libavutil/opt.c
+++ b/libavutil/opt.c
@@ -2816,10 +2816,18 @@ static int opt_serialize(void *obj, int opt_flags, int 
flags, int *cnt,
     while (o = av_opt_next(obj, o)) {
         if (o->type == AV_OPT_TYPE_CONST)
             continue;
-        if ((flags & AV_OPT_SERIALIZE_OPT_FLAGS_EXACT) && o->flags != 
opt_flags)
-            continue;
-        else if (((o->flags & opt_flags) != opt_flags))
-            continue;
+        if ((flags & AV_OPT_SERIALIZE_OPT_FLAGS_EXCLUDE)) {
+            if ((flags & AV_OPT_SERIALIZE_OPT_FLAGS_EXACT)) {
+                if (o->flags == opt_flags)
+                    continue;
+            } else if ((o->flags & opt_flags) == opt_flags)
+                continue;
+        } else {
+            if ((flags & AV_OPT_SERIALIZE_OPT_FLAGS_EXACT) && o->flags != 
opt_flags)
+                continue;
+            else if (((o->flags & opt_flags) != opt_flags))
+                continue;
+        }
         if (flags & AV_OPT_SERIALIZE_SKIP_DEFAULTS && 
av_opt_is_set_to_default(obj, o) > 0)
             continue;
         if ((ret = av_opt_get(obj, o->name, 0, &buf)) < 0) {
diff --git a/libavutil/opt.h b/libavutil/opt.h
index 7ab2b7ad7d..e14ad3f2f9 100644
--- a/libavutil/opt.h
+++ b/libavutil/opt.h
@@ -1090,8 +1090,17 @@ int av_opt_is_set_to_default_by_name(void *obj, const 
char *name, int search_fla
 int av_opt_flag_is_set(void *obj, const char *field_name, const char 
*flag_name);
 
 #define AV_OPT_SERIALIZE_SKIP_DEFAULTS              0x00000001  ///< Serialize 
options that are not set to default values only.
-#define AV_OPT_SERIALIZE_OPT_FLAGS_EXACT            0x00000002  ///< Serialize 
options that exactly match opt_flags only.
+/**
+ * Match only options with the exact @ref AVOption.flags flags
+ * in @ref opt_flags, for exclusion or inclusion in serialization.
+ */
+#define AV_OPT_SERIALIZE_OPT_FLAGS_EXACT            0x00000002
 #define AV_OPT_SERIALIZE_SEARCH_CHILDREN            0x00000004  ///< Serialize 
options in possible children of the given object.
+/**
+ * Serialize options with @ref AVOption.flags flags not
+ * in @ref opt_flags.
+ */
+#define AV_OPT_SERIALIZE_OPT_FLAGS_EXCLUDE          0x00000008
 
 /**
  * Serialize object's options.
diff --git a/libavutil/tests/opt.c b/libavutil/tests/opt.c
index 04d5526dcd..4c167e2e49 100644
--- a/libavutil/tests/opt.c
+++ b/libavutil/tests/opt.c
@@ -385,19 +385,19 @@ int main(void)
             if (ret < 0)
                 printf("Error ret '%d'\n", ret);
             if (av_opt_serialize(&test_ctx, 0, 0, &buf, '=', ',') >= 0) {
-                ChildContext child_ctx = { 0 };
+                ChildContext child_ctx = { .child_num64 = 1, .child_unum = 1 };
                 printf("%s\n", buf);
                 av_free(buf);
                 child_ctx.class = &child_class;
                 test_ctx.child = &child_ctx;
-                if (av_opt_serialize(&test_ctx, 0,
-                                     
AV_OPT_SERIALIZE_SKIP_DEFAULTS|AV_OPT_SERIALIZE_SEARCH_CHILDREN,
+                printf("Exclude flag EXPORT:\n");
+                if (av_opt_serialize(&test_ctx, AV_OPT_FLAG_EXPORT,
+                                     
AV_OPT_SERIALIZE_SKIP_DEFAULTS|AV_OPT_SERIALIZE_SEARCH_CHILDREN|
+                                     AV_OPT_SERIALIZE_OPT_FLAGS_EXCLUDE,
                                      &buf, '=', ',') >= 0) {
                     printf("%s\n", buf);
                     av_free(buf);
                 }
-                child_ctx.child_num64 = 1;
-                child_ctx.child_unum = 1;
                 printf("Include flag EXPORT:\n");
                 if (av_opt_serialize(&test_ctx, AV_OPT_FLAG_EXPORT,
                                      
AV_OPT_SERIALIZE_SKIP_DEFAULTS|AV_OPT_SERIALIZE_SEARCH_CHILDREN,
@@ -405,6 +405,14 @@ int main(void)
                     printf("%s\n", buf);
                     av_free(buf);
                 }
+                printf("Exclude flag 1:\n");
+                if (av_opt_serialize(&test_ctx, 1,
+                                     
AV_OPT_SERIALIZE_SKIP_DEFAULTS|AV_OPT_SERIALIZE_SEARCH_CHILDREN|
+                                     AV_OPT_SERIALIZE_OPT_FLAGS_EXCLUDE,
+                                     &buf, '=', ',') >= 0) {
+                    printf("%s\n", buf);
+                    av_free(buf);
+                }
                 printf("Include flag 1:\n");
                 if (av_opt_serialize(&test_ctx, 1,
                                      
AV_OPT_SERIALIZE_SKIP_DEFAULTS|AV_OPT_SERIALIZE_SEARCH_CHILDREN,
@@ -412,6 +420,14 @@ int main(void)
                     printf("%s\n", buf);
                     av_free(buf);
                 }
+                printf("Exclude exact match flag 1:\n");
+                if (av_opt_serialize(&test_ctx, 1,
+                                     
AV_OPT_SERIALIZE_SKIP_DEFAULTS|AV_OPT_SERIALIZE_SEARCH_CHILDREN|
+                                     
AV_OPT_SERIALIZE_OPT_FLAGS_EXACT|AV_OPT_SERIALIZE_OPT_FLAGS_EXCLUDE,
+                                     &buf, '=', ',') >= 0) {
+                    printf("%s\n", buf);
+                    av_free(buf);
+                }
                 printf("Include exact match flag 1:\n");
                 if (av_opt_serialize(&test_ctx, 1,
                                      
AV_OPT_SERIALIZE_SKIP_DEFAULTS|AV_OPT_SERIALIZE_SEARCH_CHILDREN|
@@ -420,6 +436,14 @@ int main(void)
                     printf("%s\n", buf);
                     av_free(buf);
                 }
+                printf("Exclude exact match flag EXPORT|READONLY:\n");
+                if (av_opt_serialize(&test_ctx, AV_OPT_FLAG_EXPORT | 
AV_OPT_FLAG_READONLY,
+                                     
AV_OPT_SERIALIZE_SKIP_DEFAULTS|AV_OPT_SERIALIZE_SEARCH_CHILDREN|
+                                     
AV_OPT_SERIALIZE_OPT_FLAGS_EXACT|AV_OPT_SERIALIZE_OPT_FLAGS_EXCLUDE,
+                                     &buf, '=', ',') >= 0) {
+                    printf("%s\n", buf);
+                    av_free(buf);
+                }
                 printf("Include exact match flag EXPORT|READONLY:\n");
                 if (av_opt_serialize(&test_ctx, AV_OPT_FLAG_EXPORT | 
AV_OPT_FLAG_READONLY,
                                      
AV_OPT_SERIALIZE_SKIP_DEFAULTS|AV_OPT_SERIALIZE_SEARCH_CHILDREN|
diff --git a/libavutil/version.h b/libavutil/version.h
index edc3fa5832..72219abbb9 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@
  */
 
 #define LIBAVUTIL_VERSION_MAJOR  61
-#define LIBAVUTIL_VERSION_MINOR   11
+#define LIBAVUTIL_VERSION_MINOR  12
 #define LIBAVUTIL_VERSION_MICRO 100
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
diff --git a/tests/ref/fate/opt b/tests/ref/fate/opt
index 86f809c433..d14245ee6a 100644
--- a/tests/ref/fate/opt
+++ b/tests/ref/fate/opt
@@ -191,13 +191,20 @@ Setting entry with key 'array_int' to value ''
 Setting entry with key 'array_str' to value 'str0|str\|1|str\\2'
 Setting entry with key 'array_dict' to value 
'k00=v\\\\00:k01=v\,01,k10=v\\=1\\:0'
 
num=0,unum=2147483648,toggle=1,rational=1/1,string=default,escape=\\\=\,,flags=0x00000001,size=200x300,pix_fmt=0bgr,sample_fmt=s16,video_rate=25/1,duration=0.001,color=0xffc0cbff,cl=hexagonal,bin=62696E00,bin1=,bin2=,num64=4294967296,flt=0.333333,dbl=0.333333,bool1=auto,bool2=true,bool3=false,dict1=,dict2=happy\=\\:-),array_int=,array_str=str0|str\\|1|str\\\\2,array_dict=k00\=v\\\\\\\\00:k01\=v\\\,01\,k10\=v\\\\\=1\\\\:0
+Exclude flag EXPORT:
 child_num=0,flt=0.333333,dbl=0.333333
 Include flag EXPORT:
 child_num64=1,child_unum=1
+Exclude flag 1:
+child_unum=1
 Include flag 1:
 child_num64=1,child_num=0,flt=0.333333,dbl=0.333333
+Exclude exact match flag 1:
+child_num64=1,child_unum=1
 Include exact match flag 1:
 child_num=0,flt=0.333333,dbl=0.333333
+Exclude exact match flag EXPORT|READONLY:
+child_num64=1,child_num=0,flt=0.333333,dbl=0.333333
 Include exact match flag EXPORT|READONLY:
 child_unum=1
 

-- 
To stop receiving notification emails like this one, please contact
[email protected].
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to