[FFmpeg-devel] [PATCH v3 25/25] avfilter/vf_xmedian: Split portion of init unique to xmedian off

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Fri Sep 3 18:28:04 EEST 2021


Andreas Rheinhardt:
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> ---
>  libavfilter/vf_xmedian.c | 56 ++++++++++++++++++++++------------------
>  1 file changed, 31 insertions(+), 25 deletions(-)
> 
> diff --git a/libavfilter/vf_xmedian.c b/libavfilter/vf_xmedian.c
> index f8e4e4adb2..a9e3255a2a 100644
> --- a/libavfilter/vf_xmedian.c
> +++ b/libavfilter/vf_xmedian.c
> @@ -39,7 +39,7 @@ typedef struct XMedianContext {
>      int planes;
>      float percentile;
>  
> -    int tmedian;
> +    int xmedian;
>      int radius;
>      int index;
>      int depth;
> @@ -92,15 +92,9 @@ static int query_formats(AVFilterContext *ctx)
>  static av_cold int init(AVFilterContext *ctx)
>  {
>      XMedianContext *s = ctx->priv;
> -    int ret;
> -
> -    s->tmedian = !strcmp(ctx->filter->name, "tmedian");
>  
> -    if (!s->tmedian) {
> -        s->radius = s->nb_inputs / 2;
> -    } else {
> +    if (!s->xmedian)
>          s->nb_inputs = s->radius * 2 + 1;
> -    }
>  
>      if (s->nb_inputs & 1)
>          s->index = s->radius * 2.f * s->percentile;
> @@ -110,18 +104,6 @@ static av_cold int init(AVFilterContext *ctx)
>      if (!s->frames)
>          return AVERROR(ENOMEM);
>  
> -    for (int i = 0; i < s->nb_inputs && !s->tmedian; i++) {
> -        AVFilterPad pad = { 0 };
> -
> -        pad.type = AVMEDIA_TYPE_VIDEO;
> -        pad.name = av_asprintf("input%d", i);
> -        if (!pad.name)
> -            return AVERROR(ENOMEM);
> -
> -        if ((ret = ff_append_inpad_free_name(ctx, &pad)) < 0)
> -            return ret;
> -    }
> -
>      return 0;
>  }
>  
> @@ -270,7 +252,7 @@ static int config_output(AVFilterLink *outlink)
>      FFFrameSyncIn *in;
>      int i, ret;
>  
> -    for (int i = 1; i < s->nb_inputs && !s->tmedian; i++) {
> +    for (int i = 1; i < s->nb_inputs && s->xmedian; i++) {
>          if (ctx->inputs[i]->h != height || ctx->inputs[i]->w != width) {
>              av_log(ctx, AV_LOG_ERROR, "Input %d size (%dx%d) does not match input %d size (%dx%d).\n", i, ctx->inputs[i]->w, ctx->inputs[i]->h, 0, width, height);
>              return AVERROR(EINVAL);
> @@ -297,7 +279,7 @@ static int config_output(AVFilterLink *outlink)
>      s->height[1] = s->height[2] = AV_CEIL_RSHIFT(inlink->h, s->desc->log2_chroma_h);
>      s->height[0] = s->height[3] = inlink->h;
>  
> -    if (s->tmedian)
> +    if (!s->xmedian)
>          return 0;
>  
>      outlink->w          = width;
> @@ -333,7 +315,7 @@ static av_cold void uninit(AVFilterContext *ctx)
>  
>      ff_framesync_uninit(&s->fs);
>  
> -    for (int i = 0; i < s->nb_frames && s->frames && s->tmedian; i++)
> +    for (int i = 0; i < s->nb_frames && s->frames && !s->xmedian; i++)
>          av_frame_free(&s->frames[i]);
>      av_freep(&s->frames);
>  }
> @@ -362,6 +344,31 @@ static int process_command(AVFilterContext *ctx, const char *cmd, const char *ar
>      return 0;
>  }
>  
> +#if CONFIG_XMEDIAN_FILTER
> +static av_cold int xmedian_init(AVFilterContext *ctx)
> +{
> +    XMedianContext *s = ctx->priv;
> +    int ret;
> +
> +    s->xmedian = 1;
> +
> +    s->radius = s->nb_inputs / 2;
> +
> +    for (int i = 0; i < s->nb_inputs; i++) {
> +        AVFilterPad pad = { 0 };
> +
> +        pad.type = AVMEDIA_TYPE_VIDEO;
> +        pad.name = av_asprintf("input%d", i);
> +        if (!pad.name)
> +            return AVERROR(ENOMEM);
> +
> +        if ((ret = ff_append_inpad_free_name(ctx, &pad)) < 0)
> +            return ret;
> +    }
> +
> +    return init(ctx);
> +}
> +
>  #define OFFSET(x) offsetof(XMedianContext, x)
>  #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
>  #define TFLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_RUNTIME_PARAM
> @@ -381,7 +388,6 @@ static const AVFilterPad outputs[] = {
>      },
>  };
>  
> -#if CONFIG_XMEDIAN_FILTER
>  FRAMESYNC_DEFINE_CLASS(xmedian, XMedianContext, fs);
>  
>  const AVFilter ff_vf_xmedian = {
> @@ -392,7 +398,7 @@ const AVFilter ff_vf_xmedian = {
>      .query_formats = query_formats,
>      FILTER_OUTPUTS(outputs),
>      .preinit       = xmedian_framesync_preinit,
> -    .init          = init,
> +    .init          = xmedian_init,
>      .uninit        = uninit,
>      .activate      = activate,
>      .flags         = AVFILTER_FLAG_DYNAMIC_INPUTS | AVFILTER_FLAG_SLICE_THREADS |
> 
Will apply tomorrow unless there are objections.

- Andreas


More information about the ffmpeg-devel mailing list