From patchwork Wed Sep 25 17:05:04 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: 15288 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 C88B3448531 for ; Wed, 25 Sep 2019 20:05:22 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B06796898E5; Wed, 25 Sep 2019 20:05:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 05F22688184 for ; Wed, 25 Sep 2019 20:05:16 +0300 (EEST) Received: by mail-wm1-f67.google.com with SMTP id y135so4650190wmc.1 for ; Wed, 25 Sep 2019 10:05:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=a+4liEl+gHHGpfccqCNGwkzFQRRnJbE33RoXcBOp0Wg=; b=Fm3K3oi+3V/GPQA4lgrKASslIPc3Ci4bvYO7dh6RGKQ+2F3Qs+XprPLjrRj9S51jZo NdPVjBwb9ultvGAZUk1LpN3G9e/cl5d2iBZ+MdM4duIeKbz4lJBRCaRgtOB7fdVio/zs C2dDDSv4WQDpHZR2itvu773yRTmrWwWqbo0hpB+caLbebAm1WOH8ihgTWdl+4PFl8fC5 CjBAGOLclIU7DjQqtZjw5U1+wrjzFPQrgkPVLoAwtf6uItdZ0IpjQ0lTvEUlo0t/DLQJ tl6pNkPliUXQ4v+flbsIvCcJ2chQb3/xL0jx6acecZB4wNZq97cKgZOeifZvq7p57ouA Qplw== 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:in-reply-to :references; bh=a+4liEl+gHHGpfccqCNGwkzFQRRnJbE33RoXcBOp0Wg=; b=Of3xswrVWpsUte2D9riPFIkCfcvaU7KfwwwNV2IqR/dsV4pso0LzNcfNpYJ8j/Rj+z M2Jn7lzgn55uqkJbkMO4u6h5LVR8Qgq1FXU4oQfDknEAUeC2Elo9vBF6PNP0CszcWh+j kqPFyI1i5ZWmZAU/4xL837GyJCpV/8uP71Brm5AOyVmSclvwjfdQfUwO/MgvbeCan2g8 4A/Fadwpd8si+Yq7xreUkoIoJEoeJ0GHJFw/u7I5h/ABEp6B9dpZduvebZ4QKM2MOoo2 hAGck3yf8v6s0eBtYdngscOl8utYqtM3fNaEkISJ0oX0dag8NYYrjOpDLtFUUlPcNs4Z Mukg== X-Gm-Message-State: APjAAAWH7w7kyMiEq7zrS3GOYZs7bM4jIjtG8RZZst1AP0RVq9Eo4sKN t5hzxfIcq2RZMep/5LTnPK2rCnAp X-Google-Smtp-Source: APXvYqyiXQzvyzT52RI4Kb+o8a6arNLDnIvvLtCDexM0vGUcdQduoY5gMvqpP9Oy4cLVJ/er6Z4Gmw== X-Received: by 2002:a1c:2501:: with SMTP id l1mr8288678wml.74.1569431115101; Wed, 25 Sep 2019 10:05:15 -0700 (PDT) Received: from localhost.localdomain ([109.227.33.147]) by smtp.gmail.com with ESMTPSA id l13sm4998668wmj.25.2019.09.25.10.05.14 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Sep 2019 10:05:14 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Wed, 25 Sep 2019 19:05:04 +0200 Message-Id: <20190925170504.18987-2-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190925170504.18987-1-onemda@gmail.com> References: <20190925170504.18987-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/2] avfilter/vf_stack: 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_stack.c | 43 +++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/libavfilter/vf_stack.c b/libavfilter/vf_stack.c index 3b05807a95..b9e87a4429 100644 --- a/libavfilter/vf_stack.c +++ b/libavfilter/vf_stack.c @@ -116,6 +116,29 @@ static av_cold int init(AVFilterContext *ctx) return 0; } +static int process_slice(AVFilterContext *ctx, void *arg, int job, int nb_jobs) +{ + StackContext *s = ctx->priv; + AVFrame *out = arg; + AVFrame **in = s->frames; + const int start = (s->nb_inputs * job ) / nb_jobs; + const int end = (s->nb_inputs * (job+1)) / nb_jobs; + + for (int i = start; i < end; i++) { + StackItem *item = &s->items[i]; + + for (int p = 0; p < s->nb_planes; p++) { + av_image_copy_plane(out->data[p] + out->linesize[p] * item->y[p] + item->x[p], + out->linesize[p], + in[i]->data[p], + in[i]->linesize[p], + item->linesize[p], item->height[p]); + } + } + + return 0; +} + static int process_frame(FFFrameSync *fs) { AVFilterContext *ctx = fs->parent; @@ -123,7 +146,7 @@ static int process_frame(FFFrameSync *fs) StackContext *s = fs->opaque; AVFrame **in = s->frames; AVFrame *out; - int i, p, ret; + int i, ret; for (i = 0; i < s->nb_inputs; i++) { if ((ret = ff_framesync_get_frame(&s->fs, i, &in[i], 0)) < 0) @@ -136,17 +159,7 @@ static int process_frame(FFFrameSync *fs) out->pts = av_rescale_q(s->fs.pts, s->fs.time_base, outlink->time_base); out->sample_aspect_ratio = outlink->sample_aspect_ratio; - for (i = 0; i < s->nb_inputs; i++) { - StackItem *item = &s->items[i]; - - for (p = 0; p < s->nb_planes; p++) { - av_image_copy_plane(out->data[p] + out->linesize[p] * item->y[p] + item->x[p], - out->linesize[p], - in[i]->data[p], - in[i]->linesize[p], - item->linesize[p], item->height[p]); - } - } + ctx->internal->execute(ctx, process_slice, out, NULL, FFMIN(s->nb_inputs, ff_filter_get_nb_threads(ctx))); return ff_filter_frame(outlink, out); } @@ -370,7 +383,7 @@ AVFilter ff_vf_hstack = { .init = init, .uninit = uninit, .activate = activate, - .flags = AVFILTER_FLAG_DYNAMIC_INPUTS, + .flags = AVFILTER_FLAG_DYNAMIC_INPUTS | AVFILTER_FLAG_SLICE_THREADS, }; #endif /* CONFIG_HSTACK_FILTER */ @@ -390,7 +403,7 @@ AVFilter ff_vf_vstack = { .init = init, .uninit = uninit, .activate = activate, - .flags = AVFILTER_FLAG_DYNAMIC_INPUTS, + .flags = AVFILTER_FLAG_DYNAMIC_INPUTS | AVFILTER_FLAG_SLICE_THREADS, }; #endif /* CONFIG_VSTACK_FILTER */ @@ -416,7 +429,7 @@ AVFilter ff_vf_xstack = { .init = init, .uninit = uninit, .activate = activate, - .flags = AVFILTER_FLAG_DYNAMIC_INPUTS, + .flags = AVFILTER_FLAG_DYNAMIC_INPUTS | AVFILTER_FLAG_SLICE_THREADS, }; #endif /* CONFIG_XSTACK_FILTER */