diff options
author | Paul B Mahol <onemda@gmail.com> | 2019-04-30 11:59:51 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2019-05-01 21:19:58 +0200 |
commit | d3d1d5936fdc9a351d6d1aac8405292dfb14c831 (patch) | |
tree | 5cb2550fe1d78146f899e54b0eb5de4ce0b40310 | |
parent | a7fa89fa0bde08edcb02744540e085fef7304af2 (diff) | |
download | ffmpeg-d3d1d5936fdc9a351d6d1aac8405292dfb14c831.tar.gz |
avfilter/vf_tonemap: add slice threading
-rw-r--r-- | libavfilter/vf_tonemap.c | 39 |
1 files 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))); /* 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, }; |