• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright 2022 Advanced Micro Devices, Inc.
2  *
3  * Permission is hereby granted, free of charge, to any person obtaining a
4  * copy of this software and associated documentation files (the "Software"),
5  * to deal in the Software without restriction, including without limitation
6  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
7  * and/or sell copies of the Software, and to permit persons to whom the
8  * Software is furnished to do so, subject to the following conditions:
9  *
10  * The above copyright notice and this permission notice shall be included in
11  * all copies or substantial portions of the Software.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
16  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
17  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
18  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
19  * OTHER DEALINGS IN THE SOFTWARE.
20  *
21  * Authors: AMD
22  *
23  */
24 
25 #include <string.h>
26 #include "vpe_priv.h"
27 #include "common.h"
28 #include "mpc.h"
29 
30 enum mpc_color_space_type {
31     COLOR_SPACE_RGB_TYPE,
32     COLOR_SPACE_RGB_LIMITED_8PBC_TYPE,
33     COLOR_SPACE_RGB_LIMITED_10PBC_TYPE,
34     COLOR_SPACE_YCBCR601_TYPE,
35     COLOR_SPACE_YCBCR709_TYPE,
36     COLOR_SPACE_YCBCR2020_TYPE,
37     COLOR_SPACE_YCBCR601_LIMITED_TYPE,
38     COLOR_SPACE_YCBCR709_LIMITED_TYPE,
39     // COLOR_SPACE_YCBCR709_BLACK_TYPE,
40 };
41 struct out_csc_color_matrix_type {
42     enum mpc_color_space_type color_space_type;
43     uint16_t                  regval[12];
44 };
45 
46 static const struct out_csc_color_matrix_type output_csc_matrix[] = {
47     {COLOR_SPACE_RGB_TYPE, {0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0}},
48     {COLOR_SPACE_RGB_LIMITED_8PBC_TYPE,
49         {0x1B7B, 0, 0, 0x202, 0, 0x1B7B, 0, 0x202, 0, 0, 0x1B7B, 0x202}},
50     {COLOR_SPACE_RGB_LIMITED_10PBC_TYPE,
51         {0x1B66, 0, 0, 0x200, 0, 0x1B66, 0, 0x200, 0, 0, 0x1B66, 0x200}},
52     {COLOR_SPACE_YCBCR601_TYPE, {0xE04, 0xF444, 0xFDB9, 0x1004, 0x831, 0x1016, 0x320, 0x201, 0xFB45,
53                                     0xF6B7, 0xE04, 0x1004}},
54     {COLOR_SPACE_YCBCR709_TYPE, {0xE04, 0xF345, 0xFEB7, 0x1004, 0x5D3, 0x1399, 0x1FA, 0x201, 0xFCCA,
55                                     0xF533, 0xE04, 0x1004}},
56     /* TODO: correct values below */
57     {COLOR_SPACE_YCBCR601_LIMITED_TYPE, {0xE00, 0xF447, 0xFDB9, 0x1000, 0x991, 0x12C9, 0x3A6, 0x200,
58                                             0xFB47, 0xF6B9, 0xE00, 0x1000}},
59     {COLOR_SPACE_YCBCR709_LIMITED_TYPE, {0xE00, 0xF349, 0xFEB7, 0x1000, 0x6CE, 0x16E3, 0x24F, 0x200,
60                                             0xFCCB, 0xF535, 0xE00, 0x1000}},
61     {COLOR_SPACE_YCBCR2020_TYPE, {0x1000, 0xF149, 0xFEB7, 0x0000, 0x0868, 0x15B2, 0x01E6, 0x0000,
62                                      0xFB88, 0xF478, 0x1000, 0x0000}},
63 };
64 
is_rgb_full_type(enum color_space color_space)65 static bool is_rgb_full_type(enum color_space color_space)
66 {
67     bool ret = false;
68 
69     if (color_space == COLOR_SPACE_SRGB || color_space == COLOR_SPACE_MSREF_SCRGB ||
70         color_space == COLOR_SPACE_2020_RGB_FULLRANGE)
71         ret = true;
72 
73     return ret;
74 }
75 
is_rgb_limited_type(enum color_space color_space)76 static bool is_rgb_limited_type(enum color_space color_space)
77 {
78     bool ret = false;
79 
80     if (color_space == COLOR_SPACE_SRGB_LIMITED || color_space == COLOR_SPACE_2020_RGB_LIMITEDRANGE)
81         ret = true;
82 
83     return ret;
84 }
85 
is_ycbcr601_full_type(enum color_space color_space)86 static bool is_ycbcr601_full_type(enum color_space color_space)
87 {
88     bool ret = false;
89 
90     if (color_space == COLOR_SPACE_YCBCR601)
91         ret = true;
92 
93     return ret;
94 }
95 
is_ycbcr601_limited_type(enum color_space color_space)96 static bool is_ycbcr601_limited_type(enum color_space color_space)
97 {
98     bool ret = false;
99 
100     if (color_space == COLOR_SPACE_YCBCR601_LIMITED)
101         ret = true;
102 
103     return ret;
104 }
105 
is_ycbcr709_full_type(enum color_space color_space)106 static bool is_ycbcr709_full_type(enum color_space color_space)
107 {
108     bool ret = false;
109 
110     if (color_space == COLOR_SPACE_YCBCR709)
111         ret = true;
112 
113     return ret;
114 }
115 
is_ycbcr709_limited_type(enum color_space color_space)116 static bool is_ycbcr709_limited_type(enum color_space color_space)
117 {
118     bool ret = false;
119 
120     if (color_space == COLOR_SPACE_YCBCR709_LIMITED)
121         ret = true;
122 
123     return ret;
124 }
125 
is_ycbcr2020_type(enum color_space color_space)126 static bool is_ycbcr2020_type(enum color_space color_space)
127 {
128     bool ret = false;
129 
130     if (color_space == COLOR_SPACE_2020_YCBCR)
131         ret = true;
132 
133     return ret;
134 }
135 
get_color_space_type(enum color_space color_space,enum vpe_surface_pixel_format pixel_format)136 static enum mpc_color_space_type get_color_space_type(
137     enum color_space color_space, enum vpe_surface_pixel_format pixel_format)
138 {
139     enum mpc_color_space_type type = COLOR_SPACE_RGB_TYPE;
140 
141     if (is_rgb_full_type(color_space))
142         type = COLOR_SPACE_RGB_TYPE;
143     else if (is_rgb_limited_type(color_space))
144         type = vpe_is_rgb8(pixel_format) ? COLOR_SPACE_RGB_LIMITED_8PBC_TYPE
145                                          : COLOR_SPACE_RGB_LIMITED_10PBC_TYPE;
146     else if (is_ycbcr601_full_type(color_space))
147         type = COLOR_SPACE_YCBCR601_TYPE;
148     else if (is_ycbcr709_full_type(color_space))
149         type = COLOR_SPACE_YCBCR709_TYPE;
150     else if (is_ycbcr601_limited_type(color_space))
151         type = COLOR_SPACE_YCBCR601_LIMITED_TYPE;
152     else if (is_ycbcr709_limited_type(color_space))
153         type = COLOR_SPACE_YCBCR709_LIMITED_TYPE;
154     else if (is_ycbcr2020_type(color_space))
155         type = COLOR_SPACE_YCBCR2020_TYPE;
156 
157     return type;
158 }
159 
160 #define NUM_ELEMENTS(a) (sizeof(a) / sizeof((a)[0]))
161 
vpe_find_color_matrix(enum color_space color_space,enum vpe_surface_pixel_format pixel_format,uint32_t * array_size)162 const uint16_t *vpe_find_color_matrix(
163     enum color_space color_space, enum vpe_surface_pixel_format pixel_format, uint32_t *array_size)
164 {
165     int                       i;
166     enum mpc_color_space_type type;
167     const uint16_t           *val      = NULL;
168     int                       arr_size = NUM_ELEMENTS(output_csc_matrix);
169 
170     type = get_color_space_type(color_space, pixel_format);
171     for (i = 0; i < arr_size; i++)
172         if (output_csc_matrix[i].color_space_type == type) {
173             val         = output_csc_matrix[i].regval;
174             *array_size = 12;
175             break;
176         }
177 
178     return val;
179 }
180