const char *avfilter_license(void)
{
#define LICENSE_PREFIX "libavfilter license: "
- return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
+ return &LICENSE_PREFIX FFMPEG_LICENSE[sizeof(LICENSE_PREFIX) - 1];
}
void ff_command_queue_pop(AVFilterContext *filter)
return ret;
}
-int ff_poll_frame(AVFilterLink *link)
-{
- int i, min = INT_MAX;
-
- if (link->srcpad->poll_frame)
- return link->srcpad->poll_frame(link);
-
- for (i = 0; i < link->src->nb_inputs; i++) {
- int val;
- if (!link->src->inputs[i])
- return AVERROR(EINVAL);
- val = ff_poll_frame(link->src->inputs[i]);
- min = FFMIN(min, val);
- }
-
- return min;
-}
-
static const char *const var_names[] = {
"t",
"n",
return NULL;
}
+#if FF_API_CHILD_CLASS_NEXT
static const AVClass *filter_child_class_next(const AVClass *prev)
{
void *opaque = NULL;
return NULL;
}
+#endif
+
+static const AVClass *filter_child_class_iterate(void **iter)
+{
+ const AVFilter *f;
+
+ while ((f = av_filter_iterate(iter)))
+ if (f->priv_class)
+ return f->priv_class;
+
+ return NULL;
+}
#define OFFSET(x) offsetof(AVFilterContext, x)
#define FLAGS AV_OPT_FLAG_FILTERING_PARAM
.version = LIBAVUTIL_VERSION_INT,
.category = AV_CLASS_CATEGORY_FILTER,
.child_next = filter_child_next,
+#if FF_API_CHILD_CLASS_NEXT
.child_class_next = filter_child_class_next,
+#endif
+ .child_class_iterate = filter_child_class_iterate,
.option = avfilter_options,
};
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;
+ 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,
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_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);
return count;
}
+int ff_filter_process_command(AVFilterContext *ctx, const char *cmd,
+ const char *arg, char *res, int res_len, int flags)
+{
+ const AVOption *o;
+
+ if (!ctx->filter->priv_class)
+ return 0;
+ o = av_opt_find2(ctx->priv, cmd, NULL, AV_OPT_FLAG_RUNTIME_PARAM | AV_OPT_FLAG_FILTERING_PARAM, AV_OPT_SEARCH_CHILDREN, NULL);
+ if (!o)
+ return AVERROR(ENOSYS);
+ return av_opt_set(ctx->priv, cmd, arg, 0);
+}
+
int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options)
{
int ret = 0;