From: Rodger Combs <[email protected]>

---
 doc/APIchanges      |  3 +++
 libavutil/opt.c     | 12 ++++++++++--
 libavutil/opt.h     | 10 ++++++++++
 libavutil/version.h |  2 +-
 4 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 4c5e32e..bbffbb4 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,9 @@ libavutil:     2015-08-28
 
 API changes, most recent first:
 
+2015-xx-xx - xxxxxxx - lavu 55.4.0 - opt.h
+  Add AV_OPT_ALLOW_NULL
+
 2015-xx-xx - xxxxxxx - lavc 57.11.0 - avcodec.h dirac.h
   xxxxxxx - Add av_packet_add_side_data().
   xxxxxxx - Add AVCodecContext.coded_side_data.
diff --git a/libavutil/opt.c b/libavutil/opt.c
index b3435e0..eb37c60 100644
--- a/libavutil/opt.c
+++ b/libavutil/opt.c
@@ -348,12 +348,20 @@ int av_opt_get(void *obj, const char *name, int 
search_flags, uint8_t **out_val)
     case AV_OPT_TYPE_DOUBLE:    ret = snprintf(buf, sizeof(buf), "%f" ,     
*(double *)dst);break;
     case AV_OPT_TYPE_RATIONAL:  ret = snprintf(buf, sizeof(buf), "%d/%d",   
((AVRational*)dst)->num, ((AVRational*)dst)->den);break;
     case AV_OPT_TYPE_STRING:
-        if (*(uint8_t**)dst)
+        if (*(uint8_t**)dst) {
             *out_val = av_strdup(*(uint8_t**)dst);
-        else
+        } else if (search_flags & AV_OPT_ALLOW_NULL) {
+            *out_val = NULL;
+            return 0;
+        } else {
             *out_val = av_strdup("");
+        }
         return *out_val ? 0 : AVERROR(ENOMEM);
     case AV_OPT_TYPE_BINARY:
+        if (!*(uint8_t**)dst && (search_flags & AV_OPT_ALLOW_NULL)) {
+            *out_val = NULL;
+            return 0;
+        }
         len = *(int*)(((uint8_t *)dst) + sizeof(uint8_t *));
         if ((uint64_t)len*2 + 1 > INT_MAX)
             return AVERROR(EINVAL);
diff --git a/libavutil/opt.h b/libavutil/opt.h
index 6d3f1fe..7214e68 100644
--- a/libavutil/opt.h
+++ b/libavutil/opt.h
@@ -391,6 +391,12 @@ int av_opt_eval_q     (void *obj, const AVOption *o, const 
char *val, AVRational
 #define AV_OPT_SEARCH_FAKE_OBJ   0x0002
 
 /**
+ *  In av_opt_get, return NULL if the option has a pointer type and is set to
+ *  NULL, rather than returning an empty string.
+ */
+#define AV_OPT_ALLOW_NULL        0x0004
+
+/**
  * Look for an option in an object. Consider only options which
  * have all the specified flags set.
  *
@@ -520,6 +526,10 @@ int av_opt_set_dict_val(void *obj, const char *name, const 
AVDictionary *val, in
  */
 /**
  * @note the returned string will be av_malloc()ed and must be av_free()ed by 
the caller
+ *
+ * @note if AV_OPT_ALLOW_NULL is set in search_flags in av_opt_get, and the 
option has
+ * AV_OPT_TYPE_STRING or AV_OPT_TYPE_BINARY and is set to NULL, *out_val will 
be set
+ * to NULL instead of an allocated empty string.
  */
 int av_opt_get         (void *obj, const char *name, int search_flags, uint8_t 
  **out_val);
 int av_opt_get_int     (void *obj, const char *name, int search_flags, int64_t 
   *out_val);
diff --git a/libavutil/version.h b/libavutil/version.h
index 7131122..802a445 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -54,7 +54,7 @@
  */
 
 #define LIBAVUTIL_VERSION_MAJOR 55
-#define LIBAVUTIL_VERSION_MINOR  3
+#define LIBAVUTIL_VERSION_MINOR  4
 #define LIBAVUTIL_VERSION_MICRO  0
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
-- 
2.4.9 (Apple Git-60)

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to