X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavutil%2Fopt.c;h=e56cdc65e71bb09b07ecc14383b07b182ed2a79f;hb=031ba466331c091bd68ce757b8ae11497306b8b7;hp=9c601a2cbb534be8414f61f0bcb9bc3a27847ba4;hpb=a726d7fd4e0b112b276678ea9da9c9b3097e8b8f;p=ffmpeg diff --git a/libavutil/opt.c b/libavutil/opt.c index 9c601a2cbb5..e56cdc65e71 100644 --- a/libavutil/opt.c +++ b/libavutil/opt.c @@ -2,20 +2,20 @@ * AVOptions * Copyright (c) 2005 Michael Niedermayer * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -36,10 +36,9 @@ //FIXME order them and do a bin search const AVOption *av_find_opt(void *v, const char *name, const char *unit, int mask, int flags) { - AVClass *c= *(AVClass**)v; //FIXME silly way of storing AVClass - const AVOption *o= c->option; + const AVOption *o = NULL; - for (; o && o->name; o++) { + while ((o = av_next_option(v, o))) { if (!strcmp(o->name, name) && (!unit || (o->unit && !strcmp(o->unit, unit))) && (o->flags & mask) == flags) return o; } @@ -50,7 +49,7 @@ const AVOption *av_find_opt(void *v, const char *name, const char *unit, int mas const AVOption *av_next_option(void *obj, const AVOption *last) { if (last && last[1].name) return ++last; - else if (last) return NULL; + else if (last || !(*(AVClass**)obj)->option->name) return NULL; else return (*(AVClass**)obj)->option; } @@ -124,7 +123,7 @@ int av_set_string3(void *obj, const char *name, const char *val, int alloc, cons *o_out = o; if (!o) return AVERROR_OPTION_NOT_FOUND; - if (!val || o->offset<=0) + if ((!val && o->type != FF_OPT_TYPE_STRING) || o->offset<=0) return AVERROR(EINVAL); if (o->type == FF_OPT_TYPE_BINARY) { @@ -230,7 +229,7 @@ const AVOption *av_set_int(void *obj, const char *name, int64_t n) */ const char *av_get_string(void *obj, const char *name, const AVOption **o_out, char *buf, int buf_len) { - const AVOption *o = av_opt_find(obj, name, NULL, 0, 0); + const AVOption *o = av_opt_find(obj, name, NULL, 0, AV_OPT_SEARCH_CHILDREN); void *dst; uint8_t *bin; int len, i; @@ -263,9 +262,9 @@ const char *av_get_string(void *obj, const char *name, const AVOption **o_out, c static int av_get_number(void *obj, const char *name, const AVOption **o_out, double *num, int *den, int64_t *intnum) { - const AVOption *o = av_opt_find(obj, name, NULL, 0, 0); + const AVOption *o = av_opt_find(obj, name, NULL, 0, AV_OPT_SEARCH_CHILDREN); void *dst; - if (!o || o->offset<=0) + if (!o || (o->offset<=0 && o->type != FF_OPT_TYPE_CONST)) goto error; dst= ((uint8_t*)obj) + o->offset; @@ -281,6 +280,7 @@ static int av_get_number(void *obj, const char *name, const AVOption **o_out, do case FF_OPT_TYPE_RATIONAL: *intnum= ((AVRational*)dst)->num; *den = ((AVRational*)dst)->den; return 0; + case FF_OPT_TYPE_CONST: *intnum= o->default_val.dbl;return 0; } error: *den=*intnum=0; @@ -521,6 +521,8 @@ int av_set_options_string(void *ctx, const char *opts, { int ret, count = 0; + if (!opts) + return 0; while (*opts) { if ((ret = parse_key_value_pair(ctx, &opts, key_val_sep, pairs_sep)) < 0) return ret;