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

mypopy at gmail.com mypopy at gmail.com
Thu May 23 05:13:54 EEST 2019


On Wed, May 22, 2019 at 12:24 PM Li, Zhong <zhong.li at intel.com> wrote:
>
> > 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.
I don't like to get in C to templates is some ugly macro code for
function overloading, this is the reason use 2 function for
8bits/16bits


More information about the ffmpeg-devel mailing list