xref: /aosp_15_r20/external/webp/sharpyuv/sharpyuv_csp.h (revision b2055c353e87c8814eb2b6b1b11112a1562253bd)
1*b2055c35SXin Li // Copyright 2022 Google Inc. All Rights Reserved.
2*b2055c35SXin Li //
3*b2055c35SXin Li // Use of this source code is governed by a BSD-style license
4*b2055c35SXin Li // that can be found in the COPYING file in the root of the source
5*b2055c35SXin Li // tree. An additional intellectual property rights grant can be found
6*b2055c35SXin Li // in the file PATENTS. All contributing project authors may
7*b2055c35SXin Li // be found in the AUTHORS file in the root of the source tree.
8*b2055c35SXin Li // -----------------------------------------------------------------------------
9*b2055c35SXin Li //
10*b2055c35SXin Li // Colorspace utilities.
11*b2055c35SXin Li 
12*b2055c35SXin Li #ifndef WEBP_SHARPYUV_SHARPYUV_CSP_H_
13*b2055c35SXin Li #define WEBP_SHARPYUV_SHARPYUV_CSP_H_
14*b2055c35SXin Li 
15*b2055c35SXin Li #include "sharpyuv/sharpyuv.h"
16*b2055c35SXin Li 
17*b2055c35SXin Li #ifdef __cplusplus
18*b2055c35SXin Li extern "C" {
19*b2055c35SXin Li #endif
20*b2055c35SXin Li 
21*b2055c35SXin Li // Range of YUV values.
22*b2055c35SXin Li typedef enum {
23*b2055c35SXin Li   kSharpYuvRangeFull,     // YUV values between [0;255] (for 8 bit)
24*b2055c35SXin Li   kSharpYuvRangeLimited   // Y in [16;235], YUV in [16;240] (for 8 bit)
25*b2055c35SXin Li } SharpYuvRange;
26*b2055c35SXin Li 
27*b2055c35SXin Li // Constants that define a YUV color space.
28*b2055c35SXin Li typedef struct {
29*b2055c35SXin Li   // Kr and Kb are defined such that:
30*b2055c35SXin Li   // Y = Kr * r + Kg * g + Kb * b where Kg = 1 - Kr - Kb.
31*b2055c35SXin Li   float kr;
32*b2055c35SXin Li   float kb;
33*b2055c35SXin Li   int bit_depth;  // 8, 10 or 12
34*b2055c35SXin Li   SharpYuvRange range;
35*b2055c35SXin Li } SharpYuvColorSpace;
36*b2055c35SXin Li 
37*b2055c35SXin Li // Fills in 'matrix' for the given YUVColorSpace.
38*b2055c35SXin Li SHARPYUV_EXTERN void SharpYuvComputeConversionMatrix(
39*b2055c35SXin Li     const SharpYuvColorSpace* yuv_color_space,
40*b2055c35SXin Li     SharpYuvConversionMatrix* matrix);
41*b2055c35SXin Li 
42*b2055c35SXin Li // Enums for precomputed conversion matrices.
43*b2055c35SXin Li typedef enum {
44*b2055c35SXin Li   kSharpYuvMatrixWebp = 0,
45*b2055c35SXin Li   kSharpYuvMatrixRec601Limited,
46*b2055c35SXin Li   kSharpYuvMatrixRec601Full,
47*b2055c35SXin Li   kSharpYuvMatrixRec709Limited,
48*b2055c35SXin Li   kSharpYuvMatrixRec709Full,
49*b2055c35SXin Li   kSharpYuvMatrixNum
50*b2055c35SXin Li } SharpYuvMatrixType;
51*b2055c35SXin Li 
52*b2055c35SXin Li // Returns a pointer to a matrix for one of the predefined colorspaces.
53*b2055c35SXin Li SHARPYUV_EXTERN const SharpYuvConversionMatrix* SharpYuvGetConversionMatrix(
54*b2055c35SXin Li     SharpYuvMatrixType matrix_type);
55*b2055c35SXin Li 
56*b2055c35SXin Li #ifdef __cplusplus
57*b2055c35SXin Li }  // extern "C"
58*b2055c35SXin Li #endif
59*b2055c35SXin Li 
60*b2055c35SXin Li #endif  // WEBP_SHARPYUV_SHARPYUV_CSP_H_
61