From patchwork Tue Jun 19 01:57:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ruiling Song X-Patchwork-Id: 9441 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:11c:0:0:0:0:0 with SMTP id c28-v6csp4467401jad; Mon, 18 Jun 2018 18:58:07 -0700 (PDT) X-Google-Smtp-Source: ADUXVKL1rrsv4MmVsl0E1EudqyzHgzrXAcVz0IPNOIIukbPisjLdVEADBYcAM7H2kH1EUj59Iu9m X-Received: by 2002:adf:a292:: with SMTP id s18-v6mr11802807wra.114.1529373487793; Mon, 18 Jun 2018 18:58:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529373487; cv=none; d=google.com; s=arc-20160816; b=sIg6F5IbZsYY19G6Y6jQ/KguPOs61O5W6mPCpcLrnSi+fxEg9WWJ25x7R3WsxkUGHC bTqTIMVjWezk8K7FWEqCfgqhBE+GSJBOhRYBEEYI9SeTaF/UaUc73ukg55pI2UwBSr54 rRzzxHruNhaynzLYrrDucfyWBulctoLPJ9UG+Odqsx//Lpc5pKCpT3hwmSbHEpWoPOz1 XbCMO3XguUjO6mpNZK+03htBHxQOvM6NGre8OltrxGNZGApRKUzyRmmCGAXbBc3Mzw3Q ss9CFTossmqnHTgA8XdNEUebZce0w7VKNMj2osZNyrYRKjow62X+Igu47wa3NXcUNCyc JurA== 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:cc: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:delivered-to:arc-authentication-results; bh=HcDCo5dDwJe8vPpMt4iAB+qpy0lSi2AwjBXwN4Gzl8Q=; b=eZwgu4oU69nGGlBpnk6IuLn9A7KiWMw0jyN5z6hJXr3JDeNEgFu7JqNiVB+mhzodBK 0HVvQOaFmG5epUg8HOh6zVZKAYvCRqIm/F/XI+9viket2PJe79C+Lnyq5tiqNwpBz0Bn Pivm6hg4jYFf4WpAnunS8Sx0HBfUWhbwmun5/d+HtDgE0vv+pAfz1Br/TGz9v0M7yzBZ 3HqUBSXVjzmJ4xGzYTL4foEpoHAt+ro7v/nFGYLMkebiXaWud0QENrV2QgpKhF5Z7C+3 3didnCZay0Mk50oNlav8GXSaybamGChuf2Px4tQLmQxjKBb0i3R6Hy44BG425WUdYl8i TY7A== ARC-Authentication-Results: i=1; mx.google.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 sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o7-v6si2068428wrm.206.2018.06.18.18.58.07; Mon, 18 Jun 2018 18:58:07 -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; 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=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 99BA868996D; Tue, 19 Jun 2018 04:57:05 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A37E6680C18 for ; Tue, 19 Jun 2018 04:56:58 +0300 (EEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 Jun 2018 18:57:49 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,241,1526367600"; d="scan'208";a="65251569" Received: from ocl-kbl.sh.intel.com ([10.239.160.52]) by fmsmga001.fm.intel.com with ESMTP; 18 Jun 2018 18:57:49 -0700 From: Ruiling Song To: ffmpeg-devel@ffmpeg.org Date: Tue, 19 Jun 2018 09:57:32 +0800 Message-Id: <1529373452-376-2-git-send-email-ruiling.song@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1529373452-376-1-git-send-email-ruiling.song@intel.com> References: <1529373452-376-1-git-send-email-ruiling.song@intel.com> Subject: [FFmpeg-devel] [PATCH v4 2/2] lavfi: make vf_colorspace use functions from colorspace.c 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: Ruiling Song MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" These functions are shared among colorspace related filters. Signed-off-by: Ruiling Song --- libavfilter/Makefile | 2 +- libavfilter/vf_colorspace.c | 118 +++++++++----------------------------------- 2 files changed, 23 insertions(+), 97 deletions(-) diff --git a/libavfilter/Makefile b/libavfilter/Makefile index d2c85cf..c20c270 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -166,7 +166,7 @@ OBJS-$(CONFIG_COLORCHANNELMIXER_FILTER) += vf_colorchannelmixer.o OBJS-$(CONFIG_COLORKEY_FILTER) += vf_colorkey.o OBJS-$(CONFIG_COLORLEVELS_FILTER) += vf_colorlevels.o OBJS-$(CONFIG_COLORMATRIX_FILTER) += vf_colormatrix.o -OBJS-$(CONFIG_COLORSPACE_FILTER) += vf_colorspace.o colorspacedsp.o +OBJS-$(CONFIG_COLORSPACE_FILTER) += vf_colorspace.o colorspace.o colorspacedsp.o OBJS-$(CONFIG_CONVOLUTION_FILTER) += vf_convolution.o OBJS-$(CONFIG_CONVOLUTION_OPENCL_FILTER) += vf_convolution_opencl.o opencl.o \ opencl/convolution.o diff --git a/libavfilter/vf_colorspace.c b/libavfilter/vf_colorspace.c index 71ea08a..b593215 100644 --- a/libavfilter/vf_colorspace.c +++ b/libavfilter/vf_colorspace.c @@ -33,6 +33,7 @@ #include "formats.h" #include "internal.h" #include "video.h" +#include "colorspace.h" enum DitherMode { DITHER_NONE, @@ -110,21 +111,13 @@ static const enum AVColorSpace default_csp[CS_NB + 1] = { struct ColorPrimaries { enum Whitepoint wp; - double xr, yr, xg, yg, xb, yb; + struct PrimaryCoefficients coeff; }; struct TransferCharacteristics { double alpha, beta, gamma, delta; }; -struct LumaCoefficients { - double cr, cg, cb; -}; - -struct WhitepointCoefficients { - double xw, yw; -}; - typedef struct ColorSpaceContext { const AVClass *class; @@ -286,57 +279,30 @@ static const struct WhitepointCoefficients whitepoint_coefficients[WP_NB] = { }; static const struct ColorPrimaries color_primaries[AVCOL_PRI_NB] = { - [AVCOL_PRI_BT709] = { WP_D65, 0.640, 0.330, 0.300, 0.600, 0.150, 0.060 }, - [AVCOL_PRI_BT470M] = { WP_C, 0.670, 0.330, 0.210, 0.710, 0.140, 0.080 }, - [AVCOL_PRI_BT470BG] = { WP_D65, 0.640, 0.330, 0.290, 0.600, 0.150, 0.060,}, - [AVCOL_PRI_SMPTE170M] = { WP_D65, 0.630, 0.340, 0.310, 0.595, 0.155, 0.070 }, - [AVCOL_PRI_SMPTE240M] = { WP_D65, 0.630, 0.340, 0.310, 0.595, 0.155, 0.070 }, - [AVCOL_PRI_SMPTE428] = { WP_E, 0.735, 0.265, 0.274, 0.718, 0.167, 0.009 }, - [AVCOL_PRI_SMPTE431] = { WP_DCI, 0.680, 0.320, 0.265, 0.690, 0.150, 0.060 }, - [AVCOL_PRI_SMPTE432] = { WP_D65, 0.680, 0.320, 0.265, 0.690, 0.150, 0.060 }, - [AVCOL_PRI_FILM] = { WP_C, 0.681, 0.319, 0.243, 0.692, 0.145, 0.049 }, - [AVCOL_PRI_BT2020] = { WP_D65, 0.708, 0.292, 0.170, 0.797, 0.131, 0.046 }, - [AVCOL_PRI_JEDEC_P22] = { WP_D65, 0.630, 0.340, 0.295, 0.605, 0.155, 0.077 }, + [AVCOL_PRI_BT709] = { WP_D65, { 0.640, 0.330, 0.300, 0.600, 0.150, 0.060 } }, + [AVCOL_PRI_BT470M] = { WP_C, { 0.670, 0.330, 0.210, 0.710, 0.140, 0.080 } }, + [AVCOL_PRI_BT470BG] = { WP_D65, { 0.640, 0.330, 0.290, 0.600, 0.150, 0.060 } }, + [AVCOL_PRI_SMPTE170M] = { WP_D65, { 0.630, 0.340, 0.310, 0.595, 0.155, 0.070 } }, + [AVCOL_PRI_SMPTE240M] = { WP_D65, { 0.630, 0.340, 0.310, 0.595, 0.155, 0.070 } }, + [AVCOL_PRI_SMPTE428] = { WP_E, { 0.735, 0.265, 0.274, 0.718, 0.167, 0.009 } }, + [AVCOL_PRI_SMPTE431] = { WP_DCI, { 0.680, 0.320, 0.265, 0.690, 0.150, 0.060 } }, + [AVCOL_PRI_SMPTE432] = { WP_D65, { 0.680, 0.320, 0.265, 0.690, 0.150, 0.060 } }, + [AVCOL_PRI_FILM] = { WP_C, { 0.681, 0.319, 0.243, 0.692, 0.145, 0.049 } }, + [AVCOL_PRI_BT2020] = { WP_D65, { 0.708, 0.292, 0.170, 0.797, 0.131, 0.046 } }, + [AVCOL_PRI_JEDEC_P22] = { WP_D65, { 0.630, 0.340, 0.295, 0.605, 0.155, 0.077 } }, }; static const struct ColorPrimaries *get_color_primaries(enum AVColorPrimaries prm) { - const struct ColorPrimaries *coeffs; + const struct ColorPrimaries *p; if (prm >= AVCOL_PRI_NB) return NULL; - coeffs = &color_primaries[prm]; - if (!coeffs->xr) + p = &color_primaries[prm]; + if (!p->coeff.xr) return NULL; - return coeffs; -} - -static void invert_matrix3x3(const double in[3][3], double out[3][3]) -{ - double m00 = in[0][0], m01 = in[0][1], m02 = in[0][2], - m10 = in[1][0], m11 = in[1][1], m12 = in[1][2], - m20 = in[2][0], m21 = in[2][1], m22 = in[2][2]; - int i, j; - double det; - - out[0][0] = (m11 * m22 - m21 * m12); - out[0][1] = -(m01 * m22 - m21 * m02); - out[0][2] = (m01 * m12 - m11 * m02); - out[1][0] = -(m10 * m22 - m20 * m12); - out[1][1] = (m00 * m22 - m20 * m02); - out[1][2] = -(m00 * m12 - m10 * m02); - out[2][0] = (m10 * m21 - m20 * m11); - out[2][1] = -(m00 * m21 - m20 * m01); - out[2][2] = (m00 * m11 - m10 * m01); - - det = m00 * out[0][0] + m10 * out[0][1] + m20 * out[0][2]; - det = 1.0 / det; - - for (i = 0; i < 3; i++) { - for (j = 0; j < 3; j++) - out[i][j] *= det; - } + return p; } static int fill_gamma_table(ColorSpaceContext *s) @@ -380,49 +346,6 @@ static int fill_gamma_table(ColorSpaceContext *s) } /* - * see e.g. http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html - */ -static void fill_rgb2xyz_table(const struct ColorPrimaries *coeffs, - double rgb2xyz[3][3]) -{ - const struct WhitepointCoefficients *wp = &whitepoint_coefficients[coeffs->wp]; - double i[3][3], sr, sg, sb, zw; - - rgb2xyz[0][0] = coeffs->xr / coeffs->yr; - rgb2xyz[0][1] = coeffs->xg / coeffs->yg; - rgb2xyz[0][2] = coeffs->xb / coeffs->yb; - rgb2xyz[1][0] = rgb2xyz[1][1] = rgb2xyz[1][2] = 1.0; - rgb2xyz[2][0] = (1.0 - coeffs->xr - coeffs->yr) / coeffs->yr; - rgb2xyz[2][1] = (1.0 - coeffs->xg - coeffs->yg) / coeffs->yg; - rgb2xyz[2][2] = (1.0 - coeffs->xb - coeffs->yb) / coeffs->yb; - invert_matrix3x3(rgb2xyz, i); - zw = 1.0 - wp->xw - wp->yw; - sr = i[0][0] * wp->xw + i[0][1] * wp->yw + i[0][2] * zw; - sg = i[1][0] * wp->xw + i[1][1] * wp->yw + i[1][2] * zw; - sb = i[2][0] * wp->xw + i[2][1] * wp->yw + i[2][2] * zw; - rgb2xyz[0][0] *= sr; - rgb2xyz[0][1] *= sg; - rgb2xyz[0][2] *= sb; - rgb2xyz[1][0] *= sr; - rgb2xyz[1][1] *= sg; - rgb2xyz[1][2] *= sb; - rgb2xyz[2][0] *= sr; - rgb2xyz[2][1] *= sg; - rgb2xyz[2][2] *= sb; -} - -static void mul3x3(double dst[3][3], const double src1[3][3], const double src2[3][3]) -{ - int m, n; - - for (m = 0; m < 3; m++) - for (n = 0; n < 3; n++) - dst[m][n] = src2[m][0] * src1[0][n] + - src2[m][1] * src1[1][n] + - src2[m][2] * src1[2][n]; -} - -/* * See http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html * This function uses the Bradford mechanism. */ @@ -661,10 +584,13 @@ static int create_filtergraph(AVFilterContext *ctx, sizeof(*s->in_primaries)); if (!s->lrgb2lrgb_passthrough) { double rgb2xyz[3][3], xyz2rgb[3][3], rgb2rgb[3][3]; + const struct WhitepointCoefficients *wp_out, *wp_in; - fill_rgb2xyz_table(s->out_primaries, rgb2xyz); + wp_out = &whitepoint_coefficients[s->out_primaries->wp]; + wp_in = &whitepoint_coefficients[s->in_primaries->wp]; + fill_rgb2xyz_table(&s->out_primaries->coeff, wp_out, rgb2xyz); invert_matrix3x3(rgb2xyz, xyz2rgb); - fill_rgb2xyz_table(s->in_primaries, rgb2xyz); + fill_rgb2xyz_table(&s->in_primaries->coeff, wp_in, rgb2xyz); if (s->out_primaries->wp != s->in_primaries->wp && s->wp_adapt != WP_ADAPT_IDENTITY) { double wpconv[3][3], tmp[3][3];