[FFmpeg-devel] [PATCH 2/2] avfilter/vf_hflip: support slice threading

Stefano Sabatini stefasab at gmail.com
Mon Sep 30 12:40:24 CEST 2013


On date Monday 2013-09-30 09:50:00 +0000, Paul B Mahol encoded:
> Signed-off-by: Paul B Mahol <onemda at gmail.com>
> ---
>  libavfilter/vf_hflip.c | 59 ++++++++++++++++++++++++++++++++++----------------
>  1 file changed, 40 insertions(+), 19 deletions(-)
> 
> diff --git a/libavfilter/vf_hflip.c b/libavfilter/vf_hflip.c
> index ecdf17f..561879f 100644
> --- a/libavfilter/vf_hflip.c
> +++ b/libavfilter/vf_hflip.c
> @@ -75,34 +75,30 @@ static int config_props(AVFilterLink *inlink)
>      return 0;
>  }
>  
> -static int filter_frame(AVFilterLink *inlink, AVFrame *in)
> +typedef struct ThreadData {
> +    AVFrame *in, *out;
> +} ThreadData;
> +
> +static int filter_slice(AVFilterContext *ctx, void *arg, int job, int nb_jobs)
>  {
> -    AVFilterContext *ctx  = inlink->dst;
> -    FlipContext *s     = ctx->priv;
> -    AVFilterLink *outlink = ctx->outputs[0];
> -    AVFrame *out;
> +    FlipContext *s = ctx->priv;
> +    ThreadData *td = arg;
> +    AVFrame *in = td->in;
> +    AVFrame *out = td->out;
>      uint8_t *inrow, *outrow;
>      int i, j, plane, step;
>  
> -    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
> -    if (!out) {
> -        av_frame_free(&in);
> -        return AVERROR(ENOMEM);
> -    }
> -    av_frame_copy_props(out, in);
> -
> -    /* copy palette if required */
> -    if (av_pix_fmt_desc_get(inlink->format)->flags & AV_PIX_FMT_FLAG_PAL)
> -        memcpy(out->data[1], in->data[1], AVPALETTE_SIZE);
> -
>      for (plane = 0; plane < 4 && in->data[plane] && in->linesize[plane]; plane++) {
>          const int width  = s->planewidth[plane];
>          const int height = s->planeheight[plane];
> +        const int start = (height *  job   ) / nb_jobs;
> +        const int end   = (height * (job+1)) / nb_jobs;
> +
>          step = s->max_step[plane];
>  
> -        outrow = out->data[plane];
> -        inrow  = in ->data[plane] + (width - 1) * step;
> -        for (i = 0; i < height; i++) {
> +        outrow = out->data[plane] + start * out->linesize[plane];
> +        inrow  = in ->data[plane] + start * in->linesize[plane] + (width - 1) * step;
> +        for (i = start; i < end; i++) {
>              switch (step) {
>              case 1:
>                  for (j = 0; j < width; j++)
> @@ -148,6 +144,30 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
>          }
>      }
>  
> +    return 0;
> +}
> +
> +static int filter_frame(AVFilterLink *inlink, AVFrame *in)
> +{
> +    AVFilterContext *ctx  = inlink->dst;
> +    AVFilterLink *outlink = ctx->outputs[0];
> +    ThreadData td;
> +    AVFrame *out;
> +
> +    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
> +    if (!out) {
> +        av_frame_free(&in);
> +        return AVERROR(ENOMEM);
> +    }
> +    av_frame_copy_props(out, in);
> +
> +    /* copy palette if required */
> +    if (av_pix_fmt_desc_get(inlink->format)->flags & AV_PIX_FMT_FLAG_PAL)
> +        memcpy(out->data[1], in->data[1], AVPALETTE_SIZE);
> +
> +    td.in = in, td.out = out;
> +    ctx->internal->execute(ctx, filter_slice, &td, NULL, FFMIN(outlink->h, ctx->graph->nb_threads));
> +
>      av_frame_free(&in);
>      return ff_filter_frame(outlink, out);
>  }
> @@ -177,4 +197,5 @@ AVFilter avfilter_vf_hflip = {
>      .query_formats = query_formats,
>      .inputs        = avfilter_vf_hflip_inputs,
>      .outputs       = avfilter_vf_hflip_outputs,
> +    .flags         = AVFILTER_FLAG_SLICE_THREADS,
>  };

LGTM, assuming it is tested, thanks.
-- 
FFmpeg = Frenzy Fundamentalist Mournful Porno Enhancing Guru


More information about the ffmpeg-devel mailing list