[FFmpeg-devel] [PATCH V2] lavfi/colorlevels: Add slice threading support

Li, Zhong zhong.li at intel.com
Wed May 22 07:24:32 EEST 2019


> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On Behalf
> Of Jun Zhao
> Sent: Tuesday, May 21, 2019 7:21 PM
> To: ffmpeg-devel at ffmpeg.org
> Cc: Jun Zhao <barryjzhao at tencent.com>
> Subject: [FFmpeg-devel] [PATCH V2] lavfi/colorlevels: Add slice threading
> support
> 
> From: Jun Zhao <barryjzhao at tencent.com>
> 
> Add slice threading support, use the command like:
> 
> ./ffmpeg -i input -vf colorlevel with 1080p h264 clip, the fps from 39 fps to
> 79 fps in the local
> 
> Signed-off-by: Jun Zhao <barryjzhao at tencent.com>
> ---
>  libavfilter/vf_colorlevels.c |  125
> +++++++++++++++++++++++++++++++++++------
>  1 files changed, 106 insertions(+), 19 deletions(-)
> 
> diff --git a/libavfilter/vf_colorlevels.c b/libavfilter/vf_colorlevels.c index
> 5385a5e..68668e7 100644
> --- a/libavfilter/vf_colorlevels.c
> +++ b/libavfilter/vf_colorlevels.c
> @@ -105,6 +105,83 @@ static int config_input(AVFilterLink *inlink)
>      return 0;
>  }
> 
> +struct thread_data {
> +    const uint8_t *srcrow;
> +    uint8_t *dstrow;
> +    int dst_linesize;
> +    int src_linesize;
> +
> +    double coeff;
> +    uint8_t offset;
> +
> +    int h;
> +
> +    int imin;
> +    int omin;
> +};
> +
> +static int colorlevel_slice_8(AVFilterContext *ctx, void *arg, int
> +jobnr, int nb_jobs) {
> +    ColorLevelsContext *s = ctx->priv;
> +    const struct thread_data *td = arg;
> +
> +    int process_h = td->h;
> +    const int slice_start = (process_h *  jobnr   ) / nb_jobs;
> +    const int slice_end   = (process_h * (jobnr+1)) / nb_jobs;
> +    int x, y;
> +    const uint8_t *srcrow = td->srcrow;
> +    uint8_t *dstrow = td->dstrow;
> +    const int step = s->step;
> +    const uint8_t offset = td->offset;
> +
> +    int imin = td->imin;
> +    int omin = td->omin;
> +    double coeff = td->coeff;
> +
> +    for (y = slice_start; y < slice_end; y++) {
> +        const uint8_t *src = srcrow;
> +        uint8_t *dst = dstrow;
> +
> +        for (x = 0; x < s->linesize; x += step)
> +            dst[x + offset] = av_clip_uint8((src[x + offset] - imin) * coeff
> + omin);
> +        dstrow += td->dst_linesize;
> +        srcrow += td->src_linesize;
> +    }
> +
> +    return 0;
> +}
> +
> +static int colorlevel_slice_16(AVFilterContext *ctx, void *arg, int
> +jobnr, int nb_jobs) {
> +    ColorLevelsContext *s = ctx->priv;
> +    const struct thread_data *td = arg;
> +
> +    int process_h = td->h;
> +    const int slice_start = (process_h *  jobnr   ) / nb_jobs;
> +    const int slice_end   = (process_h * (jobnr+1)) / nb_jobs;
> +    int x, y;
> +    const uint8_t *srcrow = td->srcrow;
> +    uint8_t *dstrow = td->dstrow;
> +    const int step = s->step;
> +    const uint8_t offset = td->offset;
> +
> +    int imin = td->imin;
> +    int omin = td->omin;
> +    double coeff = td->coeff;
> +
> +    for (y = slice_start; y < slice_end; y++) {
> +        const uint16_t *src = (const uint16_t *)srcrow;
> +        uint16_t *dst = (uint16_t *)dstrow;

Function colorlevel_slice_16() is same as colorlevel_slice_8 expect here to replace unit8_t to be unit16t.
Would better to define a template function to be reused.

> +        for (x = 0; x < s->linesize; x += step)
> +            dst[x + offset] = av_clip_uint8((src[x + offset] - imin) * coeff
> + omin);
> +        dstrow += td->dst_linesize;
> +        srcrow += td->src_linesize;
> +    }
> +
> +    return 0;
> +}


More information about the ffmpeg-devel mailing list