X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Fvf_tonemap.c;h=d1728c8513b0c9303c710734916e2580226264df;hb=3a370868dc33061a20d1fd99274e65167d7a78ac;hp=98a2c4bd23ca4acbc3fef6306bd97464060367d4;hpb=0ff76ca86e0ea4dcf2b392c45f5fac8e5576bb0d;p=ffmpeg diff --git a/libavfilter/vf_tonemap.c b/libavfilter/vf_tonemap.c index 98a2c4bd23c..d1728c8513b 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))); /* copy/generate alpha if needed */ if (desc->flags & AV_PIX_FMT_FLAG_ALPHA && odesc->flags & AV_PIX_FMT_FLAG_ALPHA) { @@ -287,13 +315,7 @@ static const AVOption tonemap_options[] = { { NULL } }; -static const AVClass tonemap_class = { - .class_name = "tonemap", - .item_name = av_default_item_name, - .option = tonemap_options, - .version = LIBAVUTIL_VERSION_INT, - .category = AV_CLASS_CATEGORY_FILTER, -}; +AVFILTER_DEFINE_CLASS(tonemap); static const AVFilterPad tonemap_inputs[] = { { @@ -321,4 +343,5 @@ AVFilter ff_vf_tonemap = { .priv_class = &tonemap_class, .inputs = tonemap_inputs, .outputs = tonemap_outputs, + .flags = AVFILTER_FLAG_SLICE_THREADS, };