Commit f8d7b5fe authored by Nicolas George's avatar Nicolas George

lavfi: add a preinit callback to filters.

It is necessary for filters with child objects, to set the class
and default options values.
parent 19804024
......@@ -692,6 +692,7 @@ static int default_execute(AVFilterContext *ctx, avfilter_action_func *func, voi
AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name)
{
AVFilterContext *ret;
int preinited = 0;
if (!filter)
return NULL;
......@@ -708,6 +709,11 @@ AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name)
if (!ret->priv)
goto err;
}
if (filter->preinit) {
if (filter->preinit(ret) < 0)
goto err;
preinited = 1;
}
av_opt_set_defaults(ret);
if (filter->priv_class) {
......@@ -745,6 +751,8 @@ AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name)
return ret;
err:
if (preinited)
filter->uninit(ret);
av_freep(&ret->inputs);
av_freep(&ret->input_pads);
ret->nb_inputs = 0;
......
......@@ -194,6 +194,21 @@ typedef struct AVFilter {
*****************************************************************
*/
/**
* Filter pre-initialization function
*
* This callback will be called immediately after the filter context is
* allocated, to allow allocating and initing sub-objects.
*
* If this callback is not NULL, the uninit callback will be called on
* allocation failure.
*
* @return 0 on success,
* AVERROR code on failure (but the code will be
* dropped and treated as ENOMEM by the calling code)
*/
int (*preinit)(AVFilterContext *ctx);
/**
* Filter initialization function.
*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment