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 24479410D5 for ; Sun, 15 May 2022 16:32:51 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9C8C568B4AA; Sun, 15 May 2022 19:32:48 +0300 (EEST) Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073029.outbound.protection.outlook.com [40.92.73.29]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B9F3B68B27E for ; Sun, 15 May 2022 19:32:42 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Sb7y4jXxaYxB6kJgyJktWuEZZRQD7W2THvgvusqkS/KTSk0pBovgy2pYVNfBO2ZeMGRcONrnq4TqLwZfU7wJSFTL2WJuMR9MvpEile/RIEg6M0vfGfu8xQc/w2eJKpVq2K7ajIsvpGxE0/Cnju1graeXpj83wBFGmaEIydV9wSRtzGQeEDkmaCS/GO6kHjzxnc5BH4JPZDkxn+a/UoWYXhLL4FYwQXF4Afh2Ilvcww7/iquN22NZazgEmMkExPrHrzmklxpYIgxFboaOESE6+GSU0dhGd1EXTXpXNMlQzPfqJehEVbeSiiru19t206UJ3o6gD0WOfP80Je1GIIpw8A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=6ZghkdUKxq5kSFNgRksS2Arx44wo1uzGkYeUxy9GkIs=; b=CCwDGjkNLTOWFw3UHjgRdFEM9iwwMKl6AvpDrC+kQhbnnBi5NkwoDGxcwenfqSc3+jLWZKAcjrOlrqspNfbcSNLjqhvbkXXqT1X5wvHbx9bbRU+Anvk0mSsBCyJ7LzfDXqQJIHpXHJ51+SaV12lnl2itwakfykI6M1WQjeJ46bkJwnAS6MoAbrky4gNuaVKIR8fqJhW0mdtdZt9MwjBrV207Ogn/8Wugtv34hlvYNZoAk0Z8mHVTeIkSuvCoz06OSkQwEud9fO0KmVojW1IIVQhlCcjn1oUP5i//69js6/CUXimRKkjGNLLIs0co0DJ9Dtmp8glStXOudMYBV4GEAg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6ZghkdUKxq5kSFNgRksS2Arx44wo1uzGkYeUxy9GkIs=; b=EGgzmLcpE24VFW0YkLyWJtrHaj6LN4+o5OxMldP1o334Hj4cTFKWJ6QC07EVZovK2uX1HHRAAhjYl6ZA5tN5zdxpAI1+5D0pJHcs1ytEJgC2k3DY7WkOI+YobQ7bFbQqMOcnMsO2LHzhdI+HiNI6oj4MKoIHGQUQsj0bMAS0YUwZUSMvAUPNtEUKTf+uTf2kolP9TGdjc7DSfCHUYEjOStuWIcuh9tclF7EaraE4+iZjT8zZ2X20skGH5X52MR6vGriU3IRn5Xywiqrslif0kPcaLCkIOdSy16+/Atmr2Ve/PfEfYynqe4k8GsmMBTyrAgznXYgtvHo/alXHMDfxDQ== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by HE1PR0101MB2201.eurprd01.prod.exchangelabs.com (2603:10a6:3:1d::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5250.14; Sun, 15 May 2022 16:32:39 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c%10]) with mapi id 15.20.5250.018; Sun, 15 May 2022 16:32:38 +0000 Message-ID: Date: Sun, 15 May 2022 18:32:36 +0200 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20220513154208.17941-1-leo.izen@gmail.com> From: Andreas Rheinhardt In-Reply-To: <20220513154208.17941-1-leo.izen@gmail.com> X-TMN: [I9Pf/2Hpg79bloXv/zA7El/WF/cMDEC1] X-ClientProxiedBy: ZR0P278CA0196.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:44::22) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5031e728-1611-4ba7-29e7-08da36908677 X-MS-TrafficTypeDiagnostic: HE1PR0101MB2201:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Y32qVoVlNLUq+76QJZnG+syAfTM0BPG4wd8WMuY282zezQWYw0yqoCSYOL0uBCAys8uuonOUP/gXy6wO5QqM5LoLmrDMpKrB5YdiYLFlZCb6jfOz+Yi5sJKxiDOhPKcMlLhEyphtYw4ikonDfxYLFUzY7Nx6BOQZ9ZRnSw6ukPUTtJSmuZK5GGM0XljtuBdlDSOCYHfhDYJJYc8zNJ0Hn3TT/a8rJumvv1hoMn5Tp8adT7rkb10OX0i2+BBfE85ZeyyD+2Xv07uTSu9r2f2xL4nVIbZZRA5mgShNzhnOZHdRcr0EpakFrSQkXCQv9Vnb+BfmyRTttP8rE2VCjNHopLNkdJJwe1i8fbyztoe5UQkl2av5oDC6ZHz2F2EKiUjj0TGtpovhACy0IpZb4JYbBeDRgTC8LjQsHduA4kToBuu5eovPxYdSawy8T+oaH7d45dSxUJfUZ2+FMKVRepv6oOPuopC5NrksAOGuC0MEeiqCrcj/95wtqmySNZnY/PkY8KgXaT+ncjekh1T0B6M98+ucm/hJaGTmxZYffiL6C0rrxPgtQWMNDrQTUA1G/6A3aJjqL5SHejjxkalgsGXesxFPfAEqO+fcEtCwHVtA3YYzLP6X56pLjscv5vV3X2mx X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ZGViTTVGQ3lGbFdRd1ArNmZ1bEVRNkJ1MzZ5cHk2dzhxNk0vUDdlVytHeDQ3?= =?utf-8?B?MHVPTDJjN2RVL1ZwSmlTTW0vL1FXaXVkOU0zcy9ISWNPRnEwdlQ5MnB6Y0N1?= =?utf-8?B?TEp1NGZhN0V4ekFFM3VZa0NjN1IvS0RnZlB2eXU3T3QvZWpJOWpjaFdxd2J1?= =?utf-8?B?MllCbE9KYnZtelp6V2RkcVBOTG9CV2MxUU42RkJOQWJCTDE1MmlwQytNcnFp?= =?utf-8?B?QVg4K1dxclJ2cWZmSk81RGF0NkJ2MUNDTHUrV3o4WVBnbFl1WjY5eWtkaldo?= =?utf-8?B?cUV6RGdseXpjcXE4a0hFeHNudDhxRERwU01SaW96RnVLbkxSaHpLU0tNSWNs?= =?utf-8?B?RkRBajBlK3ZxWENVTnlzUWRLVHBReDREdy9jallqNzRMOHJIVnFlMUZ6R1pG?= =?utf-8?B?SHF2QkZlQk9uM0w1RnhNeWQvMTY4Z01iY09pUmlRTnFmUEkrV1RkNWVKV05B?= =?utf-8?B?QlVXTDRJcXlpSzF6dS9Mb3dIWWNmQTAwc2ozT3htOXpBQXpTZzJ6NWRnVitz?= =?utf-8?B?cTdHemM3YUJhS1NCM0dsdXNKNnlKbWpYakU4TTBnZlhMQ3IyUXFEQWdtOUk2?= =?utf-8?B?ZEh1WnpVdlEvbDBOb2VDOVpkc1lUL005clN5NlFiZXBlRGQyZy81NTk0dVhD?= =?utf-8?B?ZWxnQ3JxK2QrVmZkZmk0TWE3TksvREpMS21PSTVJcUhaKzNZMVZQUUpSc3pl?= =?utf-8?B?VWcveTBZT0c3enBUdDBBZVVzMkVtM3BCN0V3UStxNjFCYTFRemtQMUpVSGF5?= =?utf-8?B?NHp3R0FtSUJYbVJzMFRUdVRDK0RCVHd3SFJaU1ljbG5qQUd6cWd1SUhHOEMz?= =?utf-8?B?dlBpck9rTUQ0QytEcUthZkdJSERFYlIwUFVDRnN6L3kzcEkvRDRweXBmTDA2?= =?utf-8?B?SlBTNzZhT1EvKzlLTmsxcUVHdzZxYXh1dGUzRHIyRUVJclhxVWU5Y0pIWUVq?= =?utf-8?B?UHM5bkwwR3AvdkR1a1gvR25hdDVvWmdEUzZHNzJudldkU1IvSG96TlN5eVU4?= =?utf-8?B?ZEdiZEhHM3ZQOXBsY3labTBzLzhYUS8ranp2NlFNR3BYVy9IdzBrMUxLZVA5?= =?utf-8?B?UER1dzUrOTZEMHV6Q1Z5VExRL21CODl1KzlRbitGd05OTEo0K09MWEJLUDll?= =?utf-8?B?ZGJZVGhLTW8wT2tMU0poUlpKWHR0c2k5L0NCUUFoNnZhNGlPdTh4U0V3cjYw?= =?utf-8?B?elRTRU1JU0RodnBiajZhZ3hrRXROaGRFdTJCOS9VK2NjTUdYeEFJMUpwNjgy?= =?utf-8?B?MW1TNVdxUDkvU0swd012UTZ0eGQyQmxYeFdIWUZZWTgvRE13OXFDK1dIb0c1?= =?utf-8?B?VjgrbnUzbnhEaFc2MXNKOTVDSEJUQWtTaFpKbmZQbTdmNldMczBFTisvSDJv?= =?utf-8?B?YnlsTU5ZVjZjN1hTTGIyeGttcm1pNmlNUnF4SkVNOWxCUEtybzcxUkp4dFVV?= =?utf-8?B?b0paYlhjVzV0bFdSaFZDVmVOOFVjaE4wblB1bFZmdW43M1Bvd0JDaDlMNjJl?= =?utf-8?B?ZDR5OG9kMEJQbmp1KzFGWDNTU3ZqQkd0MVVHekpkT0NDY2hadW1PR2VpejdJ?= =?utf-8?B?NTlhUFBWdlovb0lZbllkaVFsOXhqZGFqOWs0b2VndkVLdURaaDBiZ1YyYmlT?= =?utf-8?B?ZFZ3dkMwSFJMbS8yQ3FsSnRVbU80WW5id0h5SUo2RTAvc1RYN0dEL2pWYXdH?= =?utf-8?B?a2VvVmJGcGhPRWY5azN4ZkNxRlpST2pPbzVzaXQwQlJHVTN4ci9WRmtwUExU?= =?utf-8?B?bTc4aU4zK1Q2dGgyNjZaSS9NdlN1cy8yY0k4WElQZzZhSnZWa3BVWVVLTWdx?= =?utf-8?B?aThkeDVFUEVlcDBUZjA4RTFjTEg1WFhxN3pkOGh1RjdPYmNmSTJXNFUvVVNr?= =?utf-8?B?MmxCSFU5MnJqYnFreGx2ZnpQVXVSL0xDRTU0ZUZCNjFtR2VWanpPNlMwdnNO?= =?utf-8?B?RjFRc3pJU2xKTWtRUlVhT2c3Q0hwc09kYURjZ0VRMVJrT25WMHNIWFZZT01k?= =?utf-8?B?ei9uam95a1BnPT0=?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5031e728-1611-4ba7-29e7-08da36908677 X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 May 2022 16:32:38.7993 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0101MB2201 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-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Leo Izen: > 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. > --- > 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 */ Is there any scenario in which these structs might need to be extended? This is something that we could no longer easily do if these structs were public. - Andreas _______________________________________________ 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".