avutil/opt: add av_opt_copy()

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2014-05-30 21:04:14 +02:00
parent f028b7af7b
commit 00759d71a2
4 changed files with 48 additions and 1 deletions

View File

@ -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

View File

@ -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;

View File

@ -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.
* *

View File

@ -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, \