Commit 00759d71 authored by Michael Niedermayer's avatar Michael Niedermayer

avutil/opt: add av_opt_copy()

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent f028b7af
...@@ -15,6 +15,9 @@ libavutil: 2012-10-22 ...@@ -15,6 +15,9 @@ libavutil: 2012-10-22
API changes, most recent first: API changes, most recent first:
2014-05-30 - xxxxxxx - lavu 52.89.100 - opt.h
Add av_opt_copy()
2014-04-xx - xxxxxxx - lavc 55.54.0 - avcodec.h 2014-04-xx - xxxxxxx - lavc 55.54.0 - avcodec.h
Add AVCodecContext.side_data_only_packets to allow encoders to output packets Add AVCodecContext.side_data_only_packets to allow encoders to output packets
with only side data. This option may become mandatory in the future, so all with only side data. This option may become mandatory in the future, so all
......
...@@ -1539,6 +1539,48 @@ static int opt_size(enum AVOptionType type) ...@@ -1539,6 +1539,48 @@ static int opt_size(enum AVOptionType type)
return 0; return 0;
} }
int av_opt_copy(void *dst, void *src)
{
const AVOption *o = NULL;
const AVClass *c;
int ret = 0;
if (!src)
return 0;
c = *(AVClass**)src;
if (*(AVClass**)dst && 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);
*field_dst8 = av_memdup(*field_src8, len);
if (len && !*field_dst8) {
ret = AVERROR(ENOMEM);
len = 0;
}
*(int*)(field_dst8 + 1) = len;
} else if (o->type == AV_OPT_TYPE_CONST) {
// do nothing
} else {
memcpy(field_dst, field_src, opt_size(o->type));
}
}
return ret;
}
int av_opt_query_ranges(AVOptionRanges **ranges_arg, void *obj, const char *key, int flags) int av_opt_query_ranges(AVOptionRanges **ranges_arg, void *obj, const char *key, int flags)
{ {
int ret; int ret;
......
...@@ -822,6 +822,8 @@ void av_opt_freep_ranges(AVOptionRanges **ranges); ...@@ -822,6 +822,8 @@ void av_opt_freep_ranges(AVOptionRanges **ranges);
*/ */
int av_opt_query_ranges(AVOptionRanges **, void *obj, const char *key, int flags); int av_opt_query_ranges(AVOptionRanges **, void *obj, const char *key, int flags);
int av_opt_copy(void *dest, void *src);
/** /**
* Get a default list of allowed ranges for the given option. * Get a default list of allowed ranges for the given option.
* *
......
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
*/ */
#define LIBAVUTIL_VERSION_MAJOR 52 #define LIBAVUTIL_VERSION_MAJOR 52
#define LIBAVUTIL_VERSION_MINOR 88 #define LIBAVUTIL_VERSION_MINOR 89
#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