Commit 0562f959 authored by Rodger Combs's avatar Rodger Combs

lavu/opt: add flag to return NULL when applicable in av_opt_get

Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent f36baeeb
...@@ -666,12 +666,20 @@ int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val) ...@@ -666,12 +666,20 @@ int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
case AV_OPT_TYPE_RATIONAL: ret = snprintf(buf, sizeof(buf), "%d/%d", ((AVRational*)dst)->num, ((AVRational*)dst)->den);break; case AV_OPT_TYPE_RATIONAL: ret = snprintf(buf, sizeof(buf), "%d/%d", ((AVRational*)dst)->num, ((AVRational*)dst)->den);break;
case AV_OPT_TYPE_CONST: ret = snprintf(buf, sizeof(buf), "%f" , o->default_val.dbl);break; case AV_OPT_TYPE_CONST: ret = snprintf(buf, sizeof(buf), "%f" , o->default_val.dbl);break;
case AV_OPT_TYPE_STRING: case AV_OPT_TYPE_STRING:
if (*(uint8_t**)dst) if (*(uint8_t**)dst) {
*out_val = av_strdup(*(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(""); *out_val = av_strdup("");
}
return *out_val ? 0 : AVERROR(ENOMEM); return *out_val ? 0 : AVERROR(ENOMEM);
case AV_OPT_TYPE_BINARY: 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 *)); len = *(int*)(((uint8_t *)dst) + sizeof(uint8_t *));
if ((uint64_t)len*2 + 1 > INT_MAX) if ((uint64_t)len*2 + 1 > INT_MAX)
return AVERROR(EINVAL); return AVERROR(EINVAL);
......
...@@ -563,6 +563,12 @@ int av_opt_eval_q (void *obj, const AVOption *o, const char *val, AVRational ...@@ -563,6 +563,12 @@ int av_opt_eval_q (void *obj, const AVOption *o, const char *val, AVRational
*/ */
#define AV_OPT_SEARCH_FAKE_OBJ (1 << 1) #define AV_OPT_SEARCH_FAKE_OBJ (1 << 1)
/**
* 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 (1 << 2)
/** /**
* Allows av_opt_query_ranges and av_opt_query_ranges_default to return more than * Allows av_opt_query_ranges and av_opt_query_ranges_default to return more than
* one component for certain option types. * one component for certain option types.
...@@ -722,6 +728,10 @@ int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, in ...@@ -722,6 +728,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 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 (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); int av_opt_get_int (void *obj, const char *name, int search_flags, int64_t *out_val);
......
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
*/ */
#define LIBAVUTIL_VERSION_MAJOR 55 #define LIBAVUTIL_VERSION_MAJOR 55
#define LIBAVUTIL_VERSION_MINOR 2 #define LIBAVUTIL_VERSION_MINOR 3
#define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment