Merge commit '52067b3c0e5ddbcf7021a093420798420351a9e2'
authorJames Almer <jamrial@gmail.com>
Sat, 21 Oct 2017 18:35:14 +0000 (15:35 -0300)
committerJames Almer <jamrial@gmail.com>
Sat, 21 Oct 2017 18:35:14 +0000 (15:35 -0300)
* commit '52067b3c0e5ddbcf7021a093420798420351a9e2':
  lavfi: Drop deprecated filter initialization

Merged-by: James Almer <jamrial@gmail.com>
1  2 
libavfilter/avfilter.c
libavfilter/avfilter.h
libavfilter/version.h

@@@ -846,98 -528,39 +846,91 @@@ void avfilter_free(AVFilterContext *fil
      av_free(filter);
  }
  
 -/* process a list of value1:value2:..., each value corresponding
 - * to subsequent AVOption, in the order they are declared */
 -static int process_unnamed_options(AVFilterContext *ctx, AVDictionary **options,
 -                                   const char *args)
 +int ff_filter_get_nb_threads(AVFilterContext *ctx)
 +{
 +     if (ctx->nb_threads > 0)
 +         return FFMIN(ctx->nb_threads, ctx->graph->nb_threads);
 +     return ctx->graph->nb_threads;
 +}
 +
 +static int process_options(AVFilterContext *ctx, AVDictionary **options,
 +                           const char *args)
  {
      const AVOption *o = NULL;
 -    const char *p = args;
 -    char *val;
 +    int ret, count = 0;
 +    char *av_uninit(parsed_key), *av_uninit(value);
 +    const char *key;
 +    int offset= -1;
 +
 +    if (!args)
 +        return 0;
 +
 +    while (*args) {
 +        const char *shorthand = NULL;
  
 -    while (*p) {
          o = av_opt_next(ctx->priv, o);
 -        if (!o) {
 -            av_log(ctx, AV_LOG_ERROR, "More options provided than "
 -                   "this filter supports.\n");
 -            return AVERROR(EINVAL);
 +        if (o) {
 +            if (o->type == AV_OPT_TYPE_CONST || o->offset == offset)
 +                continue;
 +            offset = o->offset;
 +            shorthand = o->name;
          }
 -        if (o->type == AV_OPT_TYPE_CONST)
 -            continue;
  
 -        val = av_get_token(&p, ":");
 -        if (!val)
 -            return AVERROR(ENOMEM);
 +        ret = av_opt_get_key_value(&args, "=", ":",
 +                                   shorthand ? AV_OPT_FLAG_IMPLICIT_KEY : 0,
 +                                   &parsed_key, &value);
 +        if (ret < 0) {
 +            if (ret == AVERROR(EINVAL))
 +                av_log(ctx, AV_LOG_ERROR, "No option name near '%s'\n", args);
 +            else
 +                av_log(ctx, AV_LOG_ERROR, "Unable to parse '%s': %s\n", args,
 +                       av_err2str(ret));
 +            return ret;
 +        }
 +        if (*args)
 +            args++;
 +        if (parsed_key) {
 +            key = parsed_key;
 +            while ((o = av_opt_next(ctx->priv, o))); /* discard all remaining shorthand */
 +        } else {
 +            key = shorthand;
 +        }
  
 -        av_dict_set(options, o->name, val, 0);
 +        av_log(ctx, AV_LOG_DEBUG, "Setting '%s' to value '%s'\n", key, value);
  
 -        av_freep(&val);
 -        if (*p)
 -            p++;
 +        if (av_opt_find(ctx, key, NULL, 0, 0)) {
 +            ret = av_opt_set(ctx, key, value, 0);
 +            if (ret < 0) {
 +                av_free(value);
 +                av_free(parsed_key);
 +                return ret;
 +            }
 +        } else {
 +        av_dict_set(options, key, value, 0);
 +        if ((ret = av_opt_set(ctx->priv, key, value, AV_OPT_SEARCH_CHILDREN)) < 0) {
 +            if (!av_opt_find(ctx->priv, key, NULL, 0, AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)) {
 +            if (ret == AVERROR_OPTION_NOT_FOUND)
 +                av_log(ctx, AV_LOG_ERROR, "Option '%s' not found\n", key);
 +            av_free(value);
 +            av_free(parsed_key);
 +            return ret;
 +            }
 +        }
 +        }
 +
 +        av_free(value);
 +        av_free(parsed_key);
 +        count++;
      }
  
 -    return 0;
 +    if (ctx->enable_str) {
 +        ret = set_enable_expr(ctx, ctx->enable_str);
 +        if (ret < 0)
 +            return ret;
 +    }
 +    return count;
  }
  
- #if FF_API_AVFILTER_INIT_FILTER
- int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque)
- {
-     return avfilter_init_str(filter, args);
- }
- #endif
  int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options)
  {
      int ret = 0;
Simple merge
   * the public API and may change, break or disappear at any time.
   */
  
- #ifndef FF_API_AVFILTER_INIT_FILTER
- #define FF_API_AVFILTER_INIT_FILTER         (LIBAVFILTER_VERSION_MAJOR < 7)
- #endif
 +#ifndef FF_API_OLD_FILTER_OPTS_ERROR
 +#define FF_API_OLD_FILTER_OPTS_ERROR        (LIBAVFILTER_VERSION_MAJOR < 8)
 +#endif
  #ifndef FF_API_OLD_FILTER_REGISTER
  #define FF_API_OLD_FILTER_REGISTER          (LIBAVFILTER_VERSION_MAJOR < 7)
  #endif