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

Reply via email to