From patchwork Sat Oct 6 12:30:11 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: 10597 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:ab0:73d2:0:0:0:0:0 with SMTP id m18csp1522808uaq; Sat, 6 Oct 2018 05:30:42 -0700 (PDT) X-Google-Smtp-Source: ACcGV60PbPCEQDk+ASRr/7+ldepiqUcIWKdI8jyKMFsY13KbRKAvYUfqa7j0XJh9PDW53dtpNeRD X-Received: by 2002:adf:f88d:: with SMTP id u13-v6mr10565875wrp.311.1538829042625; Sat, 06 Oct 2018 05:30:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538829042; cv=none; d=google.com; s=arc-20160816; b=sn2mTHPSN9uZgn+UXK/BZgl/5DmyTVPGP/MJ3pzJ0UR5l/HQvSHpqukstI7MVuakr1 6IYS1Na1JErpKq5DUbRbcice9G5eSEJJZDicvSvTVD2DGHK9x/FyXKaGSwj3ELVstSft MBtTahxzCbuIWg9cRyl4L3n9VYXnUa0R0uncrh8HrQ3tLNHwsiAk7sxPpXkrTKieICHf 4/y9qLyhhSieiLzdr+hUsyrRiBqINB2HlSiiE7GtRawGe3dHKV1OdKVWHClPe2DizjHy VtjaOAQmw+AQOqTCH3qu6RkI3e0+UgmJ2Mway+Z2fI0qGTfnbMLO7WW++S8SMXtMxI+O 9s5Q== 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=a1S4LmA601qpATA18Mi1vhAbWD5RrCpZ4/xhjS9EygE=; b=NgOzk5ejD+jA9yS7Af1ln+/OSU2XNinIBzas1hjKB+MoK/N149Cfb4QFYs2V9y6RCl Ot7aQVXYhsCQI26xOQEfvU2guvbJn3psCz5gLukaVt0RI6FybOhE3kvWESyZ1irRHnFL bY0oKSCf42/iXLMfwht0+iAE3dBI5n5DRT0hlwAmMDB2rt7uMck+dY9Cvxy3fDqXJubs BrEzVs4qsIM7pLf5HjlX7ZPuyEw11ZrsE7d+ufEprX4eq+2VqppRglALcVAYabPT64wJ /IXKVvGOtjZZAg/OYl/9U2/N4BMsmeKWDd2L5WVxfWc8zJmHZclCTrmToRDKWIbuHxKN Ti4g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=NBFpwq13; 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 a6-v6si9757910wrf.406.2018.10.06.05.30.42; Sat, 06 Oct 2018 05:30:42 -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=NBFpwq13; 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 5D932689CBB; Sat, 6 Oct 2018 15:30:08 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f43.google.com (mail-ed1-f43.google.com [209.85.208.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 534EF6800A8 for ; Sat, 6 Oct 2018 15:30:01 +0300 (EEST) Received: by mail-ed1-f43.google.com with SMTP id g32-v6so13798439edg.13 for ; Sat, 06 Oct 2018 05:30:22 -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=nRxT42MiWpHQUNUJG0qV9wSOcAtMVha6anfl+0ilxdA=; b=NBFpwq137dat1Ez45oDWiynX5+XILUD1H0j+j0cFC+auMaZL6gRfX3MJRI6k4r6YW9 kBn6HhzEpXOfGLBsJOoc6J5sMGxfXAbRP3HQW+eTtZVLhmpBcEzG2GSwA8BORZfAyFpf mDoKEAOzxupdY0wgNnJJ5s3DIH+hrfQXwoSXmCQO7dojSAzNQV+IyJAJ22+nbzo/dUjR Fqfo/WTqPMuJarMrDb9R8jPIh8SCVIxhRs2sRfSLWCo+oBZ7gL5w7sz9bD7OLMHdjWAm UHb7pwOJ1F5bqpMuyUzVQ7gDSYA3V712e/4RPYjy9i6iJkwTeB9pgQwoenR4IM4YrPcb PAZA== 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=nRxT42MiWpHQUNUJG0qV9wSOcAtMVha6anfl+0ilxdA=; b=kgCNoExeI9T8hvVrtsBE74RV2E/uPHnnoxMS1wpxWT+gG+ixil5j1nMj+96NHKYKVi UhPkCcu6hVXSO5pOext7Ohl6Vhses3lepq1fFU2yGg3r42BVwb4ma6xLv1PWPDzhMwra QpkOQ9a4yFY+aD3OV4OUhjxdAwT6BuTFlKLlxCfKw6mukHvjW4t4awrmHhASwA05Fu3J QO5UjllJoFledVgDZHa3ShXqbtsPPkRdmtUuACBVwnsSLaCoaN3EiZ21hB96TE/b2eXB h6ihzRfkLq5s1ttxvGE8h/JmlehVUZLlfnUThapZ+ek1rfzxXmUnBN212rTafvAG/GIl 53Yg== X-Gm-Message-State: ABuFfoi95/0fLqFRDgbma0Q3ReDMgu6Yo6QGWgH36QlmZiT+5YhHpgZ9 YB2Nc2YWNVqRvLD7FchXhd3HPrS37jQ= X-Received: by 2002:a17:906:854a:: with SMTP id h10-v6mr11662715ejy.196.1538829021544; Sat, 06 Oct 2018 05:30:21 -0700 (PDT) Received: from localhost.localdomain ([94.250.174.60]) by smtp.gmail.com with ESMTPSA id b12-v6sm1882197eje.36.2018.10.06.05.30.20 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 06 Oct 2018 05:30:21 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sat, 6 Oct 2018 14:30:11 +0200 Message-Id: <20181006123011.17742-2-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181006123011.17742-1-onemda@gmail.com> References: <20181006123011.17742-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/2] avfilter/avf_showspectrum: add fps option 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/avf_showspectrum.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/libavfilter/avf_showspectrum.c b/libavfilter/avf_showspectrum.c index 30238e0c3f..9e268f9d33 100644 --- a/libavfilter/avf_showspectrum.c +++ b/libavfilter/avf_showspectrum.c @@ -34,6 +34,7 @@ #include "libavutil/avstring.h" #include "libavutil/channel_layout.h" #include "libavutil/opt.h" +#include "libavutil/parseutils.h" #include "libavutil/xga_font_data.h" #include "audio.h" #include "video.h" @@ -52,6 +53,9 @@ enum Orientation { VERTICAL, HORIZONTAL, NB_ORIENTATIONS }; typedef struct ShowSpectrumContext { const AVClass *class; int w, h; + char *rate_str; + AVRational auto_frame_rate; + AVRational frame_rate; AVFrame *outpicref; int nb_display_channels; int orientation; @@ -86,7 +90,7 @@ typedef struct ShowSpectrumContext { float **color_buffer; ///< color buffer (3 * h * ch items) AVAudioFifo *fifo; int64_t pts; - int eof; + int64_t old_pts; int single_pic; int legend; int start_x, start_y; @@ -158,6 +162,7 @@ static const AVOption showspectrum_options[] = { { "rotation", "color rotation", OFFSET(rotation), AV_OPT_TYPE_FLOAT, {.dbl = 0}, -1, 1, FLAGS }, { "start", "start frequency", OFFSET(start), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT32_MAX, FLAGS }, { "stop", "stop frequency", OFFSET(stop), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT32_MAX, FLAGS }, + { "fps", "set video rate", OFFSET(rate_str), AV_OPT_TYPE_STRING, {.str = "auto"}, 0, 0, FLAGS }, { NULL } }; @@ -605,11 +610,17 @@ static int config_output(AVFilterLink *outlink) (s->orientation == HORIZONTAL && s->xpos >= s->h)) s->xpos = 0; - outlink->frame_rate = av_make_q(inlink->sample_rate, s->win_size * (1.-s->overlap)); + s->auto_frame_rate = av_make_q(inlink->sample_rate, s->win_size * (1.-s->overlap)); if (s->orientation == VERTICAL && s->sliding == FULLFRAME) - outlink->frame_rate.den *= s->w; + s->auto_frame_rate.den *= s->w; if (s->orientation == HORIZONTAL && s->sliding == FULLFRAME) - outlink->frame_rate.den *= s->h; + s->auto_frame_rate.den *= s->h; + if (strcmp(s->rate_str, "auto")) { + av_parse_video_rate(&s->frame_rate, s->rate_str); + } else { + s->frame_rate = s->auto_frame_rate; + } + outlink->frame_rate = s->frame_rate; if (s->orientation == VERTICAL) { s->combine_buffer = @@ -956,10 +967,14 @@ static int plot_spectrum_column(AVFilterLink *inlink, AVFrame *insamples) if (s->orientation == HORIZONTAL && s->xpos >= s->h) s->xpos = 0; if (!s->single_pic && (s->sliding != FULLFRAME || s->xpos == 0)) { - ret = ff_filter_frame(outlink, av_frame_clone(s->outpicref)); - if (ret < 0) - return ret; - return 0; + AVRational step = av_make_q(inlink->sample_rate, s->pts - s->old_pts); + if (av_cmp_q(outlink->frame_rate, step) >= 0) { + ret = ff_filter_frame(outlink, av_frame_clone(s->outpicref)); + s->old_pts = s->pts; + if (ret < 0) + return ret; + return 0; + } } return 1;