From patchwork Fri Oct 27 16:19:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 5718 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.90 with SMTP id m26csp901048jah; Fri, 27 Oct 2017 09:28:09 -0700 (PDT) X-Google-Smtp-Source: ABhQp+TXXYZD8lIK9ygdGbfwcn6e3nwHX4UrDC/AN0kXOLwwsfelCiiaxbm17jY3FG0dEpCD5mk7 X-Received: by 10.28.178.205 with SMTP id b196mr855766wmf.103.1509121689622; Fri, 27 Oct 2017 09:28:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1509121689; cv=none; d=google.com; s=arc-20160816; b=sQzt7CFLFADVl/tEaB1/TRrDGjb2XfI3m8UL4EcjlCcB141HT1jIdQxos+ioYc0Hc5 1JpciX4XPqXFrabGv8zAKCCAKRfC4i1UG8UIXEm3sbkfT2Iw0qWq6th1FO7lcRuzSKXL n1fjeT4PzGUPNEKuT8eM+Weoanu8Br+HOtuqbXfSduLLFkSKe/ZAUlEWutp3X9muqhgt NCt0CDwnTzPY52vGnJqhPxjwDzzMjqZr3DHEeGRE7CU+qYGGh4KW8M+j6Yg/W6LowCFg UAF8WwlasZPfuDbrEGbYt34Zpe8jOpbSaEoZpVUtxU0RUo5Vb+Er08YSd0SXTAbGQ+qk tf8A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=kevD0F01FV0bJO0S4GOw7RFjN79nCcaPbnxiNdmsvn8=; b=ddslKzxzMRsjFztQTdiFSJZW0gw5hdrbQvGqSm9xTI7AE+lvsdMZTZQRl7aDNQopb0 HBou/3Y32sQlF7WCDZX+WIn3bdWvOxBRjN5ar76a9SNPbOF+X2UmnhBQlYPm+EoG22Gr IgbbRjdPD1Ro2s6+2eoKjiJJmk/qui+v6pIP4dlcezDKMRztzuFrnTps0nqqXiIRP/Ju 47sXnzN/hA0rPMbFUE6LWMc3FLa3rzWG3Wb32W66JFeFnNLLY2Hvz/y7NZtbe1KrnYmU 6Xc3UCpakAML8sD+rx2fnfk0aQJeYEjBGHE/0AdI/lMw7DYfmfCOOiyyWNqGfjD1YDco SIdw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ijvbtgF7; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q129si1450932wme.92.2017.10.27.09.28.08; Fri, 27 Oct 2017 09:28:09 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ijvbtgF7; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7DE2268A295; Fri, 27 Oct 2017 19:27:58 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr0-f193.google.com (mail-wr0-f193.google.com [209.85.128.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DDF3D68A241 for ; Fri, 27 Oct 2017 19:27:51 +0300 (EEST) Received: by mail-wr0-f193.google.com with SMTP id o44so6665514wrf.11 for ; Fri, 27 Oct 2017 09:28:00 -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=iP8yHgimvdd2T5Ywf5QkYRJxi8XEXQq0cNa6aUtiH6w=; b=ijvbtgF77MTJwWjCuN9S3qh9bascdy5va+vkW3evDZ9hIN94DqhWrCnDx27bl53VnQ Rm+hWGSNDWTscQE7ag3fzqjs11eDMb/j5n30RvvYP6fqvlR1aHLS22GEdkeOHY4qH7W/ azv5H4ENDp3GmymOWLHd9kyJVJMa2IEOFudGN8qYKEOfrYX4Uupu0tZsEHG+VMefBELI Kb28wCaplDKBDCiOsxv8G9tIDhJnvrDV1SYOQMrD5qEFnWUf+7QhqGqgS8J0h7t4sg9V +/HzYPygroobl+irzsmRMqwPGOvuF/5R00MRYO/1gJz3PRnz8roVHv0IXlVSpwtYgwGK iEaQ== 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=iP8yHgimvdd2T5Ywf5QkYRJxi8XEXQq0cNa6aUtiH6w=; b=lRv7+0wvy0RxT33uvaLORPAb9PaRG4ILTsJGXwrFZvUPwcAvTZ9JR2ZCiHOGPj4MYi kpuDqCjywwV3kOrplDitHGaMo1153bTmbkxTHbMz5I6rW2MYmOTLEFHHw3UKu/SvCnGS 5aqZnSaxaLFvuJJqoBj+cxFhsZ/rE34gCOHRxY8P806milBtzb9yFvHb3Cztm/Rapz8e kwwk/m03M4m7R20iaznIDaBrYJUTJdN0kO+HCJmKz114VFXfMEy8aGhjMx20rrGs6H4E ie0wCV9S1tY3qBSIhNEdYLD6LCKQgMwWG7A7r1g5kr+MTaK4HSfWdjXzVWkQAdUJQi/U mKLg== X-Gm-Message-State: AMCzsaX5yEM2TluIsxITfCs6eFp29VZnGImqw9YRrttt2vs0NNOli7b5 Cux1Bo0pcinDLien5tkhuoBxvQ== X-Received: by 10.223.196.3 with SMTP id v3mr957256wrf.255.1509121223818; Fri, 27 Oct 2017 09:20:23 -0700 (PDT) Received: from localhost.localdomain ([94.250.174.60]) by smtp.gmail.com with ESMTPSA id e131sm3218115wmg.1.2017.10.27.09.20.22 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Oct 2017 09:20:23 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Fri, 27 Oct 2017 18:19:39 +0200 Message-Id: <20171027161939.3625-2-onemda@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171027161939.3625-1-onemda@gmail.com> References: <20171027161939.3625-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/2] avfilter/af_join: switch to activate 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" Fixes #6780. Signed-off-by: Paul B Mahol --- libavfilter/af_join.c | 101 +++++++++++++++++++++++++++----------------------- 1 file changed, 54 insertions(+), 47 deletions(-) diff --git a/libavfilter/af_join.c b/libavfilter/af_join.c index 33df685691..030bb8e549 100644 --- a/libavfilter/af_join.c +++ b/libavfilter/af_join.c @@ -32,6 +32,7 @@ #include "audio.h" #include "avfilter.h" #include "formats.h" +#include "filters.h" #include "internal.h" typedef struct ChannelMap { @@ -78,34 +79,6 @@ static const AVOption join_options[] = { AVFILTER_DEFINE_CLASS(join); -static int try_push_frame(AVFilterContext *ctx); - -static int filter_frame(AVFilterLink *link, AVFrame *frame) -{ - AVFilterContext *ctx = link->dst; - JoinContext *s = ctx->priv; - int i, j; - - for (i = 0; i < ctx->nb_inputs; i++) - if (link == ctx->inputs[i]) - break; - av_assert0(i < ctx->nb_inputs); - av_assert0(!s->input_frames[i]); - s->input_frames[i] = frame; - - /* request the same number of samples on all inputs */ - /* FIXME that means a frame arriving asynchronously on a different input - will not have the requested number of samples */ - if (i == 0) { - int nb_samples = s->input_frames[0]->nb_samples; - - for (j = 1; !i && j < ctx->nb_inputs; j++) - ctx->inputs[j]->request_samples = nb_samples; - } - - return try_push_frame(ctx); -} - static int parse_maps(AVFilterContext *ctx) { JoinContext *s = ctx->priv; @@ -220,9 +193,6 @@ static av_cold int join_init(AVFilterContext *ctx) pad.name = av_strdup(name); if (!pad.name) return AVERROR(ENOMEM); - pad.filter_frame = filter_frame; - - pad.needs_fifo = 1; if ((ret = ff_insert_inpad(ctx, i, &pad)) < 0) { av_freep(&pad.name); @@ -390,21 +360,6 @@ fail: return ret; } -static int join_request_frame(AVFilterLink *outlink) -{ - AVFilterContext *ctx = outlink->src; - JoinContext *s = ctx->priv; - int i; - - /* get a frame on each input */ - for (i = 0; i < ctx->nb_inputs; i++) { - AVFilterLink *inlink = ctx->inputs[i]; - if (!s->input_frames[i]) - return ff_request_frame(inlink); - } - return 0; -} - static int try_push_frame(AVFilterContext *ctx) { AVFilterLink *outlink = ctx->outputs[0]; @@ -420,6 +375,8 @@ static int try_push_frame(AVFilterContext *ctx) return 0; nb_samples = FFMIN(nb_samples, s->input_frames[i]->nb_samples); } + if (!nb_samples) + return 0; /* setup the output frame */ frame = av_frame_alloc(); @@ -508,12 +465,61 @@ fail: return ret; } +static int activate(AVFilterContext *ctx) +{ + JoinContext *s = ctx->priv; + int i, ret, status; + int nb_samples = 0; + int64_t pts; + + if (!s->input_frames[0]) { + ret = ff_inlink_consume_frame(ctx->inputs[0], &s->input_frames[0]); + if (ret < 0) { + return ret; + } else if (ff_inlink_acknowledge_status(ctx->inputs[0], &status, &pts)) { + ff_outlink_set_status(ctx->outputs[0], status, pts); + return 0; + } else { + if (ff_outlink_frame_wanted(ctx->outputs[0]) && !s->input_frames[0]) { + ff_inlink_request_frame(ctx->inputs[0]); + return 0; + } + } + } + + nb_samples = s->input_frames[0]->nb_samples; + + for (i = 1; i < ctx->nb_inputs && nb_samples > 0; i++) { + if (s->input_frames[i]) + continue; + + if (ff_inlink_check_available_samples(ctx->inputs[i], nb_samples) > 0) { + ret = ff_inlink_consume_samples(ctx->inputs[i], nb_samples, nb_samples, &s->input_frames[i]); + if (ret < 0) { + return ret; + } else if (ff_inlink_acknowledge_status(ctx->inputs[i], &status, &pts)) { + ff_outlink_set_status(ctx->outputs[0], status, pts); + return 0; + } + } else { + if (ff_outlink_frame_wanted(ctx->outputs[0])) { + ff_inlink_request_frame(ctx->inputs[i]); + return 0; + } + } + } + + if (i == ctx->nb_inputs) + ret = try_push_frame(ctx); + + return ret; +} + static const AVFilterPad avfilter_af_join_outputs[] = { { .name = "default", .type = AVMEDIA_TYPE_AUDIO, .config_props = join_config_output, - .request_frame = join_request_frame, }, { NULL } }; @@ -526,6 +532,7 @@ AVFilter ff_af_join = { .priv_class = &join_class, .init = join_init, .uninit = join_uninit, + .activate = activate, .query_formats = join_query_formats, .inputs = NULL, .outputs = avfilter_af_join_outputs,