On date Friday 2011-06-10 22:13:29 +0200, Anton Khirnov encoded:
> ---
> cmdutils.c | 6 +++---
> ffserver.c | 2 +-
> libavutil/avutil.h | 3 +++
> libavutil/log.h | 7 +++++++
> libavutil/opt.c | 30 +++++++++++++++++++++++++-----
> libavutil/opt.h | 31 +++++++++++++++++++++++++++++++
> 6 files changed, 70 insertions(+), 9 deletions(-)
>
> diff --git a/cmdutils.c b/cmdutils.c
> index b9a5d1b..517034f 100644
> --- a/cmdutils.c
> +++ b/cmdutils.c
> @@ -299,7 +299,7 @@ int opt_default(const char *opt, const char *arg){
> int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0,
> AV_OPT_FLAG_SUBTITLE_PARAM, 0};
>
> for(type=0; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){
> - const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL,
> opt_types[type], opt_types[type]);
> + const AVOption *o2 = av_opt_find(avcodec_opts[0], opt, NULL,
> opt_types[type], 0);
> if(o2)
> ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o);
> }
> @@ -324,13 +324,13 @@ int opt_default(const char *opt, const char *arg){
> AVOutputFormat *oformat = NULL;
> while ((p=av_codec_next(p))){
> const AVClass *c = p->priv_class;
> - if(c && av_find_opt(&c, opt, NULL, 0, 0))
> + if(c && av_opt_find(&c, opt, NULL, 0, 0))
> break;
> }
> if (!p) {
> while ((oformat = av_oformat_next(oformat))) {
> const AVClass *c = oformat->priv_class;
> - if (c && av_find_opt(&c, opt, NULL, 0, 0))
> + if (c && av_opt_find(&c, opt, NULL, 0, 0))
> break;
> }
> }
> diff --git a/ffserver.c b/ffserver.c
> index 0f57979..2ac7e6a 100644
> --- a/ffserver.c
> +++ b/ffserver.c
> @@ -3944,7 +3944,7 @@ static int ffserver_opt_default(const char *opt, const
> char *arg,
> AVCodecContext *avctx, int type)
> {
> int ret = 0;
> - const AVOption *o = av_find_opt(avctx, opt, NULL, type, type);
> + const AVOption *o = av_opt_find(avctx, opt, NULL, type, 0);
> if(o)
> ret = av_set_string3(avctx, opt, arg, 1, NULL);
> return ret;
> diff --git a/libavutil/avutil.h b/libavutil/avutil.h
> index 9c660f3..02151a0 100644
> --- a/libavutil/avutil.h
> +++ b/libavutil/avutil.h
> @@ -60,6 +60,9 @@
> #ifndef FF_API_GET_BITS_PER_SAMPLE_FMT
> #define FF_API_GET_BITS_PER_SAMPLE_FMT (LIBAVUTIL_VERSION_MAJOR < 52)
> #endif
> +#ifndef FF_API_FIND_OPT
> +#define FF_API_FIND_OPT (LIBAVUTIL_VERSION_MAJOR < 52)
> +#endif
>
> /**
> * Return the LIBAVUTIL_VERSION_INT constant.
> diff --git a/libavutil/log.h b/libavutil/log.h
> index 1cd9269..67682a2 100644
> --- a/libavutil/log.h
> +++ b/libavutil/log.h
> @@ -70,6 +70,13 @@ typedef struct {
> * can be NULL of course
> */
> int parent_log_context_offset;
> +
> + /**
> + * A function for extended searching. E.g. scanning possible
> + * children objects.
> + */
> + const struct AVOption* (*opt_find)(void *obj, const char *name, const
> char *unit,
> + int opt_flags, int search_flags);
> } AVClass;
>
> /* av_log API */
> diff --git a/libavutil/opt.c b/libavutil/opt.c
> index 94596ed..aeef4d5 100644
> --- a/libavutil/opt.c
> +++ b/libavutil/opt.c
> @@ -31,6 +31,7 @@
> #include "eval.h"
> #include "dict.h"
>
> +#if FF_API_FIND_OPT
> //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)
> {
> @@ -43,6 +44,7 @@ const AVOption *av_find_opt(void *v, const char *name,
> const char *unit, int mas
> }
> return NULL;
> }
> +#endif
>
> const AVOption *av_next_option(void *obj, const AVOption *last)
> {
> @@ -53,7 +55,7 @@ const AVOption *av_next_option(void *obj, const AVOption
> *last)
>
> static int av_set_number2(void *obj, const char *name, double num, int den,
> int64_t intnum, const AVOption **o_out)
> {
> - const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
> + const AVOption *o = av_opt_find(obj, name, NULL, 0, 0);
> void *dst;
> if (o_out)
> *o_out= o;
> @@ -116,7 +118,7 @@ static int hexchar2int(char c) {
> int av_set_string3(void *obj, const char *name, const char *val, int alloc,
> const AVOption **o_out)
> {
> int ret;
> - const AVOption *o= av_find_opt(obj, name, NULL, 0, 0);
> + const AVOption *o = av_opt_find(obj, name, NULL, 0, 0);
> if (o_out)
> *o_out = o;
> if (!o)
> @@ -163,7 +165,7 @@ int av_set_string3(void *obj, const char *name, const
> char *val, int alloc, cons
> buf[i]=0;
>
> {
> - const AVOption *o_named= av_find_opt(obj, buf, o->unit, 0,
> 0);
> + const AVOption *o_named = av_opt_find(obj, buf, o->unit, 0,
> 0);
> if (o_named && o_named->type == FF_OPT_TYPE_CONST)
> d= o_named->default_val.dbl;
> else if (!strcmp(buf, "default")) d= o->default_val.dbl;
> @@ -228,7 +230,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_find_opt(obj, name, NULL, 0, 0);
> + const AVOption *o = av_opt_find(obj, name, NULL, 0, 0);
> void *dst;
> uint8_t *bin;
> int len, i;
> @@ -261,7 +263,7 @@ 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_find_opt(obj, name, NULL, 0, 0);
> + const AVOption *o = av_opt_find(obj, name, NULL, 0, 0);
> void *dst;
> if (!o || o->offset<=0)
> goto error;
> @@ -547,6 +549,24 @@ int av_opt_set_dict(void *obj, AVDictionary *options,
> AVDictionary **out_options
> return ret;
> }
>
> +const AVOption *av_opt_find(void *obj, const char *name, const char *unit,
> + int opt_flags, int search_flags)
> +{
> + AVClass *c = *(AVClass**)obj;
> + const AVOption *o = NULL;
> +
> + if (c->opt_find && search_flags & AV_OPT_SEARCH_CHILDREN &&
> + (o = c->opt_find(obj, name, unit, opt_flags, search_flags)))
> + return o;
> +
> + while (o = av_next_option(obj, o)) {
> + if (!strcmp(o->name, name) && (!unit || (o->unit && !strcmp(o->unit,
> unit))) &&
> + (o->flags & opt_flags) == opt_flags)
> + return o;
> + }
> + return NULL;
> +}
> +
> #ifdef TEST
>
> #undef printf
> diff --git a/libavutil/opt.h b/libavutil/opt.h
> index b3a33c7..12489d9 100644
> --- a/libavutil/opt.h
> +++ b/libavutil/opt.h
> @@ -92,6 +92,7 @@ typedef struct AVOption {
> const char *unit;
> } AVOption;
>
> +#if FF_API_FIND_OPT
> /**
> * Look for an option in obj. Look only for the options which
> * have the flags set as specified in mask and flags (that is,
> @@ -103,8 +104,12 @@ typedef struct AVOption {
> * @param[in] unit the unit of the option to look for, or any if NULL
> * @return a pointer to the option found, or NULL if no option
> * has been found
> + *
> + * @deprecated use av_opt_find.
> */
> +attribute_deprecated
> const AVOption *av_find_opt(void *obj, const char *name, const char *unit,
> int mask, int flags);
> +#endif
>
> /**
> * Set the field of obj with the given name to value.
> @@ -195,4 +200,30 @@ void av_opt_free(void *obj);
> */
> int av_opt_set_dict(void *obj, AVDictionary *options, AVDictionary
> **out_options);
>
> +#define AV_OPT_SEARCH_CHILDREN 0x0001 /**< Search in possible children of
> the
> + given object first. */
Nit: maybe: AV_OPT_FIND_(FLAG_)?SEARCH_CHILDREN
for namespace safety
> +
> +/**
> + * Look for an option in obj. Look only for the options which
> + * have the specified flags set.
Docu-nit:
*all* the specified flags set
or the reader may interpret it like:
(one of) the specified flags set, that is:
o->flags & opt_flags => valid
while we request the strongest condition:
o->flags & opt_flags == opt_flags => valid
> + *
> + * @param[in] obj A pointer to a struct whose first element is a
> + * pointer to an AVClass.
Nit++++++: here and below, incomplete sentences don't need
capitalization and ending dot (or at least this is the convention
suggested by Diego which I tried to follow), then do as you prefer,
the final dot is only needed if there is an expression following like
in:
@param bikeshed the color of the bikeshed. Be very careful when
choosing it, or your program will crash badly.
@return 0 in case of success, or AVERROR_BIKESHED_NOT_PAINTED if the
color of the bikeshed could not have been agreed upon
> + * @param[in] name The name of the option to look for.
> + * @param[in] unit When searching for named constants, name of the unit
> + * it belongs to.
> + * @param opt_flags Find only options with those flags set (AV_OPT_FLAG).
> + * @param search_flags A combination of AV_OPT_SEARCH_*.
> + *
> + * @return A pointer to the option found, or NULL if no option
> + * has been found.
> + *
> + * @note Options found with AV_OPT_SEARCH_CHILDREN flag may not be
> + * settable directly with av_set_string3. Use special calls which
> + * take an options AVDictionary (e.g. avformat_open_input() ) to set options
> + * found with this flag.
This restriction is a bit clumsy and is introducing an asymmetry
between setting and getting operations. What about:
av_opt_set(..., int search_flags)?
Anyway if this is a limitation of the current av_set_string3() there
is no way to block this patch, but this problem should be analyzed
before for avoiding future API fixes.
(BTW I don't know if related, note that currently ffprobe+private
options doesn't work because of the way AVFMT_PRIV_OPTIONS is handled.)
> + */
> +const AVOption *av_opt_find(void *obj, const char *name, const char *unit,
> + int opt_flags, int search_flags);
> +
> #endif /* AVUTIL_OPT_H */
--
Famous, adj.:
Conspicuously miserable.
-- Ambrose Bierce, "The Devil's Dictionary"
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel