aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2019-04-30 11:59:51 +0200
committerPaul B Mahol <onemda@gmail.com>2019-05-01 21:19:58 +0200
commitd3d1d5936fdc9a351d6d1aac8405292dfb14c831 (patch)
tree5cb2550fe1d78146f899e54b0eb5de4ce0b40310
parenta7fa89fa0bde08edcb02744540e085fef7304af2 (diff)
downloadffmpeg-d3d1d5936fdc9a351d6d1aac8405292dfb14c831.tar.gz
avfilter/vf_tonemap: add slice threading
-rw-r--r--libavfilter/vf_tonemap.c39
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,
};