From patchwork Tue Apr 30 10:00:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 12949 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 6BC6B446C3C for ; Tue, 30 Apr 2019 13:07:31 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 43FE46809C4; Tue, 30 Apr 2019 13:07:31 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2FA036805D3 for ; Tue, 30 Apr 2019 13:07:24 +0300 (EEST) Received: by mail-wr1-f68.google.com with SMTP id f7so11784684wrs.2 for ; Tue, 30 Apr 2019 03:07:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=mTeFlRbrt/RSyx9XOS7KMdnsY9fNUEGR5xS6D9fFIkQ=; b=J37masc+ovFlVGXjslQ8OWYE9Km2YrFQnaqWOyeu28497IAyYsT55d25D927urN4oD U+XjXwqoCQea6Dled9pmFWvdxquNpLbhy4XYtRGgDCEjDXa2AjoohpAc6+3VgBkbyX64 wW6GygtzUVF/snQwKvs85Rp028Ej53tFCbnj9Ul7yViTWU0Y03F2+6DrlSkwc8v7QybE FJeaiRheVTKeEw0afCtbW1wTwCqItB8+4XOulVH6C8UURIjucN6NOkIYfcrH/Kt8hCgS wq1C6f6EYZNCsLuV5XyabdNzDyGdmi5E4cYMQkFIV9KQFxwSTpGKBc8kcIhLe0ZPzaw+ 5iGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=mTeFlRbrt/RSyx9XOS7KMdnsY9fNUEGR5xS6D9fFIkQ=; b=WnHRMSWBnjhJCb4s5t37/Ny7L7W9jOZrBsd58c/h47pDdArnA+ZwSe0DWJ4EXu1iwA VEbjTEpgPj06sqx6EM66sCAR83Wx2gmD8oLjPSSVCGBDJe4AIEwnnF4ODl75LW5ZOA75 wUOTk/KHkEbO/+QuSWDJ+mPkf9RIzg5NB2crB1E+IFMTa9Qq0zRHY8ITgaIkwFDtDxx/ qIF9oqD6se8mXIzH7s0LRX7xaqBmhEO3xKwcNa+fPxP3IKov1rnaTMVqq0A+uG7zU108 2Fn6XAftq4z4uesYUiWtlBp95TgZuj3n5qq+bhwsLIWskA9vqz8yILzc28jKjR2H34dv ulJA== X-Gm-Message-State: APjAAAW7VqTiQXb1ZdqiPVTK8AOI/jeqMPPCq4ezMeWEum/cMftRimGH yiYvcG5PVX14X/gLXC51MgB5ZStd X-Google-Smtp-Source: APXvYqxHpvjQeUgkgYI0jcpwOyqv7sb+BXO4+wj79yBxOXHqdcLaS7wdMNpQ4x9d3M4hMIkwbfT05Q== X-Received: by 2002:adf:ea83:: with SMTP id s3mr8477735wrm.139.1556618437454; Tue, 30 Apr 2019 03:00:37 -0700 (PDT) Received: from localhost.localdomain ([37.244.241.103]) by smtp.gmail.com with ESMTPSA id 10sm2089046wmd.25.2019.04.30.03.00.36 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Apr 2019 03:00:36 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Tue, 30 Apr 2019 12:00:28 +0200 Message-Id: <20190430100028.23305-1-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH] avfilter/vf_tonemap: add slice threading X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- 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))); /* 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, };