[FFmpeg-devel] [PATCH] avfilter/vf_tonemap: add slice threading
Paul B Mahol
onemda at gmail.com
Tue Apr 30 23:18:36 EEST 2019
On 4/30/19, Vittorio Giovara <vittorio.giovara at gmail.com> wrote:
> On Tue, Apr 30, 2019 at 6:07 AM Paul B Mahol <onemda at gmail.com> wrote:
>
>> Signed-off-by: Paul B Mahol <onemda at gmail.com>
>> ---
>> libavfilter/vf_tonemap.c | 39 ++++++++++++++++++++++++++++++++++-----
>> 1 file changed, 34 insertions(+), 5 deletions(-)
>>
>> diff --git a/libavfilter/vf_tonemap.c b/libavfilter/vf_tonemap.c
>> index efd4af5466..d1728c8513 100644
>> --- a/libavfilter/vf_tonemap.c
>> +++ b/libavfilter/vf_tonemap.c
>> @@ -191,10 +191,36 @@ static void tonemap(TonemapContext *s, AVFrame *out,
>> const AVFrame *in,
>> *b_out *= sig / sig_orig;
>> }
>>
>> +typedef struct ThreadData {
>> + AVFrame *in, *out;
>> + const AVPixFmtDescriptor *desc;
>> + double peak;
>> +} ThreadData;
>> +
>> +static int tonemap_slice(AVFilterContext *ctx, void *arg, int jobnr, int
>> nb_jobs)
>> +{
>> + TonemapContext *s = ctx->priv;
>> + ThreadData *td = arg;
>> + AVFrame *in = td->in;
>> + AVFrame *out = td->out;
>> + const AVPixFmtDescriptor *desc = td->desc;
>> + const int slice_start = (in->height * jobnr) / nb_jobs;
>> + const int slice_end = (in->height * (jobnr+1)) / nb_jobs;
>> + double peak = td->peak;
>> +
>> + for (int y = slice_start; y < slice_end; y++)
>> + for (int x = 0; x < out->width; x++)
>> + tonemap(s, out, in, desc, x, y, peak);
>> +
>> + return 0;
>> +}
>> +
>> static int filter_frame(AVFilterLink *link, AVFrame *in)
>> {
>> - TonemapContext *s = link->dst->priv;
>> - AVFilterLink *outlink = link->dst->outputs[0];
>> + AVFilterContext *ctx = link->dst;
>> + TonemapContext *s = ctx->priv;
>> + AVFilterLink *outlink = ctx->outputs[0];
>> + ThreadData td;
>> AVFrame *out;
>> const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format);
>> const AVPixFmtDescriptor *odesc =
>> av_pix_fmt_desc_get(outlink->format);
>> @@ -245,9 +271,11 @@ static int filter_frame(AVFilterLink *link, AVFrame
>> *in)
>> }
>>
>> /* do the tone map */
>> - for (y = 0; y < out->height; y++)
>> - for (x = 0; x < out->width; x++)
>> - tonemap(s, out, in, desc, x, y, peak);
>> + td.out = out;
>> + td.in = in;
>> + td.desc = desc;
>> + td.peak = peak;
>> + ctx->internal->execute(ctx, tonemap_slice, &td, NULL,
>> FFMIN(in->height, ff_filter_get_nb_threads(ctx)));
>>
>
> why this FFMIN()?
So that it does not break up if user set number of threads more than height.
>
> /* copy/generate alpha if needed */
>> if (desc->flags & AV_PIX_FMT_FLAG_ALPHA && odesc->flags &
>> AV_PIX_FMT_FLAG_ALPHA) {
>> @@ -315,4 +343,5 @@ AVFilter ff_vf_tonemap = {
>> .priv_class = &tonemap_class,
>> .inputs = tonemap_inputs,
>> .outputs = tonemap_outputs,
>> + .flags = AVFILTER_FLAG_SLICE_THREADS,
>> };
>> --
>>
>
> lgtm
> --
> Vittorio
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list