In order to support metadata being set as an option, it's necessary to be able to set dictionaries as values. Signed-off-by: Anton Khirnov <anton@khirnov.net>tags/n2.4
@@ -13,6 +13,10 @@ libavutil: 2014-08-09 | |||||
API changes, most recent first: | API changes, most recent first: | ||||
2014-xx-xx - xxxxxxx - lavu 54.02.0 - opt.h | |||||
Add av_opt_get_dict_val/set_dict_val with AV_OPT_TYPE_DICT to support | |||||
dictionary types being set as options. | |||||
2014-xx-xx - xxxxxxx - lavf 56.01.0 - avformat.h | 2014-xx-xx - xxxxxxx - lavf 56.01.0 - avformat.h | ||||
Add AVFormatContext.event_flags and AVStream.event_flags for signaling to | Add AVFormatContext.event_flags and AVStream.event_flags for signaling to | ||||
the user when events happen in the file/stream. | the user when events happen in the file/stream. | ||||
@@ -307,6 +307,24 @@ int av_opt_set_bin(void *obj, const char *name, const uint8_t *val, int len, int | |||||
return 0; | return 0; | ||||
} | } | ||||
int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, int search_flags) | |||||
{ | |||||
void *target_obj; | |||||
AVDictionary **dst; | |||||
const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj); | |||||
if (!o || !target_obj) | |||||
return AVERROR_OPTION_NOT_FOUND; | |||||
if (o->flags & AV_OPT_FLAG_READONLY) | |||||
return AVERROR(EINVAL); | |||||
dst = (AVDictionary **)(((uint8_t *)target_obj) + o->offset); | |||||
av_dict_free(dst); | |||||
av_dict_copy(dst, val, 0); | |||||
return 0; | |||||
} | |||||
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) | ||||
{ | { | ||||
void *dst, *target_obj; | void *dst, *target_obj; | ||||
@@ -410,6 +428,23 @@ int av_opt_get_q(void *obj, const char *name, int search_flags, AVRational *out_ | |||||
return 0; | return 0; | ||||
} | } | ||||
int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val) | |||||
{ | |||||
void *target_obj; | |||||
AVDictionary *src; | |||||
const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj); | |||||
if (!o || !target_obj) | |||||
return AVERROR_OPTION_NOT_FOUND; | |||||
if (o->type != AV_OPT_TYPE_DICT) | |||||
return AVERROR(EINVAL); | |||||
src = *(AVDictionary **)(((uint8_t *)target_obj) + o->offset); | |||||
av_dict_copy(out_val, src, 0); | |||||
return 0; | |||||
} | |||||
int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name) | int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name) | ||||
{ | { | ||||
const AVOption *field = av_opt_find(obj, field_name, NULL, 0, 0); | const AVOption *field = av_opt_find(obj, field_name, NULL, 0, 0); | ||||
@@ -539,7 +574,8 @@ void av_opt_set_defaults(void *s) | |||||
av_opt_set(s, opt->name, opt->default_val.str, 0); | av_opt_set(s, opt->name, opt->default_val.str, 0); | ||||
break; | break; | ||||
case AV_OPT_TYPE_BINARY: | case AV_OPT_TYPE_BINARY: | ||||
/* Cannot set default for binary */ | |||||
case AV_OPT_TYPE_DICT: | |||||
/* Cannot set defaults for these types */ | |||||
break; | break; | ||||
default: | default: | ||||
av_log(s, AV_LOG_DEBUG, "AVOption type %d of option %s not implemented yet\n", opt->type, opt->name); | av_log(s, AV_LOG_DEBUG, "AVOption type %d of option %s not implemented yet\n", opt->type, opt->name); | ||||
@@ -621,9 +657,21 @@ int av_set_options_string(void *ctx, const char *opts, | |||||
void av_opt_free(void *obj) | void av_opt_free(void *obj) | ||||
{ | { | ||||
const AVOption *o = NULL; | const AVOption *o = NULL; | ||||
while ((o = av_opt_next(obj, o))) | |||||
if (o->type == AV_OPT_TYPE_STRING || o->type == AV_OPT_TYPE_BINARY) | |||||
while ((o = av_opt_next(obj, o))) { | |||||
switch (o->type) { | |||||
case AV_OPT_TYPE_STRING: | |||||
case AV_OPT_TYPE_BINARY: | |||||
av_freep((uint8_t *)obj + o->offset); | av_freep((uint8_t *)obj + o->offset); | ||||
break; | |||||
case AV_OPT_TYPE_DICT: | |||||
av_dict_free((AVDictionary **)(((uint8_t *)obj) + o->offset)); | |||||
break; | |||||
default: | |||||
break; | |||||
} | |||||
} | |||||
} | } | ||||
int av_opt_set_dict(void *obj, AVDictionary **options) | int av_opt_set_dict(void *obj, AVDictionary **options) | ||||
@@ -224,6 +224,7 @@ enum AVOptionType{ | |||||
AV_OPT_TYPE_STRING, | AV_OPT_TYPE_STRING, | ||||
AV_OPT_TYPE_RATIONAL, | AV_OPT_TYPE_RATIONAL, | ||||
AV_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length | AV_OPT_TYPE_BINARY, ///< offset must point to a pointer immediately followed by an int for the length | ||||
AV_OPT_TYPE_DICT, | |||||
AV_OPT_TYPE_CONST = 128, | AV_OPT_TYPE_CONST = 128, | ||||
}; | }; | ||||
@@ -325,7 +326,7 @@ int av_set_options_string(void *ctx, const char *opts, | |||||
const char *key_val_sep, const char *pairs_sep); | const char *key_val_sep, const char *pairs_sep); | ||||
/** | /** | ||||
* Free all string and binary options in obj. | |||||
* Free all allocated objects in obj. | |||||
*/ | */ | ||||
void av_opt_free(void *obj); | void av_opt_free(void *obj); | ||||
@@ -491,11 +492,16 @@ const AVClass *av_opt_child_class_next(const AVClass *parent, const AVClass *pre | |||||
* AVERROR(ERANGE) if the value is out of range | * AVERROR(ERANGE) if the value is out of range | ||||
* AVERROR(EINVAL) if the value is not valid | * AVERROR(EINVAL) if the value is not valid | ||||
*/ | */ | ||||
int av_opt_set (void *obj, const char *name, const char *val, int search_flags); | |||||
int av_opt_set_int (void *obj, const char *name, int64_t val, int search_flags); | |||||
int av_opt_set_double(void *obj, const char *name, double val, int search_flags); | |||||
int av_opt_set_q (void *obj, const char *name, AVRational val, int search_flags); | |||||
int av_opt_set_bin (void *obj, const char *name, const uint8_t *val, int size, int search_flags); | |||||
int av_opt_set (void *obj, const char *name, const char *val, int search_flags); | |||||
int av_opt_set_int (void *obj, const char *name, int64_t val, int search_flags); | |||||
int av_opt_set_double (void *obj, const char *name, double val, int search_flags); | |||||
int av_opt_set_q (void *obj, const char *name, AVRational val, int search_flags); | |||||
int av_opt_set_bin (void *obj, const char *name, const uint8_t *val, int size, int search_flags); | |||||
/** | |||||
* @note Any old dictionary present is discarded and replaced with a copy of the new one. The | |||||
* caller still owns val is and responsible for freeing it. | |||||
*/ | |||||
int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, int search_flags); | |||||
/** | /** | ||||
* @} | * @} | ||||
*/ | */ | ||||
@@ -515,10 +521,15 @@ int av_opt_set_bin (void *obj, const char *name, const uint8_t *val, int size, | |||||
/** | /** | ||||
* @note the returned string will av_malloc()ed and must be av_free()ed by the caller | * @note the returned string will av_malloc()ed and must be av_free()ed by the caller | ||||
*/ | */ | ||||
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_double(void *obj, const char *name, int search_flags, double *out_val); | |||||
int av_opt_get_q (void *obj, const char *name, int search_flags, AVRational *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_double (void *obj, const char *name, int search_flags, double *out_val); | |||||
int av_opt_get_q (void *obj, const char *name, int search_flags, AVRational *out_val); | |||||
/** | |||||
* @param[out] out_val The returned dictionary is a copy of the actual value and must | |||||
* be freed with av_dict_free() by the caller | |||||
*/ | |||||
int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val); | |||||
/** | /** | ||||
* @} | * @} | ||||
* @} | * @} | ||||
@@ -54,7 +54,7 @@ | |||||
*/ | */ | ||||
#define LIBAVUTIL_VERSION_MAJOR 54 | #define LIBAVUTIL_VERSION_MAJOR 54 | ||||
#define LIBAVUTIL_VERSION_MINOR 1 | |||||
#define LIBAVUTIL_VERSION_MINOR 2 | |||||
#define LIBAVUTIL_VERSION_MICRO 0 | #define LIBAVUTIL_VERSION_MICRO 0 | ||||
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | ||||