From patchwork Thu Jun 11 16:12:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 20290 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 823E4449FDA for ; Thu, 11 Jun 2020 19:20:54 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 64FFB68B5D0; Thu, 11 Jun 2020 19:20:54 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f195.google.com (mail-lj1-f195.google.com [209.85.208.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A41BD68AF29 for ; Thu, 11 Jun 2020 19:20:47 +0300 (EEST) Received: by mail-lj1-f195.google.com with SMTP id c17so7602484lji.11 for ; Thu, 11 Jun 2020 09:20:47 -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=npAnOjqlbmbFO08sjb88XRyGZ2pSNNg7Hhwv+6ze67Q=; b=Rjg+Dvzg0l2TwVQj8ps+6KfvlYhd0SqsUgI/RhD5kjQaXArsVqKvhCd40+7QIrl6Im bokqfTuJZcTPo/jVhXnKLEvY5PcHmSXD2YSvnFHhOLBYfb+1fO1QhSZdzcyb7DU557ch 0aRATgfV4Pz4Unog8Cy76SkzBgeCqCvNyUMoi8DChRLPSBLs61du0kMLBDeE/Eljumo9 4Yn6KgixytX3n2sRxEWRGCMelQDk9Vi9sHmVy+cgY8NF5fe8SEPjdKNDVrbT9wMYsWwy GES1afZQ5PwSEPjl+aelWocU+ZGmmLertTqBd3jRQsCTDT4tseJgvFoe7s+j04kyKiXj hl1w== 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=npAnOjqlbmbFO08sjb88XRyGZ2pSNNg7Hhwv+6ze67Q=; b=EcxU/orBLBSgNfS5xlRo7Vej1dJNB1NMlANT0sJKn02A8Tw0jdUMeQjkDcKRMGarc1 4ZmE+Ce/fuwTOKh4GIcN8AAsRmDToKPNw7dQ0SB8ls41hVfLj0VOWRkCOI5faX33FT1F 7evShr796hrmWITYCJ7nah8xF+j5S+1/han+r0S+Rm/ia5jg18rkHgyhhGuoEP0uAq7W HjgTCtUoG2ArLtgZ2Vy+7Axok6uEdYUrkFSa+/vfDmcbB0nPVfV+j6tzNX3cOmZgfzVJ fm0xryDyIITtMNf83nwdj+tw91OqYq3e9w2fP1Q1VrBrz/cilhV97MWWPckavRei44P+ 0tYg== X-Gm-Message-State: AOAM530nJYyxz7/JtGk8EsRHNCYm4l5H2YQzqqTobWz768NR2EK4tb0f YZlfHn7DupNUcg+YVWjUpieTfH0O7kU= X-Google-Smtp-Source: ABdhPJwSp5BLhq4P41nbNukwy+EENlDIplmolhRw2UHJfacspOMlr84zR5fzeM4L3MYP78Z+P1b9VA== X-Received: by 2002:adf:ec03:: with SMTP id x3mr10286509wrn.297.1591891964032; Thu, 11 Jun 2020 09:12:44 -0700 (PDT) Received: from localhost.localdomain ([37.244.249.74]) by smtp.gmail.com with ESMTPSA id 104sm6074960wrl.25.2020.06.11.09.12.43 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jun 2020 09:12:43 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Thu, 11 Jun 2020 18:12:26 +0200 Message-Id: <20200611161227.5622-6-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200611161227.5622-1-onemda@gmail.com> References: <20200611161227.5622-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 6/7] avfilter/avf_showspectrumpic: switch to 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" Fixes filtering audio with more than 1.5h length. Signed-off-by: Paul B Mahol --- libavfilter/avf_showspectrum.c | 119 ++++++++++++++++----------------- 1 file changed, 59 insertions(+), 60 deletions(-) diff --git a/libavfilter/avf_showspectrum.c b/libavfilter/avf_showspectrum.c index e99f377fb0..ead57aadac 100644 --- a/libavfilter/avf_showspectrum.c +++ b/libavfilter/avf_showspectrum.c @@ -1610,91 +1610,90 @@ static const AVOption showspectrumpic_options[] = { AVFILTER_DEFINE_CLASS(showspectrumpic); -static int showspectrumpic_request_frame(AVFilterLink *outlink) +static int showspectrumpic_request_frame(AVFilterLink *outlink, int64_t samples) { AVFilterContext *ctx = outlink->src; ShowSpectrumContext *s = ctx->priv; AVFilterLink *inlink = ctx->inputs[0]; - int ret, samples; + int consumed = 0; + int x = 0, sz = s->orientation == VERTICAL ? s->w : s->h; + int ret, ch, spf, spb; + AVFrame *fin = NULL; - ret = ff_request_frame(inlink); - samples = av_audio_fifo_size(s->fifo); - if (ret == AVERROR_EOF && s->outpicref && samples > 0) { - int consumed = 0; - int x = 0, sz = s->orientation == VERTICAL ? s->w : s->h; - int ch, spf, spb; - AVFrame *fin; + spf = s->win_size * (samples / ((s->win_size * sz) * ceil(samples / (float)(s->win_size * sz)))); + spf = FFMAX(1, spf); - spf = s->win_size * (samples / ((s->win_size * sz) * ceil(samples / (float)(s->win_size * sz)))); - spf = FFMAX(1, spf); + spb = (samples / (spf * sz)) * spf; - spb = (samples / (spf * sz)) * spf; - - fin = ff_get_audio_buffer(inlink, s->win_size); - if (!fin) - return AVERROR(ENOMEM); - - while (x < sz) { - ret = av_audio_fifo_peek(s->fifo, (void **)fin->extended_data, s->win_size); - if (ret < 0) { - av_frame_free(&fin); - return ret; - } - - av_audio_fifo_drain(s->fifo, spf); - - if (ret < s->win_size) { - for (ch = 0; ch < s->nb_display_channels; ch++) { - memset(fin->extended_data[ch] + ret * sizeof(float), 0, - (s->win_size - ret) * sizeof(float)); - } - } - - ctx->internal->execute(ctx, run_channel_fft, fin, NULL, s->nb_display_channels); - acalc_magnitudes(s); - - consumed += spf; - if (consumed >= spb) { - int h = s->orientation == VERTICAL ? s->h : s->w; + while (x < sz) { + ret = ff_inlink_peek_samples(inlink, s->win_size, &fin); + if (ret < 0) + return ret; + if (ret == 0) + break; - scale_magnitudes(s, 1.f / (consumed / spf)); - plot_spectrum_column(inlink, fin); - consumed = 0; - x++; - for (ch = 0; ch < s->nb_display_channels; ch++) - memset(s->magnitudes[ch], 0, h * sizeof(float)); - } + ctx->internal->execute(ctx, run_channel_fft, fin, NULL, s->nb_display_channels); + acalc_magnitudes(s); + + consumed += spf; + if (consumed >= spb) { + int h = s->orientation == VERTICAL ? s->h : s->w; + + scale_magnitudes(s, 1.f / (consumed / spf)); + plot_spectrum_column(inlink, fin); + consumed = 0; + x++; + for (ch = 0; ch < s->nb_display_channels; ch++) + memset(s->magnitudes[ch], 0, h * sizeof(float)); } - av_frame_free(&fin); - s->outpicref->pts = 0; + ff_inlink_skip_samples(inlink, spf); + } - if (s->legend) - draw_legend(ctx, samples); + s->outpicref->pts = 0; - ret = ff_filter_frame(outlink, s->outpicref); - s->outpicref = NULL; - } + if (s->legend) + draw_legend(ctx, samples); + + ret = ff_filter_frame(outlink, s->outpicref); + s->outpicref = NULL; return ret; } -static int showspectrumpic_filter_frame(AVFilterLink *inlink, AVFrame *insamples) +static int showspectrumpic_activate(AVFilterContext *ctx) { - AVFilterContext *ctx = inlink->dst; + AVFilterLink *inlink = ctx->inputs[0]; + AVFilterLink *outlink = ctx->outputs[0]; ShowSpectrumContext *s = ctx->priv; int ret; - ret = av_audio_fifo_write(s->fifo, (void **)insamples->extended_data, insamples->nb_samples); - av_frame_free(&insamples); - return ret; + FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink); + + if (ff_outlink_get_status(inlink) == AVERROR_EOF && + s->outpicref) { + int64_t samples = 0; + + for (int i = 0; i < ff_inlink_queued_frames(inlink); i++) { + AVFrame *frame = ff_inlink_peek_frame(inlink, i); + + samples += frame->nb_samples; + } + + ret = showspectrumpic_request_frame(outlink, samples); + ff_outlink_set_status(outlink, AVERROR_EOF, 0); + return ret; + } + + FF_FILTER_FORWARD_WANTED(outlink, inlink); + + return FFERROR_NOT_READY; } static const AVFilterPad showspectrumpic_inputs[] = { { .name = "default", .type = AVMEDIA_TYPE_AUDIO, - .filter_frame = showspectrumpic_filter_frame, }, { NULL } }; @@ -1704,7 +1703,6 @@ static const AVFilterPad showspectrumpic_outputs[] = { .name = "default", .type = AVMEDIA_TYPE_VIDEO, .config_props = config_output, - .request_frame = showspectrumpic_request_frame, }, { NULL } }; @@ -1715,6 +1713,7 @@ AVFilter ff_avf_showspectrumpic = { .uninit = uninit, .query_formats = query_formats, .priv_size = sizeof(ShowSpectrumContext), + .activate = showspectrumpic_activate, .inputs = showspectrumpic_inputs, .outputs = showspectrumpic_outputs, .priv_class = &showspectrumpic_class,