From patchwork Wed Oct 19 15:27:52 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Muhammad Faiz X-Patchwork-Id: 1077 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.133 with SMTP id o127csp254627vsd; Wed, 19 Oct 2016 08:30:38 -0700 (PDT) X-Received: by 10.194.223.97 with SMTP id qt1mr4592847wjc.33.1476891038020; Wed, 19 Oct 2016 08:30:38 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id x1si20767570wjc.191.2016.10.19.08.30.37; Wed, 19 Oct 2016 08:30:37 -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; 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 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 211B7689AF4; Wed, 19 Oct 2016 18:30:32 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f193.google.com (mail-pf0-f193.google.com [209.85.192.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B295668922A for ; Wed, 19 Oct 2016 18:30:25 +0300 (EEST) Received: by mail-pf0-f193.google.com with SMTP id r16so2761222pfg.3 for ; Wed, 19 Oct 2016 08:30:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=GhPTvsUIDfGPyHC8gO2ZoVQqqWKleaEHlLlrGY8yoNw=; b=OH9gUjZtPzaxjrM3UMDPTxcs2tb/iriPtMQm+cIISAp0lDilQjN+ovTcyvAWBBnE6l HMY40C7ILS+TL8fgpGg9mXWQQ/lPitrp2T4BIE2+bL1rjDNi3yGTPErLLalCtIm+mKmb 3LatsuCJ7eoelnt0Fwdlgmazc7Ey/7KBrWQ5uthFCxtruMVbhD0ueZ/M6+272hYpR1m4 u0IkTDO5P6KNWC9KNsWaYRfdqmi8bZU1dR00TLEv2dhpjOIdbTWoQisj75MNw/x+NyW2 13buiABostNDjBh9TjsWZqI+znpEENPGPrHDjrmoWY7waKELop9WFYzV+SiCEnKCtlCG Z9cA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=GhPTvsUIDfGPyHC8gO2ZoVQqqWKleaEHlLlrGY8yoNw=; b=LH7dNUjy1mdcjBiO6ybPs0wqkkXgIfYYhoaDffdFRDxBbQtt6S0y18ZPM8f+ow+rpu U3M2YQBgBZ1Wjyg3ZUToO7SGTP5WuBo4GdsJREY9q13EsFj72ycaRDwYVIrJdBk8juTz jT+wYO2E9GZWLrD1mLaYlyYlS0ti0w2ofoQCKW8FcmFNnq+0G2lRsVRa4T4MXLKT7Q0R L4bJDyuoCryArxT/keLE5fz1t/QBi4hYEX4cC8uEVhd8wiITKCsE7yoLTVm2OoyRB9pO Z1TpUdGXKb+v/+VbYxW2d7wuun/3jkmPBsODXdpwJiNVRH8Vimtzp548iKg4XtkNEbRj lZ8Q== X-Gm-Message-State: AA6/9RkeCSNGSxhvMtTQzoma7JSDVHH4OhNy/+CiPskIKE7vkxX5gLkDqF+NH8VBe3eTSQ== X-Received: by 10.98.103.152 with SMTP id t24mr4233155pfj.77.1476891026908; Wed, 19 Oct 2016 08:30:26 -0700 (PDT) Received: from localhost.localdomain.localdomain ([114.120.238.107]) by smtp.gmail.com with ESMTPSA id a10sm46132161pao.35.2016.10.19.08.30.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 19 Oct 2016 08:30:26 -0700 (PDT) From: Muhammad Faiz To: ffmpeg-devel@ffmpeg.org Date: Wed, 19 Oct 2016 22:27:52 +0700 Message-Id: <1476890872-6551-1-git-send-email-mfcc64@gmail.com> X-Mailer: git-send-email 2.5.0 Subject: [FFmpeg-devel] [PATCH] avfilter/showcqt: add cscheme 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 Cc: Muhammad Faiz MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Muhammad Faiz --- doc/filters.texi | 5 +++++ libavfilter/avf_showcqt.c | 45 ++++++++++++++++++++++++++++++++++----------- libavfilter/avf_showcqt.h | 2 ++ 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 14c9b07..b470f40 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -16938,6 +16938,11 @@ BT.2020 with non-constant luminance @end table +@item cscheme +Set spectrogram color scheme. This is list of floating point values with format +@code{left_r|left_g|left_b|right_r|right_g|right_b}. +The default is @code{1|0.5|0|0|0.5|1}. + @end table @subsection Examples diff --git a/libavfilter/avf_showcqt.c b/libavfilter/avf_showcqt.c index 37e20b4..49b950c 100644 --- a/libavfilter/avf_showcqt.c +++ b/libavfilter/avf_showcqt.c @@ -50,6 +50,7 @@ #define FONTCOLOR "st(0, (midi(f)-59.5)/12);" \ "st(1, if(between(ld(0),0,1), 0.5-0.5*cos(2*PI*ld(0)), 0));" \ "r(1-ld(1)) + b(ld(1))" +#define CSCHEME "1|0.5|0|0|0.5|1" #define PTS_STEP 10 #define PTS_TOLERANCE 1 @@ -96,6 +97,7 @@ static const AVOption showcqt_options[] = { { "smpte170m", "smpte170m", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_SMPTE170M }, 0, 0, FLAGS, "csp" }, { "smpte240m", "smpte240m", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_SMPTE240M }, 0, 0, FLAGS, "csp" }, { "bt2020ncl", "bt2020ncl", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_BT2020_NCL }, 0, 0, FLAGS, "csp" }, + { "cscheme", "set color scheme", OFFSET(cscheme), AV_OPT_TYPE_STRING, { .str = CSCHEME }, CHAR_MIN, CHAR_MAX, FLAGS }, { NULL } }; @@ -725,24 +727,24 @@ static float calculate_gamma(float v, float g) return expf(logf(v) / g); } -static void rgb_from_cqt(ColorFloat *c, const FFTComplex *v, float g, int len) +static void rgb_from_cqt(ColorFloat *c, const FFTComplex *v, float g, int len, float cscheme[6]) { int x; for (x = 0; x < len; x++) { - c[x].rgb.r = 255.0f * calculate_gamma(FFMIN(1.0f, v[x].re), g); - c[x].rgb.g = 255.0f * calculate_gamma(FFMIN(1.0f, 0.5f * (v[x].re + v[x].im)), g); - c[x].rgb.b = 255.0f * calculate_gamma(FFMIN(1.0f, v[x].im), g); + c[x].rgb.r = 255.0f * calculate_gamma(FFMIN(1.0f, cscheme[0] * v[x].re + cscheme[3] * v[x].im), g); + c[x].rgb.g = 255.0f * calculate_gamma(FFMIN(1.0f, cscheme[1] * v[x].re + cscheme[4] * v[x].im), g); + c[x].rgb.b = 255.0f * calculate_gamma(FFMIN(1.0f, cscheme[2] * v[x].re + cscheme[5] * v[x].im), g); } } -static void yuv_from_cqt(ColorFloat *c, const FFTComplex *v, float gamma, int len, float cm[3][3]) +static void yuv_from_cqt(ColorFloat *c, const FFTComplex *v, float gamma, int len, float cm[3][3], float cscheme[6]) { int x; for (x = 0; x < len; x++) { float r, g, b; - r = calculate_gamma(FFMIN(1.0f, v[x].re), gamma); - g = calculate_gamma(FFMIN(1.0f, 0.5f * (v[x].re + v[x].im)), gamma); - b = calculate_gamma(FFMIN(1.0f, v[x].im), gamma); + r = calculate_gamma(FFMIN(1.0f, cscheme[0] * v[x].re + cscheme[3] * v[x].im), gamma); + g = calculate_gamma(FFMIN(1.0f, cscheme[1] * v[x].re + cscheme[4] * v[x].im), gamma); + b = calculate_gamma(FFMIN(1.0f, cscheme[2] * v[x].re + cscheme[5] * v[x].im), gamma); c[x].yuv.y = cm[0][0] * r + cm[0][1] * g + cm[0][2] * b; c[x].yuv.u = cm[1][0] * r + cm[1][1] * g + cm[1][2] * b; c[x].yuv.v = cm[2][0] * r + cm[2][1] * g + cm[2][2] * b; @@ -1113,9 +1115,9 @@ static void process_cqt(ShowCQTContext *s) } if (s->format == AV_PIX_FMT_RGB24) - rgb_from_cqt(s->c_buf, s->cqt_result, s->sono_g, s->width); + rgb_from_cqt(s->c_buf, s->cqt_result, s->sono_g, s->width, s->cscheme_v); else - yuv_from_cqt(s->c_buf, s->cqt_result, s->sono_g, s->width, s->cmatrix); + yuv_from_cqt(s->c_buf, s->cqt_result, s->sono_g, s->width, s->cmatrix, s->cscheme_v); } static int plot_cqt(AVFilterContext *ctx, AVFrame **frameout) @@ -1215,6 +1217,27 @@ static void init_colormatrix(ShowCQTContext *s) s->cmatrix[2][2] = -112.0 * kb / (1.0 - kr); } +static int init_cscheme(ShowCQTContext *s) +{ + char tail[2]; + int k; + + if (sscanf(s->cscheme, " %f | %f | %f | %f | %f | %f %1s", &s->cscheme_v[0], + &s->cscheme_v[1], &s->cscheme_v[2], &s->cscheme_v[3], &s->cscheme_v[4], + &s->cscheme_v[5], tail) != 6) + goto fail; + + for (k = 0; k < 6; k++) + if (isnan(s->cscheme_v[k]) || s->cscheme_v[k] < 0.0f || s->cscheme_v[k] > 1.0f) + goto fail; + + return 0; + +fail: + av_log(s->ctx, AV_LOG_ERROR, "invalid cscheme.\n"); + return AVERROR(EINVAL); +} + /* main filter control */ static av_cold int init(AVFilterContext *ctx) { @@ -1270,7 +1293,7 @@ static av_cold int init(AVFilterContext *ctx) init_colormatrix(s); - return 0; + return init_cscheme(s); } static av_cold void uninit(AVFilterContext *ctx) diff --git a/libavfilter/avf_showcqt.h b/libavfilter/avf_showcqt.h index d0bacaf..165d36e 100644 --- a/libavfilter/avf_showcqt.h +++ b/libavfilter/avf_showcqt.h @@ -72,6 +72,7 @@ typedef struct { float *sono_v_buf; float *bar_v_buf; float cmatrix[3][3]; + float cscheme_v[6]; /* callback */ void (*cqt_calc)(FFTComplex *dst, const FFTComplex *src, const Coeffs *coeffs, int len, int fft_len); @@ -114,6 +115,7 @@ typedef struct { char *axisfile; int axis; int csp; + char *cscheme; } ShowCQTContext; void ff_showcqt_init_x86(ShowCQTContext *s);