mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-12-08 06:09:50 +00:00
avutil/opt: add support for children objects in av_opt_serialize
Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
855d4b5254
commit
8616cfe089
6 changed files with 100 additions and 30 deletions
|
|
@ -2386,14 +2386,54 @@ int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_fla
|
|||
return av_opt_is_set_to_default(target, o);
|
||||
}
|
||||
|
||||
static int opt_serialize(void *obj, int opt_flags, int flags, int *cnt,
|
||||
AVBPrint *bprint, const char key_val_sep, const char pairs_sep)
|
||||
{
|
||||
const AVOption *o = NULL;
|
||||
void *child = NULL;
|
||||
uint8_t *buf;
|
||||
int ret;
|
||||
const char special_chars[] = {pairs_sep, key_val_sep, '\0'};
|
||||
|
||||
if (flags & AV_OPT_SERIALIZE_SEARCH_CHILDREN)
|
||||
while (child = av_opt_child_next(obj, child)) {
|
||||
ret = opt_serialize(child, opt_flags, flags, cnt, bprint,
|
||||
key_val_sep, pairs_sep);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
while (o = av_opt_next(obj, o)) {
|
||||
if (o->type == AV_OPT_TYPE_CONST)
|
||||
continue;
|
||||
if ((flags & AV_OPT_SERIALIZE_OPT_FLAGS_EXACT) && o->flags != opt_flags)
|
||||
continue;
|
||||
else if (((o->flags & opt_flags) != opt_flags))
|
||||
continue;
|
||||
if (flags & AV_OPT_SERIALIZE_SKIP_DEFAULTS && av_opt_is_set_to_default(obj, o) > 0)
|
||||
continue;
|
||||
if ((ret = av_opt_get(obj, o->name, 0, &buf)) < 0) {
|
||||
av_bprint_finalize(bprint, NULL);
|
||||
return ret;
|
||||
}
|
||||
if (buf) {
|
||||
if ((*cnt)++)
|
||||
av_bprint_append_data(bprint, &pairs_sep, 1);
|
||||
av_bprint_escape(bprint, o->name, special_chars, AV_ESCAPE_MODE_BACKSLASH, 0);
|
||||
av_bprint_append_data(bprint, &key_val_sep, 1);
|
||||
av_bprint_escape(bprint, buf, special_chars, AV_ESCAPE_MODE_BACKSLASH, 0);
|
||||
av_freep(&buf);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer,
|
||||
const char key_val_sep, const char pairs_sep)
|
||||
{
|
||||
const AVOption *o = NULL;
|
||||
uint8_t *buf;
|
||||
AVBPrint bprint;
|
||||
int ret, cnt = 0;
|
||||
const char special_chars[] = {pairs_sep, key_val_sep, '\0'};
|
||||
|
||||
if (pairs_sep == '\0' || key_val_sep == '\0' || pairs_sep == key_val_sep ||
|
||||
pairs_sep == '\\' || key_val_sep == '\\') {
|
||||
|
|
@ -2407,28 +2447,11 @@ int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer,
|
|||
*buffer = NULL;
|
||||
av_bprint_init(&bprint, 64, AV_BPRINT_SIZE_UNLIMITED);
|
||||
|
||||
while (o = av_opt_next(obj, o)) {
|
||||
if (o->type == AV_OPT_TYPE_CONST)
|
||||
continue;
|
||||
if ((flags & AV_OPT_SERIALIZE_OPT_FLAGS_EXACT) && o->flags != opt_flags)
|
||||
continue;
|
||||
else if (((o->flags & opt_flags) != opt_flags))
|
||||
continue;
|
||||
if (flags & AV_OPT_SERIALIZE_SKIP_DEFAULTS && av_opt_is_set_to_default(obj, o) > 0)
|
||||
continue;
|
||||
if ((ret = av_opt_get(obj, o->name, 0, &buf)) < 0) {
|
||||
av_bprint_finalize(&bprint, NULL);
|
||||
return ret;
|
||||
}
|
||||
if (buf) {
|
||||
if (cnt++)
|
||||
av_bprint_append_data(&bprint, &pairs_sep, 1);
|
||||
av_bprint_escape(&bprint, o->name, special_chars, AV_ESCAPE_MODE_BACKSLASH, 0);
|
||||
av_bprint_append_data(&bprint, &key_val_sep, 1);
|
||||
av_bprint_escape(&bprint, buf, special_chars, AV_ESCAPE_MODE_BACKSLASH, 0);
|
||||
av_freep(&buf);
|
||||
}
|
||||
}
|
||||
ret = opt_serialize(obj, opt_flags, flags, &cnt, &bprint,
|
||||
key_val_sep, pairs_sep);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = av_bprint_finalize(&bprint, buffer);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue