This includes documentation and other modifications by Lukasz Marek and Martin Storsjö. Signed-off-by: Martin Storsjö <martin@martin.st>tags/n3.1
| @@ -13,6 +13,9 @@ libavutil: 2015-08-28 | |||||
| API changes, most recent first: | API changes, most recent first: | ||||
| 2016-xx-xx - xxxxxxx - lavu 55.10.0 - opt.h | |||||
| Add av_opt_copy(). | |||||
| 2016-xx-xx - xxxxxxx - lavc 57.16.0 - avcodec.h | 2016-xx-xx - xxxxxxx - lavc 57.16.0 - avcodec.h | ||||
| Add a new audio/video encoding and decoding API with decoupled input | Add a new audio/video encoding and decoding API with decoupled input | ||||
| and output -- avcodec_send_packet(), avcodec_receive_frame(), | and output -- avcodec_send_packet(), avcodec_receive_frame(), | ||||
| @@ -757,6 +757,72 @@ const AVClass *av_opt_child_class_next(const AVClass *parent, const AVClass *pre | |||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| static int opt_size(enum AVOptionType type) | |||||
| { | |||||
| switch(type) { | |||||
| case AV_OPT_TYPE_INT: | |||||
| case AV_OPT_TYPE_FLAGS: return sizeof(int); | |||||
| case AV_OPT_TYPE_INT64: return sizeof(int64_t); | |||||
| case AV_OPT_TYPE_DOUBLE: return sizeof(double); | |||||
| case AV_OPT_TYPE_FLOAT: return sizeof(float); | |||||
| case AV_OPT_TYPE_STRING: return sizeof(uint8_t*); | |||||
| case AV_OPT_TYPE_RATIONAL: return sizeof(AVRational); | |||||
| case AV_OPT_TYPE_BINARY: return sizeof(uint8_t*) + sizeof(int); | |||||
| } | |||||
| return AVERROR(EINVAL); | |||||
| } | |||||
| int av_opt_copy(void *dst, const void *src) | |||||
| { | |||||
| const AVOption *o = NULL; | |||||
| const AVClass *c; | |||||
| int ret = 0; | |||||
| if (!src) | |||||
| return AVERROR(EINVAL); | |||||
| c = *(AVClass**)src; | |||||
| if (!c || c != *(AVClass**)dst) | |||||
| return AVERROR(EINVAL); | |||||
| while ((o = av_opt_next(src, o))) { | |||||
| void *field_dst = ((uint8_t*)dst) + o->offset; | |||||
| void *field_src = ((uint8_t*)src) + o->offset; | |||||
| uint8_t **field_dst8 = (uint8_t**)field_dst; | |||||
| uint8_t **field_src8 = (uint8_t**)field_src; | |||||
| if (o->type == AV_OPT_TYPE_STRING) { | |||||
| set_string(dst, o, *field_src8, field_dst8); | |||||
| if (*field_src8 && !*field_dst8) | |||||
| ret = AVERROR(ENOMEM); | |||||
| } else if (o->type == AV_OPT_TYPE_BINARY) { | |||||
| int len = *(int*)(field_src8 + 1); | |||||
| if (*field_dst8 != *field_src8) | |||||
| av_freep(field_dst8); | |||||
| if (len) { | |||||
| *field_dst8 = av_malloc(len); | |||||
| if (!*field_dst8) { | |||||
| ret = AVERROR(ENOMEM); | |||||
| len = 0; | |||||
| } | |||||
| memcpy(*field_dst8, *field_src8, len); | |||||
| } else { | |||||
| *field_dst8 = NULL; | |||||
| } | |||||
| *(int*)(field_dst8 + 1) = len; | |||||
| } else if (o->type == AV_OPT_TYPE_CONST) { | |||||
| // do nothing | |||||
| } else { | |||||
| int size = opt_size(o->type); | |||||
| if (size < 0) | |||||
| ret = size; | |||||
| else | |||||
| memcpy(field_dst, field_src, size); | |||||
| } | |||||
| } | |||||
| return ret; | |||||
| } | |||||
| #ifdef TEST | #ifdef TEST | ||||
| typedef struct TestContext | typedef struct TestContext | ||||
| @@ -530,6 +530,19 @@ int av_opt_get_q (void *obj, const char *name, int search_flags, AVRationa | |||||
| * be freed with av_dict_free() by the caller | * 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); | int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val); | ||||
| /** | |||||
| * Copy options from src object into dest object. | |||||
| * | |||||
| * Options that require memory allocation (e.g. string or binary) are malloc'ed in dest object. | |||||
| * Original memory allocated for such options is freed unless both src and dest options points to the same memory. | |||||
| * | |||||
| * @param dest Object to copy from | |||||
| * @param src Object to copy into | |||||
| * @return 0 on success, negative on error | |||||
| */ | |||||
| int av_opt_copy(void *dest, const void *src); | |||||
| /** | /** | ||||
| * @} | * @} | ||||
| * @} | * @} | ||||
| @@ -54,8 +54,8 @@ | |||||
| */ | */ | ||||
| #define LIBAVUTIL_VERSION_MAJOR 55 | #define LIBAVUTIL_VERSION_MAJOR 55 | ||||
| #define LIBAVUTIL_VERSION_MINOR 9 | |||||
| #define LIBAVUTIL_VERSION_MICRO 1 | |||||
| #define LIBAVUTIL_VERSION_MINOR 10 | |||||
| #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, \ | ||||
| LIBAVUTIL_VERSION_MINOR, \ | LIBAVUTIL_VERSION_MINOR, \ | ||||