[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