From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id ADCAB40FAB for ; Fri, 13 May 2022 19:18:22 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4927F68B42E; Fri, 13 May 2022 22:18:19 +0300 (EEST) Received: from mail-oi1-f181.google.com (mail-oi1-f181.google.com [209.85.167.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4EDF968B03B for ; Fri, 13 May 2022 22:18:13 +0300 (EEST) Received: by mail-oi1-f181.google.com with SMTP id w123so11278600oiw.5 for ; Fri, 13 May 2022 12:18:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:date:mime-version:user-agent:subject:content-language:to :references:from:in-reply-to:content-transfer-encoding; bh=RDlWk4vA/t5FAx0V6RLwudG4Ec4s/26txcRKCj1Jt/k=; b=mBliWIBzxrxMNAUoLkygc07mX2/Ok8XkOLNposSPRM4lAAkPy/4CZqNZQESqsmX+Bb h/WOw9X6IkPO9bG9JvfPzvRwzg//ZY6cHw9qN50qZ2WHv3c7fTtlJoMaSA5zbfzCXCRW plgKI8+FZsDXdxG+yK02PeTNJ4YmQluNRR4WlAZp6c0Jpu46Kl4NeRzm7ABpRevjz6CH jWDnMzsL83JObp5bboDTictVMfwkYmqnUTRYzOrIGpyl8EPtJ55EVvDCXRfN3lO2UYrk t18vhkCVxuRJrqO7QOk+LthKG+w1PQ1EwlC+l472pwzl1zSFpc/HdnRqjudR2yyLut/b /ZJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:references:from:in-reply-to :content-transfer-encoding; bh=RDlWk4vA/t5FAx0V6RLwudG4Ec4s/26txcRKCj1Jt/k=; b=pKagNlkuqZCtsEo7v9AmyYDQmahJsDqeTlFVrIqjEdLX2DVE25zk89dCIhPy4qYqts xVM7cWBg6pnV6fd8FZKEowsoMr5ZJRyXsdS9dLPNAJ1a9mnjOvWhxrJ/aMlsC3UKXEG2 HNe0kfQ2HN0nV0YUepRSLvONjkDcPxLZixraMgED0c86kxwwV4sGDFSNLBFMEPJsnSPu ExdZRzhb057boqxEf7f5i1gQRLsDyMGppUZ8hbPh5oS0uW3O0+ZkAHpRqmwcq6iLX1mv hgbE9uVHU/ObkV2txC5GauWKueAYlpHf0YLPaOs01wxrXGwTKIKYdBJYs4R8U1OKk232 e/yg== X-Gm-Message-State: AOAM5316PlF9+co3yBKCJZ0FZpU9Tu5bWQY2GiTxshnkuXqC57+7qSKw d9s8xvNLM7JNBxs77rqUyO/FzzAQ/vE= X-Google-Smtp-Source: ABdhPJy+yDCYJaLKy2NcFDygNyCzipIhwts8OYZY8AZgWQM26D08/RMd6bzbqW6rsqWZiXHDlpryRw== X-Received: by 2002:a05:6808:23c5:b0:328:a5b8:267 with SMTP id bq5-20020a05680823c500b00328a5b80267mr8136596oib.10.1652469491269; Fri, 13 May 2022 12:18:11 -0700 (PDT) Received: from [192.168.0.13] ([186.136.131.95]) by smtp.gmail.com with ESMTPSA id e4-20020a056870450400b000e686d1386dsm1313223oao.7.2022.05.13.12.18.10 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 13 May 2022 12:18:10 -0700 (PDT) Message-ID: <2c6acc38-184d-ad64-93c5-73456a188eca@gmail.com> Date: Fri, 13 May 2022 16:18:11 -0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.9.0 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20220513154208.17941-1-leo.izen@gmail.com> From: James Almer In-Reply-To: <20220513154208.17941-1-leo.izen@gmail.com> Subject: Re: [FFmpeg-devel] [PATCH] avutil/csp: create public API for colorspace structs X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On 5/13/2022 12:42 PM, Leo Izen wrote: > This commit moves some of the functionality from avfilter/colorspace > into avutil/csp and exposes it as a public API so it can be used by > libavcodec and/or libavformat. If it's of no use for library users, then make them avpriv_ and not installed. > --- > libavfilter/colorspace.c | 88 ---------------------------- > libavfilter/colorspace.h | 25 +------- > libavfilter/fflcms2.c | 3 +- > libavfilter/fflcms2.h | 2 +- > libavfilter/vf_colorspace.c | 9 +-- > libavfilter/vf_iccdetect.c | 3 +- > libavutil/Makefile | 2 + > libavutil/csp.c | 111 ++++++++++++++++++++++++++++++++++++ > libavutil/csp.h | 49 ++++++++++++++++ > 9 files changed, 173 insertions(+), 119 deletions(-) > create mode 100644 libavutil/csp.c > create mode 100644 libavutil/csp.h > > diff --git a/libavfilter/colorspace.c b/libavfilter/colorspace.c > index 8d7b882375..f22e7002e1 100644 > --- a/libavfilter/colorspace.c > +++ b/libavfilter/colorspace.c > @@ -107,94 +107,6 @@ static const double gbr_matrix[3][3] = > { 0.5, -0.5, 0 }, > }; > > -/* > - * All constants explained in e.g. https://linuxtv.org/downloads/v4l-dvb-apis/ch02s06.html > - * The older ones (bt470bg/m) are also explained in their respective ITU docs > - * (e.g. https://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.470-5-199802-S!!PDF-E.pdf) > - * whereas the newer ones can typically be copied directly from wikipedia :) > - */ > -static const struct LumaCoefficients luma_coefficients[AVCOL_SPC_NB] = { > - [AVCOL_SPC_FCC] = { 0.30, 0.59, 0.11 }, > - [AVCOL_SPC_BT470BG] = { 0.299, 0.587, 0.114 }, > - [AVCOL_SPC_SMPTE170M] = { 0.299, 0.587, 0.114 }, > - [AVCOL_SPC_BT709] = { 0.2126, 0.7152, 0.0722 }, > - [AVCOL_SPC_SMPTE240M] = { 0.212, 0.701, 0.087 }, > - [AVCOL_SPC_YCOCG] = { 0.25, 0.5, 0.25 }, > - [AVCOL_SPC_RGB] = { 1, 1, 1 }, > - [AVCOL_SPC_BT2020_NCL] = { 0.2627, 0.6780, 0.0593 }, > - [AVCOL_SPC_BT2020_CL] = { 0.2627, 0.6780, 0.0593 }, > -}; > - > -const struct LumaCoefficients *ff_get_luma_coefficients(enum AVColorSpace csp) > -{ > - const struct LumaCoefficients *coeffs; > - > - if (csp >= AVCOL_SPC_NB) > - return NULL; > - coeffs = &luma_coefficients[csp]; > - if (!coeffs->cr) > - return NULL; > - > - return coeffs; > -} > - > -#define WP_D65 { 0.3127, 0.3290 } > -#define WP_C { 0.3100, 0.3160 } > -#define WP_DCI { 0.3140, 0.3510 } > -#define WP_E { 1/3.0f, 1/3.0f } > - > -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 } }, > -}; > - > -const struct ColorPrimaries *ff_get_color_primaries(enum AVColorPrimaries prm) > -{ > - const struct ColorPrimaries *p; > - > - if (prm >= AVCOL_PRI_NB) > - return NULL; > - p = &color_primaries[prm]; > - if (!p->prim.xr) > - return NULL; > - > - return p; > -} > - > -enum AVColorPrimaries ff_detect_color_primaries(const struct ColorPrimaries *prm) > -{ > - double delta; > - > - for (enum AVColorPrimaries p = 0; p < AVCOL_PRI_NB; p++) { > - const struct ColorPrimaries *ref = &color_primaries[p]; > - if (!ref->prim.xr) > - continue; > - > - delta = fabs(prm->prim.xr - ref->prim.xr) + > - fabs(prm->prim.yr - ref->prim.yr) + > - fabs(prm->prim.yg - ref->prim.yg) + > - fabs(prm->prim.yg - ref->prim.yg) + > - fabs(prm->prim.yb - ref->prim.yb) + > - fabs(prm->prim.yb - ref->prim.yb) + > - fabs(prm->wp.xw - ref->wp.xw) + > - fabs(prm->wp.yw - ref->wp.yw); > - > - if (delta < 0.001) > - return p; > - } > - > - return AVCOL_PRI_UNSPECIFIED; > -} > - > void ff_fill_rgb2yuv_table(const struct LumaCoefficients *coeffs, > double rgb2yuv[3][3]) > { > diff --git a/libavfilter/colorspace.h b/libavfilter/colorspace.h > index 6959133a49..c5f39baca8 100644 > --- a/libavfilter/colorspace.h > +++ b/libavfilter/colorspace.h > @@ -20,43 +20,20 @@ > #ifndef AVFILTER_COLORSPACE_H > #define AVFILTER_COLORSPACE_H > > +#include "libavutil/csp.h" > #include "libavutil/frame.h" > #include "libavutil/pixfmt.h" > > #define REFERENCE_WHITE 100.0f > > -struct LumaCoefficients { > - double cr, cg, cb; > -}; > - > -struct PrimaryCoefficients { > - double xr, yr, xg, yg, xb, yb; > -}; > - > -struct WhitepointCoefficients { > - double xw, yw; > -}; > - > -struct ColorPrimaries { > - struct WhitepointCoefficients wp; > - struct PrimaryCoefficients prim; > -}; > - > void ff_matrix_invert_3x3(const double in[3][3], double out[3][3]); > void ff_matrix_mul_3x3(double dst[3][3], > const double src1[3][3], const double src2[3][3]); > void ff_fill_rgb2xyz_table(const struct PrimaryCoefficients *coeffs, > const struct WhitepointCoefficients *wp, > double rgb2xyz[3][3]); > - > -/* Returns AVCOL_PRI_UNSPECIFIED if no clear match can be identified */ > -enum AVColorPrimaries ff_detect_color_primaries(const struct ColorPrimaries *prm); > - > -const struct ColorPrimaries *ff_get_color_primaries(enum AVColorPrimaries prm); > -const struct LumaCoefficients *ff_get_luma_coefficients(enum AVColorSpace csp); > void ff_fill_rgb2yuv_table(const struct LumaCoefficients *coeffs, > double rgb2yuv[3][3]); > - > double ff_determine_signal_peak(AVFrame *in); > void ff_update_hdr_metadata(AVFrame *in, double peak); > > diff --git a/libavfilter/fflcms2.c b/libavfilter/fflcms2.c > index efc7cb5189..b1a0429010 100644 > --- a/libavfilter/fflcms2.c > +++ b/libavfilter/fflcms2.c > @@ -18,6 +18,7 @@ > */ > > #include "libavutil/color_utils.h" > +#include "libavutil/csp.h" > > #include "fflcms2.h" > > @@ -151,7 +152,7 @@ int ff_icc_profile_generate(FFIccContext *s, > const struct ColorPrimaries *prim; > int ret; > > - if (!(prim = ff_get_color_primaries(color_prim))) > + if (!(prim = av_get_color_primaries(color_prim))) > return AVERROR_INVALIDDATA; > if ((ret = get_curve(s, color_trc, &tonecurve)) < 0) > return ret; > diff --git a/libavfilter/fflcms2.h b/libavfilter/fflcms2.h > index ad6c8c47cf..628598a41c 100644 > --- a/libavfilter/fflcms2.h > +++ b/libavfilter/fflcms2.h > @@ -25,9 +25,9 @@ > #ifndef AVFILTER_FFLCMS2_H > #define AVFILTER_FFLCMS2_H > > +#include "libavutil/csp.h" > #include "libavutil/frame.h" > #include "libavutil/pixfmt.h" > -#include "colorspace.h" > > #include > > diff --git a/libavfilter/vf_colorspace.c b/libavfilter/vf_colorspace.c > index 3c8b3b20eb..e5b1a06c54 100644 > --- a/libavfilter/vf_colorspace.c > +++ b/libavfilter/vf_colorspace.c > @@ -24,6 +24,7 @@ > */ > > #include "libavutil/avassert.h" > +#include "libavutil/csp.h" > #include "libavutil/mem_internal.h" > #include "libavutil/opt.h" > #include "libavutil/pixdesc.h" > @@ -438,7 +439,7 @@ static int create_filtergraph(AVFilterContext *ctx, > s->in_prm = default_prm[FFMIN(s->user_iall, CS_NB)]; > if (s->user_iprm != AVCOL_PRI_UNSPECIFIED) > s->in_prm = s->user_iprm; > - s->in_primaries = ff_get_color_primaries(s->in_prm); > + s->in_primaries = av_get_color_primaries(s->in_prm); > if (!s->in_primaries) { > av_log(ctx, AV_LOG_ERROR, > "Unsupported input primaries %d (%s)\n", > @@ -446,7 +447,7 @@ static int create_filtergraph(AVFilterContext *ctx, > return AVERROR(EINVAL); > } > s->out_prm = out->color_primaries; > - s->out_primaries = ff_get_color_primaries(s->out_prm); > + s->out_primaries = av_get_color_primaries(s->out_prm); > if (!s->out_primaries) { > if (s->out_prm == AVCOL_PRI_UNSPECIFIED) { > if (s->user_all == CS_UNSPECIFIED) { > @@ -551,7 +552,7 @@ static int create_filtergraph(AVFilterContext *ctx, > s->in_rng = in->color_range; > if (s->user_irng != AVCOL_RANGE_UNSPECIFIED) > s->in_rng = s->user_irng; > - s->in_lumacoef = ff_get_luma_coefficients(s->in_csp); > + s->in_lumacoef = av_get_luma_coefficients(s->in_csp); > if (!s->in_lumacoef) { > av_log(ctx, AV_LOG_ERROR, > "Unsupported input colorspace %d (%s)\n", > @@ -564,7 +565,7 @@ static int create_filtergraph(AVFilterContext *ctx, > if (!s->out_lumacoef) { > s->out_csp = out->colorspace; > s->out_rng = out->color_range; > - s->out_lumacoef = ff_get_luma_coefficients(s->out_csp); > + s->out_lumacoef = av_get_luma_coefficients(s->out_csp); > if (!s->out_lumacoef) { > if (s->out_csp == AVCOL_SPC_UNSPECIFIED) { > if (s->user_all == CS_UNSPECIFIED) { > diff --git a/libavfilter/vf_iccdetect.c b/libavfilter/vf_iccdetect.c > index fb7871f035..d2b0e5569f 100644 > --- a/libavfilter/vf_iccdetect.c > +++ b/libavfilter/vf_iccdetect.c > @@ -24,6 +24,7 @@ > > #include > > +#include "libavutil/csp.h" > #include "libavutil/opt.h" > #include "libavutil/pixdesc.h" > > @@ -98,7 +99,7 @@ static int iccdetect_filter_frame(AVFilterLink *inlink, AVFrame *frame) > if (ret < 0) > return ret; > > - s->profile_prim = ff_detect_color_primaries(&coeffs); > + s->profile_prim = av_detect_color_primaries(&coeffs); > > done: > if (s->profile_prim != AVCOL_PRI_UNSPECIFIED) { > diff --git a/libavutil/Makefile b/libavutil/Makefile > index 234de62a4b..74d21a8103 100644 > --- a/libavutil/Makefile > +++ b/libavutil/Makefile > @@ -20,6 +20,7 @@ HEADERS = adler32.h \ > common.h \ > cpu.h \ > crc.h \ > + csp.h \ > des.h \ > detection_bbox.h \ > dict.h \ > @@ -113,6 +114,7 @@ OBJS = adler32.o \ > color_utils.o \ > cpu.o \ > crc.o \ > + csp.o \ > des.o \ > detection_bbox.o \ > dict.o \ > diff --git a/libavutil/csp.c b/libavutil/csp.c > new file mode 100644 > index 0000000000..cd755c1795 > --- /dev/null > +++ b/libavutil/csp.c > @@ -0,0 +1,111 @@ > +/* > + * Copyright (c) 2016 Ronald S. Bultje > + * This file is part of FFmpeg. > + * > + * FFmpeg is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * FFmpeg is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with FFmpeg; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > + */ > + > +#include "csp.h" > +#include "frame.h" > +#include "mastering_display_metadata.h" > +#include "pixfmt.h" > + > +/* > + * All constants explained in e.g. https://linuxtv.org/downloads/v4l-dvb-apis/ch02s06.html > + * The older ones (bt470bg/m) are also explained in their respective ITU docs > + * (e.g. https://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.470-5-199802-S!!PDF-E.pdf) > + * whereas the newer ones can typically be copied directly from wikipedia :) > + */ > +static const struct LumaCoefficients luma_coefficients[AVCOL_SPC_NB] = { > + [AVCOL_SPC_FCC] = { 0.30, 0.59, 0.11 }, > + [AVCOL_SPC_BT470BG] = { 0.299, 0.587, 0.114 }, > + [AVCOL_SPC_SMPTE170M] = { 0.299, 0.587, 0.114 }, > + [AVCOL_SPC_BT709] = { 0.2126, 0.7152, 0.0722 }, > + [AVCOL_SPC_SMPTE240M] = { 0.212, 0.701, 0.087 }, > + [AVCOL_SPC_YCOCG] = { 0.25, 0.5, 0.25 }, > + [AVCOL_SPC_RGB] = { 1, 1, 1 }, > + [AVCOL_SPC_BT2020_NCL] = { 0.2627, 0.6780, 0.0593 }, > + [AVCOL_SPC_BT2020_CL] = { 0.2627, 0.6780, 0.0593 }, > +}; > + > +const struct LumaCoefficients *av_get_luma_coefficients(enum AVColorSpace csp) > +{ > + const struct LumaCoefficients *coeffs; > + > + if (csp >= AVCOL_SPC_NB) > + return NULL; > + coeffs = &luma_coefficients[csp]; > + if (!coeffs->cr) > + return NULL; > + > + return coeffs; > +} > + > +#define WP_D65 { 0.3127, 0.3290 } > +#define WP_C { 0.3100, 0.3160 } > +#define WP_DCI { 0.3140, 0.3510 } > +#define WP_E { 1/3.0f, 1/3.0f } > + > +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 } }, > +}; > + > +const struct ColorPrimaries *av_get_color_primaries(enum AVColorPrimaries prm) > +{ > + const struct ColorPrimaries *p; > + > + if (prm >= AVCOL_PRI_NB) > + return NULL; > + p = &color_primaries[prm]; > + if (!p->prim.xr) > + return NULL; > + > + return p; > +} > + > +enum AVColorPrimaries av_detect_color_primaries(const struct ColorPrimaries *prm) > +{ > + double delta; > + > + for (enum AVColorPrimaries p = 0; p < AVCOL_PRI_NB; p++) { > + const struct ColorPrimaries *ref = &color_primaries[p]; > + if (!ref->prim.xr) > + continue; > + > + delta = fabs(prm->prim.xr - ref->prim.xr) + > + fabs(prm->prim.yr - ref->prim.yr) + > + fabs(prm->prim.yg - ref->prim.yg) + > + fabs(prm->prim.yg - ref->prim.yg) + > + fabs(prm->prim.yb - ref->prim.yb) + > + fabs(prm->prim.yb - ref->prim.yb) + > + fabs(prm->wp.xw - ref->wp.xw) + > + fabs(prm->wp.yw - ref->wp.yw); > + > + if (delta < 0.001) > + return p; > + } > + > + return AVCOL_PRI_UNSPECIFIED; > +} > diff --git a/libavutil/csp.h b/libavutil/csp.h > new file mode 100644 > index 0000000000..1bcde7ddd3 > --- /dev/null > +++ b/libavutil/csp.h > @@ -0,0 +1,49 @@ > +/* > + * Copyright (c) 2016 Ronald S. Bultje > + * This file is part of FFmpeg. > + * > + * FFmpeg is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * FFmpeg is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with FFmpeg; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > + */ > + > +#ifndef AVUTIL_CSP_H > +#define AVUTIL_CSP_H > + > +#include "libavutil/frame.h" > +#include "libavutil/pixfmt.h" > + > +struct LumaCoefficients { > + double cr, cg, cb; > +}; > + > +struct PrimaryCoefficients { > + double xr, yr, xg, yg, xb, yb; > +}; > + > +struct WhitepointCoefficients { > + double xw, yw; > +}; > + > +struct ColorPrimaries { > + struct WhitepointCoefficients wp; > + struct PrimaryCoefficients prim; > +}; > + > +/* Returns AVCOL_PRI_UNSPECIFIED if no clear match can be identified */ > +enum AVColorPrimaries av_detect_color_primaries(const struct ColorPrimaries *prm); > + > +const struct ColorPrimaries *av_get_color_primaries(enum AVColorPrimaries prm); > +const struct LumaCoefficients *av_get_luma_coefficients(enum AVColorSpace csp); > + > +#endif /* AVUTIL_CSP_H */ _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".