From patchwork Wed Oct 3 11:03:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 10567 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:ab0:73d2:0:0:0:0:0 with SMTP id m18csp4047246uaq; Wed, 3 Oct 2018 04:04:14 -0700 (PDT) X-Google-Smtp-Source: ACcGV62QS6UNxsvBUM2NkVRDW+ta1WytgykSadqp+69/zz9CJt3WsdXb0nIyaFTAGceySEYZK804 X-Received: by 2002:a5d:4b06:: with SMTP id v6-v6mr805911wrq.87.1538564654801; Wed, 03 Oct 2018 04:04:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538564654; cv=none; d=google.com; s=arc-20160816; b=feRAEeyRd1Mr1vPZaB7st5YtJMaNLew5g5hQqlMzp7kuzdsOPc7ZLKtXxlQ7d7yP6P xV9djtXhFj9OSxPpukBrf9o/dO3wBUgC0ndqtqHoGpVluFUJ4EXqiUr//dvdwUuQu3Yh 7ZiEPUh2za5sRsA+KrkeExAETxVp51TGHJiHybS0wIaebguFOeiLGkboev+AbYqG+jKE m497qKUxExAiVnhO9aEbTBC8nHRb/iMoGta7Sb2NeY645N/eUT5xRUPUF5tLChUCKFqb RoqGpQSKbGFspd8QJuDKUJia5D1VFDFkbiLbrs3synXzRf/0Hpa3Baci3JSyDj2DvzJQ +DZA== 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; bh=l5ggQIHu3jcDDAZEc80WtCpnWwLB4W2lLvq9/MrftDk=; b=xjE0enwCEW41Tf9Gq+Izmv7DqbNHv5c+JKWDNPv9/8Lc7sEkVT9ebTB9r3vp0zG8hh f8DmY3d9fkCrXbc3UFp9eV1jJx98t3dt4kxKOosJ+aSL4A3p51U4a5R3ZA7YPWcSSAbS lMXr/EZvaQvtrZYxWt27kVp7bN1H8SDuFrQMau/FGx/QNJnrF2MlXJnPGyz8z51n1tIa 3d7MiR66k1fgngk12589Vt0CTHGZ3iELz+5m92Fsfi5RtgFt7mXGWcZGiCREEW2qye1H u37jPl0ww/muTVPbHkEKLcPu8uK5PcMZ5ey0g1P0v/l3+i3fzyKN7yufkwa/AaT1xrDE 4yvQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=fm6Xcp1M; 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=QUARANTINE 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 e5-v6si851177wrw.379.2018.10.03.04.04.14; Wed, 03 Oct 2018 04:04:14 -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=fm6Xcp1M; 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=QUARANTINE 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 E3A4868A3F8; Wed, 3 Oct 2018 14:03:43 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CF21068A273 for ; Wed, 3 Oct 2018 14:03:37 +0300 (EEST) Received: by mail-ed1-f44.google.com with SMTP id f4-v6so4944512edq.3 for ; Wed, 03 Oct 2018 04:03:57 -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=OJ70Gxzwvfso8eYj3Q11sLvMqXo4fBxAF80UN3q80FM=; b=fm6Xcp1MCHbPCrWKorkrsw2/Y0g9fUftG6appcdq1FnWGEWTD07nfBcJxALItLBuW0 1bSTX0NtsAqy0XRzK9UFw6Y6NMWrjKddDFgwJP9ZFw/45uv0/rZMKkYzxUEbb6YuaFv4 YKqsWAD6EKMYch5/AFmhZdxhRtFlBHh8K1m9RjwFTR7zYsAvOVND6C9ZHVmR43AxxVkr h9yvLMkGq6mOHxv9C5RPuLygyXCpQp21aqIAXkUnMPp+o7mtfddL1Q6kLn23mnK9iO/5 v7tqA6BTIllbauDWCrBfBP3APRYq/wnx7bpKlBqeOlIvtayT9DyVAajn0PKcRvzYP2ZD /DIA== 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=OJ70Gxzwvfso8eYj3Q11sLvMqXo4fBxAF80UN3q80FM=; b=Du+hDbTDMcOdTBxHdxkNu4aL90kl/tttHORF4zNxCYhGFYdyGFwccQszy+d5MbVffc bcKscY8MSZbpeKjDsjkkJNkG2D7wLBMmtpIJJb+YDH/jIzUwW6og8vt64JW2Dw2PMK1J CdjCnZ71hGb1LAONgwAMztCJRIHlmzqBQzBpyG3PqeW4dApzhoq21/PYacbwNu53d3h1 ecdJxI5zmClhQ3zfjHm0wv4zuRm71x3RX/CAOIXJ0OOJSN7UmIZKTmrgZU0a+WrcjaVV p+DXahqoO43rL5Cs7euiXY3j6NouyCXi+pDN56z6fiVjOH8s6rUY8dIsQKd0Kuwi6JBb HxIg== X-Gm-Message-State: ABuFfojgnbJGFQLKhCtqrUtM1S/Z2zg3JYZqKp6HE9LAohgkEsepx2Qq HspoUA9CiDWGT2fQ2BAKOfLFF2cP X-Received: by 2002:a50:fb03:: with SMTP id d3-v6mr1636473edq.59.1538564636705; Wed, 03 Oct 2018 04:03:56 -0700 (PDT) Received: from localhost.localdomain ([94.250.174.60]) by smtp.gmail.com with ESMTPSA id k42-v6sm401263ede.94.2018.10.03.04.03.55 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 03 Oct 2018 04:03:56 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Oct 2018 13:03:45 +0200 Message-Id: <20181003110347.22904-2-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181003110347.22904-1-onemda@gmail.com> References: <20181003110347.22904-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/4] avfilter/af_asetnsamples: use lavfi internal queue 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/af_asetnsamples.c | 156 +++++++++------------------------- 1 file changed, 42 insertions(+), 114 deletions(-) diff --git a/libavfilter/af_asetnsamples.c b/libavfilter/af_asetnsamples.c index ecb76e64db..6efa6f3f69 100644 --- a/libavfilter/af_asetnsamples.c +++ b/libavfilter/af_asetnsamples.c @@ -24,20 +24,18 @@ * Filter that changes number of samples on single output operation */ -#include "libavutil/audio_fifo.h" #include "libavutil/avassert.h" #include "libavutil/channel_layout.h" #include "libavutil/opt.h" #include "avfilter.h" #include "audio.h" +#include "filters.h" #include "internal.h" #include "formats.h" typedef struct ASNSContext { const AVClass *class; int nb_out_samples; ///< how many samples to output - AVAudioFifo *fifo; ///< samples are queued here - int64_t next_out_pts; int pad; } ASNSContext; @@ -54,134 +52,65 @@ static const AVOption asetnsamples_options[] = { AVFILTER_DEFINE_CLASS(asetnsamples); -static av_cold int init(AVFilterContext *ctx) +static int activate(AVFilterContext *ctx) { - ASNSContext *asns = ctx->priv; - - asns->next_out_pts = AV_NOPTS_VALUE; - av_log(ctx, AV_LOG_VERBOSE, "nb_out_samples:%d pad:%d\n", asns->nb_out_samples, asns->pad); - - return 0; -} - -static av_cold void uninit(AVFilterContext *ctx) -{ - ASNSContext *asns = ctx->priv; - av_audio_fifo_free(asns->fifo); -} - -static int config_props_output(AVFilterLink *outlink) -{ - ASNSContext *asns = outlink->src->priv; - - asns->fifo = av_audio_fifo_alloc(outlink->format, outlink->channels, asns->nb_out_samples); - if (!asns->fifo) - return AVERROR(ENOMEM); - - return 0; -} - -static int push_samples(AVFilterLink *outlink) -{ - ASNSContext *asns = outlink->src->priv; - AVFrame *outsamples = NULL; - int ret, nb_out_samples, nb_pad_samples; - - if (asns->pad) { - nb_out_samples = av_audio_fifo_size(asns->fifo) ? asns->nb_out_samples : 0; - nb_pad_samples = nb_out_samples - FFMIN(nb_out_samples, av_audio_fifo_size(asns->fifo)); - } else { - nb_out_samples = FFMIN(asns->nb_out_samples, av_audio_fifo_size(asns->fifo)); - nb_pad_samples = 0; - } - - if (!nb_out_samples) - return 0; - - outsamples = ff_get_audio_buffer(outlink, nb_out_samples); - if (!outsamples) - return AVERROR(ENOMEM); - - av_audio_fifo_read(asns->fifo, - (void **)outsamples->extended_data, nb_out_samples); - - if (nb_pad_samples) - av_samples_set_silence(outsamples->extended_data, nb_out_samples - nb_pad_samples, - nb_pad_samples, outlink->channels, - outlink->format); - outsamples->nb_samples = nb_out_samples; - outsamples->channel_layout = outlink->channel_layout; - outsamples->sample_rate = outlink->sample_rate; - outsamples->pts = asns->next_out_pts; - - if (asns->next_out_pts != AV_NOPTS_VALUE) - asns->next_out_pts += av_rescale_q(nb_out_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base); - - ret = ff_filter_frame(outlink, outsamples); - if (ret < 0) - return ret; - return nb_out_samples; -} - -static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) -{ - AVFilterContext *ctx = inlink->dst; - ASNSContext *asns = ctx->priv; + AVFilterLink *inlink = ctx->inputs[0]; AVFilterLink *outlink = ctx->outputs[0]; + ASNSContext *s = ctx->priv; + AVFrame *frame = NULL; int ret; - int nb_samples = insamples->nb_samples; - - if (av_audio_fifo_space(asns->fifo) < nb_samples) { - av_log(ctx, AV_LOG_DEBUG, "No space for %d samples, stretching audio fifo\n", nb_samples); - ret = av_audio_fifo_realloc(asns->fifo, av_audio_fifo_size(asns->fifo) + nb_samples); - if (ret < 0) { - av_log(ctx, AV_LOG_ERROR, - "Stretching audio fifo failed, discarded %d samples\n", nb_samples); - return -1; - } - } - ret = av_audio_fifo_write(asns->fifo, (void **)insamples->extended_data, nb_samples); - if (ret > 0 && asns->next_out_pts == AV_NOPTS_VALUE) - asns->next_out_pts = insamples->pts; - av_frame_free(&insamples); - if (ret < 0) - return ret; + FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink); - while (av_audio_fifo_size(asns->fifo) >= asns->nb_out_samples) - push_samples(outlink); - return 0; -} + if (ff_inlink_queued_samples(inlink) >= s->nb_out_samples) { + ret = ff_inlink_consume_samples(inlink, s->nb_out_samples, s->nb_out_samples, &frame); + if (ret > 0) + ret = ff_filter_frame(outlink, frame); + return ret; + } -static int request_frame(AVFilterLink *outlink) -{ - AVFilterLink *inlink = outlink->src->inputs[0]; - int ret; + if (ff_outlink_get_status(inlink) == AVERROR_EOF) { + AVFrame *pad_frame; + + ret = ff_inlink_consume_samples(inlink, s->nb_out_samples, s->nb_out_samples, &frame); + if (ret > 0 && s->pad && frame->nb_samples < s->nb_out_samples) { + pad_frame = ff_get_audio_buffer(outlink, s->nb_out_samples); + if (!pad_frame) + return AVERROR(ENOMEM); + + av_samples_copy(pad_frame->extended_data, frame->extended_data, + 0, 0, frame->nb_samples, frame->channels, frame->format); + av_samples_set_silence(pad_frame->extended_data, frame->nb_samples, + s->nb_out_samples - frame->nb_samples, frame->channels, + frame->format); + av_frame_free(&frame); + frame = pad_frame; + } - ret = ff_request_frame(inlink); - if (ret == AVERROR_EOF) { - ret = push_samples(outlink); - return ret < 0 ? ret : ret > 0 ? 0 : AVERROR_EOF; + if (ret > 0) + ret = ff_filter_frame(outlink, frame); + if (ret < 0) + return ret; } - return ret; + FF_FILTER_FORWARD_STATUS(inlink, outlink); + FF_FILTER_FORWARD_WANTED(outlink, inlink); + + return FFERROR_NOT_READY; } static const AVFilterPad asetnsamples_inputs[] = { { - .name = "default", - .type = AVMEDIA_TYPE_AUDIO, - .filter_frame = filter_frame, + .name = "default", + .type = AVMEDIA_TYPE_AUDIO, }, { NULL } }; static const AVFilterPad asetnsamples_outputs[] = { { - .name = "default", - .type = AVMEDIA_TYPE_AUDIO, - .request_frame = request_frame, - .config_props = config_props_output, + .name = "default", + .type = AVMEDIA_TYPE_AUDIO, }, { NULL } }; @@ -191,8 +120,7 @@ AVFilter ff_af_asetnsamples = { .description = NULL_IF_CONFIG_SMALL("Set the number of samples for each output audio frames."), .priv_size = sizeof(ASNSContext), .priv_class = &asetnsamples_class, - .init = init, - .uninit = uninit, .inputs = asetnsamples_inputs, .outputs = asetnsamples_outputs, + .activate = activate, };