From patchwork Wed Jun 6 07:23:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ruiling Song X-Patchwork-Id: 9268 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:11c:0:0:0:0:0 with SMTP id c28-v6csp476407jad; Wed, 6 Jun 2018 00:24:16 -0700 (PDT) X-Google-Smtp-Source: ADUXVKLpJz8FfEI18Fof9XmfGLEwNHf4HCg8K5gje7oXSOFLE0ogf2NCLzqsTuz+jPuEPysT98ry X-Received: by 2002:adf:d84a:: with SMTP id k10-v6mr1329101wrl.26.1528269856382; Wed, 06 Jun 2018 00:24:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528269856; cv=none; d=google.com; s=arc-20160816; b=vcdrWYeuTmTfBX87YfUS4+YRJbdFvVm8mVzcXEvXC+0CPxHW+qd2MY3KdTtOsKnJ+I MKTl05oUsDX5y/CyDVMnjt/eXTEhHI8f08LTOWQcllvXAP8XcmhDsKtW2NIY5Xa4DBgS 7dPIdfqBsDOM7pftAxOZJqnjH6JOJZ9kABr2s18Xw4iUmVwH1oEVx4geOeXFmWcbCtuW EyJR3ya7LY8WczbU9BHzt+HbJNRpLi4ESt9P5CjcWLPg2nzMnj2+Ir5W5+ZzWY6dRK+m zrPklVK/7lVNMq3ZkDeV2f9O2oQYzM/G8cn92zv1Z1SOqnrBbUxmqXvmkWv9Q2/RDD/D DplQ== 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=j7Zq2dN4jdNR0Dvf5cIn9whpPpDSq5wu1fMotW2u9THLtGz3QB/jalau4+VH6GPEXu 5zRuhHuTt91Eni7OZB+6CZncMT4R/ckt4p1boK3ZjEb/crvrBSbSwexytsTW4fn9hvh3 4ybuErtmkkchxcSLwd5MrmhmB3DTPDPZN90HftO8iQzFaMUCvlVppH9jl0reTKDpP3Nj jVL/5duWCPbs5OGZCJtvf++efj2kXSAHfrK972xK+58ZIgPvccyKD18ImNnzD04b5r4y VCkhTbwMgUCemSos1fN40ZgmvVHNlq7zNXYAieLWyFXknOtlHyVDgYuNPesdcu3KRdD8 yU/Q== 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 q7-v6si15510945wre.288.2018.06.06.00.24.16; Wed, 06 Jun 2018 00:24:16 -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 47EBB68A734; Wed, 6 Jun 2018 10:23:26 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6902768A5BC for ; Wed, 6 Jun 2018 10:23:19 +0300 (EEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Jun 2018 00:24:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,482,1520924400"; d="scan'208";a="54276156" Received: from ocl-kbl.sh.intel.com ([10.239.160.52]) by fmsmga002.fm.intel.com with ESMTP; 06 Jun 2018 00:24:02 -0700 From: Ruiling Song To: ffmpeg-devel@ffmpeg.org Date: Wed, 6 Jun 2018 15:23:54 +0800 Message-Id: <1528269834-22747-2-git-send-email-ruiling.song@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1528269834-22747-1-git-send-email-ruiling.song@intel.com> References: <1528269834-22747-1-git-send-email-ruiling.song@intel.com> Subject: [FFmpeg-devel] [PATCH v3 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];