xref: /aosp_15_r20/external/libkmsxx/kms++/src/pixelformats.cpp (revision f0687c8a10b3e371dbe09214db6664e37c283cca)
1*f0687c8aSRaman Tenneti #include <map>
2*f0687c8aSRaman Tenneti 
3*f0687c8aSRaman Tenneti #include <kms++/pixelformats.h>
4*f0687c8aSRaman Tenneti 
5*f0687c8aSRaman Tenneti using namespace std;
6*f0687c8aSRaman Tenneti 
7*f0687c8aSRaman Tenneti namespace kms
8*f0687c8aSRaman Tenneti {
9*f0687c8aSRaman Tenneti static const map<PixelFormat, PixelFormatInfo> format_info_array = {
10*f0687c8aSRaman Tenneti 	/* YUV packed */
11*f0687c8aSRaman Tenneti 	{ PixelFormat::UYVY, {
12*f0687c8aSRaman Tenneti 				     PixelColorType::YUV,
13*f0687c8aSRaman Tenneti 				     1,
14*f0687c8aSRaman Tenneti 				     { { 16, 2, 1 } },
15*f0687c8aSRaman Tenneti 			     } },
16*f0687c8aSRaman Tenneti 	{ PixelFormat::YUYV, {
17*f0687c8aSRaman Tenneti 				     PixelColorType::YUV,
18*f0687c8aSRaman Tenneti 				     1,
19*f0687c8aSRaman Tenneti 				     { { 16, 2, 1 } },
20*f0687c8aSRaman Tenneti 			     } },
21*f0687c8aSRaman Tenneti 	{ PixelFormat::YVYU, {
22*f0687c8aSRaman Tenneti 				     PixelColorType::YUV,
23*f0687c8aSRaman Tenneti 				     1,
24*f0687c8aSRaman Tenneti 				     { { 16, 2, 1 } },
25*f0687c8aSRaman Tenneti 			     } },
26*f0687c8aSRaman Tenneti 	{ PixelFormat::VYUY, {
27*f0687c8aSRaman Tenneti 				     PixelColorType::YUV,
28*f0687c8aSRaman Tenneti 				     1,
29*f0687c8aSRaman Tenneti 				     { { 16, 2, 1 } },
30*f0687c8aSRaman Tenneti 			     } },
31*f0687c8aSRaman Tenneti 	/* YUV semi-planar */
32*f0687c8aSRaman Tenneti 	{ PixelFormat::NV12, {
33*f0687c8aSRaman Tenneti 				     PixelColorType::YUV,
34*f0687c8aSRaman Tenneti 				     2,
35*f0687c8aSRaman Tenneti 				     { {
36*f0687c8aSRaman Tenneti 					       8,
37*f0687c8aSRaman Tenneti 					       1,
38*f0687c8aSRaman Tenneti 					       1,
39*f0687c8aSRaman Tenneti 				       },
40*f0687c8aSRaman Tenneti 				       { 8, 2, 2 } },
41*f0687c8aSRaman Tenneti 			     } },
42*f0687c8aSRaman Tenneti 	{ PixelFormat::NV21, {
43*f0687c8aSRaman Tenneti 				     PixelColorType::YUV,
44*f0687c8aSRaman Tenneti 				     2,
45*f0687c8aSRaman Tenneti 				     { {
46*f0687c8aSRaman Tenneti 					       8,
47*f0687c8aSRaman Tenneti 					       1,
48*f0687c8aSRaman Tenneti 					       1,
49*f0687c8aSRaman Tenneti 				       },
50*f0687c8aSRaman Tenneti 				       { 8, 2, 2 } },
51*f0687c8aSRaman Tenneti 			     } },
52*f0687c8aSRaman Tenneti 	{ PixelFormat::NV16, {
53*f0687c8aSRaman Tenneti 				     PixelColorType::YUV,
54*f0687c8aSRaman Tenneti 				     2,
55*f0687c8aSRaman Tenneti 				     { {
56*f0687c8aSRaman Tenneti 					       8,
57*f0687c8aSRaman Tenneti 					       1,
58*f0687c8aSRaman Tenneti 					       1,
59*f0687c8aSRaman Tenneti 				       },
60*f0687c8aSRaman Tenneti 				       { 8, 2, 1 } },
61*f0687c8aSRaman Tenneti 			     } },
62*f0687c8aSRaman Tenneti 	{ PixelFormat::NV61, {
63*f0687c8aSRaman Tenneti 				     PixelColorType::YUV,
64*f0687c8aSRaman Tenneti 				     2,
65*f0687c8aSRaman Tenneti 				     { {
66*f0687c8aSRaman Tenneti 					       8,
67*f0687c8aSRaman Tenneti 					       1,
68*f0687c8aSRaman Tenneti 					       1,
69*f0687c8aSRaman Tenneti 				       },
70*f0687c8aSRaman Tenneti 				       { 8, 2, 1 } },
71*f0687c8aSRaman Tenneti 			     } },
72*f0687c8aSRaman Tenneti 	/* YUV planar */
73*f0687c8aSRaman Tenneti 	{ PixelFormat::YUV420, {
74*f0687c8aSRaman Tenneti 				       PixelColorType::YUV,
75*f0687c8aSRaman Tenneti 				       3,
76*f0687c8aSRaman Tenneti 				       { {
77*f0687c8aSRaman Tenneti 						 8,
78*f0687c8aSRaman Tenneti 						 1,
79*f0687c8aSRaman Tenneti 						 1,
80*f0687c8aSRaman Tenneti 					 },
81*f0687c8aSRaman Tenneti 					 { 8, 2, 2 },
82*f0687c8aSRaman Tenneti 					 { 8, 2, 2 } },
83*f0687c8aSRaman Tenneti 			       } },
84*f0687c8aSRaman Tenneti 	{ PixelFormat::YVU420, {
85*f0687c8aSRaman Tenneti 				       PixelColorType::YUV,
86*f0687c8aSRaman Tenneti 				       3,
87*f0687c8aSRaman Tenneti 				       { {
88*f0687c8aSRaman Tenneti 						 8,
89*f0687c8aSRaman Tenneti 						 1,
90*f0687c8aSRaman Tenneti 						 1,
91*f0687c8aSRaman Tenneti 					 },
92*f0687c8aSRaman Tenneti 					 { 8, 2, 2 },
93*f0687c8aSRaman Tenneti 					 { 8, 2, 2 } },
94*f0687c8aSRaman Tenneti 			       } },
95*f0687c8aSRaman Tenneti 	{ PixelFormat::YUV422, {
96*f0687c8aSRaman Tenneti 				       PixelColorType::YUV,
97*f0687c8aSRaman Tenneti 				       3,
98*f0687c8aSRaman Tenneti 				       { {
99*f0687c8aSRaman Tenneti 						 8,
100*f0687c8aSRaman Tenneti 						 1,
101*f0687c8aSRaman Tenneti 						 1,
102*f0687c8aSRaman Tenneti 					 },
103*f0687c8aSRaman Tenneti 					 { 8, 2, 1 },
104*f0687c8aSRaman Tenneti 					 { 8, 2, 1 } },
105*f0687c8aSRaman Tenneti 			       } },
106*f0687c8aSRaman Tenneti 	{ PixelFormat::YVU422, {
107*f0687c8aSRaman Tenneti 				       PixelColorType::YUV,
108*f0687c8aSRaman Tenneti 				       3,
109*f0687c8aSRaman Tenneti 				       { {
110*f0687c8aSRaman Tenneti 						 8,
111*f0687c8aSRaman Tenneti 						 1,
112*f0687c8aSRaman Tenneti 						 1,
113*f0687c8aSRaman Tenneti 					 },
114*f0687c8aSRaman Tenneti 					 { 8, 2, 1 },
115*f0687c8aSRaman Tenneti 					 { 8, 2, 1 } },
116*f0687c8aSRaman Tenneti 			       } },
117*f0687c8aSRaman Tenneti 	{ PixelFormat::YUV444, {
118*f0687c8aSRaman Tenneti 				       PixelColorType::YUV,
119*f0687c8aSRaman Tenneti 				       3,
120*f0687c8aSRaman Tenneti 				       { {
121*f0687c8aSRaman Tenneti 						 8,
122*f0687c8aSRaman Tenneti 						 1,
123*f0687c8aSRaman Tenneti 						 1,
124*f0687c8aSRaman Tenneti 					 },
125*f0687c8aSRaman Tenneti 					 { 8, 1, 1 },
126*f0687c8aSRaman Tenneti 					 { 8, 1, 1 } },
127*f0687c8aSRaman Tenneti 			       } },
128*f0687c8aSRaman Tenneti 	{ PixelFormat::YVU444, {
129*f0687c8aSRaman Tenneti 				       PixelColorType::YUV,
130*f0687c8aSRaman Tenneti 				       3,
131*f0687c8aSRaman Tenneti 				       { {
132*f0687c8aSRaman Tenneti 						 8,
133*f0687c8aSRaman Tenneti 						 1,
134*f0687c8aSRaman Tenneti 						 1,
135*f0687c8aSRaman Tenneti 					 },
136*f0687c8aSRaman Tenneti 					 { 8, 1, 1 },
137*f0687c8aSRaman Tenneti 					 { 8, 1, 1 } },
138*f0687c8aSRaman Tenneti 			       } },
139*f0687c8aSRaman Tenneti 	/* RGB8 */
140*f0687c8aSRaman Tenneti 	{ PixelFormat::RGB332, {
141*f0687c8aSRaman Tenneti 				       PixelColorType::RGB,
142*f0687c8aSRaman Tenneti 				       1,
143*f0687c8aSRaman Tenneti 				       { { 8, 1, 1 } },
144*f0687c8aSRaman Tenneti 			       } },
145*f0687c8aSRaman Tenneti 	/* RGB16 */
146*f0687c8aSRaman Tenneti 	{ PixelFormat::RGB565, {
147*f0687c8aSRaman Tenneti 				       PixelColorType::RGB,
148*f0687c8aSRaman Tenneti 				       1,
149*f0687c8aSRaman Tenneti 				       { { 16, 1, 1 } },
150*f0687c8aSRaman Tenneti 			       } },
151*f0687c8aSRaman Tenneti 	{ PixelFormat::BGR565, {
152*f0687c8aSRaman Tenneti 				       PixelColorType::RGB,
153*f0687c8aSRaman Tenneti 				       1,
154*f0687c8aSRaman Tenneti 				       { { 16, 1, 1 } },
155*f0687c8aSRaman Tenneti 			       } },
156*f0687c8aSRaman Tenneti 	{ PixelFormat::XRGB4444, {
157*f0687c8aSRaman Tenneti 					 PixelColorType::RGB,
158*f0687c8aSRaman Tenneti 					 1,
159*f0687c8aSRaman Tenneti 					 { { 16, 1, 1 } },
160*f0687c8aSRaman Tenneti 				 } },
161*f0687c8aSRaman Tenneti 	{ PixelFormat::XRGB1555, {
162*f0687c8aSRaman Tenneti 					 PixelColorType::RGB,
163*f0687c8aSRaman Tenneti 					 1,
164*f0687c8aSRaman Tenneti 					 { { 16, 1, 1 } },
165*f0687c8aSRaman Tenneti 				 } },
166*f0687c8aSRaman Tenneti 	{ PixelFormat::ARGB4444, {
167*f0687c8aSRaman Tenneti 					 PixelColorType::RGB,
168*f0687c8aSRaman Tenneti 					 1,
169*f0687c8aSRaman Tenneti 					 { { 16, 1, 1 } },
170*f0687c8aSRaman Tenneti 				 } },
171*f0687c8aSRaman Tenneti 	{ PixelFormat::ARGB1555, {
172*f0687c8aSRaman Tenneti 					 PixelColorType::RGB,
173*f0687c8aSRaman Tenneti 					 1,
174*f0687c8aSRaman Tenneti 					 { { 16, 1, 1 } },
175*f0687c8aSRaman Tenneti 				 } },
176*f0687c8aSRaman Tenneti 	/* RGB24 */
177*f0687c8aSRaman Tenneti 	{ PixelFormat::RGB888, {
178*f0687c8aSRaman Tenneti 				       PixelColorType::RGB,
179*f0687c8aSRaman Tenneti 				       1,
180*f0687c8aSRaman Tenneti 				       { { 24, 1, 1 } },
181*f0687c8aSRaman Tenneti 			       } },
182*f0687c8aSRaman Tenneti 	{ PixelFormat::BGR888, {
183*f0687c8aSRaman Tenneti 				       PixelColorType::RGB,
184*f0687c8aSRaman Tenneti 				       1,
185*f0687c8aSRaman Tenneti 				       { { 24, 1, 1 } },
186*f0687c8aSRaman Tenneti 			       } },
187*f0687c8aSRaman Tenneti 	/* RGB32 */
188*f0687c8aSRaman Tenneti 	{ PixelFormat::XRGB8888, {
189*f0687c8aSRaman Tenneti 					 PixelColorType::RGB,
190*f0687c8aSRaman Tenneti 					 1,
191*f0687c8aSRaman Tenneti 					 { { 32, 1, 1 } },
192*f0687c8aSRaman Tenneti 				 } },
193*f0687c8aSRaman Tenneti 	{ PixelFormat::XBGR8888, {
194*f0687c8aSRaman Tenneti 					 PixelColorType::RGB,
195*f0687c8aSRaman Tenneti 					 1,
196*f0687c8aSRaman Tenneti 					 { { 32, 1, 1 } },
197*f0687c8aSRaman Tenneti 				 } },
198*f0687c8aSRaman Tenneti 	{ PixelFormat::RGBX8888, {
199*f0687c8aSRaman Tenneti 					 PixelColorType::RGB,
200*f0687c8aSRaman Tenneti 					 1,
201*f0687c8aSRaman Tenneti 					 { { 32, 1, 1 } },
202*f0687c8aSRaman Tenneti 				 } },
203*f0687c8aSRaman Tenneti 	{ PixelFormat::BGRX8888, {
204*f0687c8aSRaman Tenneti 					 PixelColorType::RGB,
205*f0687c8aSRaman Tenneti 					 1,
206*f0687c8aSRaman Tenneti 					 { { 32, 1, 1 } },
207*f0687c8aSRaman Tenneti 				 } },
208*f0687c8aSRaman Tenneti 
209*f0687c8aSRaman Tenneti 	{ PixelFormat::ARGB8888, {
210*f0687c8aSRaman Tenneti 					 PixelColorType::RGB,
211*f0687c8aSRaman Tenneti 					 1,
212*f0687c8aSRaman Tenneti 					 { { 32, 1, 1 } },
213*f0687c8aSRaman Tenneti 				 } },
214*f0687c8aSRaman Tenneti 	{ PixelFormat::ABGR8888, {
215*f0687c8aSRaman Tenneti 					 PixelColorType::RGB,
216*f0687c8aSRaman Tenneti 					 1,
217*f0687c8aSRaman Tenneti 					 { { 32, 1, 1 } },
218*f0687c8aSRaman Tenneti 				 } },
219*f0687c8aSRaman Tenneti 	{ PixelFormat::RGBA8888, {
220*f0687c8aSRaman Tenneti 					 PixelColorType::RGB,
221*f0687c8aSRaman Tenneti 					 1,
222*f0687c8aSRaman Tenneti 					 { { 32, 1, 1 } },
223*f0687c8aSRaman Tenneti 				 } },
224*f0687c8aSRaman Tenneti 	{ PixelFormat::BGRA8888, {
225*f0687c8aSRaman Tenneti 					 PixelColorType::RGB,
226*f0687c8aSRaman Tenneti 					 1,
227*f0687c8aSRaman Tenneti 					 { { 32, 1, 1 } },
228*f0687c8aSRaman Tenneti 				 } },
229*f0687c8aSRaman Tenneti 
230*f0687c8aSRaman Tenneti 	{ PixelFormat::XRGB2101010, {
231*f0687c8aSRaman Tenneti 					    PixelColorType::RGB,
232*f0687c8aSRaman Tenneti 					    1,
233*f0687c8aSRaman Tenneti 					    { { 32, 1, 1 } },
234*f0687c8aSRaman Tenneti 				    } },
235*f0687c8aSRaman Tenneti 	{ PixelFormat::XBGR2101010, {
236*f0687c8aSRaman Tenneti 					    PixelColorType::RGB,
237*f0687c8aSRaman Tenneti 					    1,
238*f0687c8aSRaman Tenneti 					    { { 32, 1, 1 } },
239*f0687c8aSRaman Tenneti 				    } },
240*f0687c8aSRaman Tenneti 	{ PixelFormat::RGBX1010102, {
241*f0687c8aSRaman Tenneti 					    PixelColorType::RGB,
242*f0687c8aSRaman Tenneti 					    1,
243*f0687c8aSRaman Tenneti 					    { { 32, 1, 1 } },
244*f0687c8aSRaman Tenneti 				    } },
245*f0687c8aSRaman Tenneti 	{ PixelFormat::BGRX1010102, {
246*f0687c8aSRaman Tenneti 					    PixelColorType::RGB,
247*f0687c8aSRaman Tenneti 					    1,
248*f0687c8aSRaman Tenneti 					    { { 32, 1, 1 } },
249*f0687c8aSRaman Tenneti 				    } },
250*f0687c8aSRaman Tenneti 
251*f0687c8aSRaman Tenneti 	{ PixelFormat::ARGB2101010, {
252*f0687c8aSRaman Tenneti 					    PixelColorType::RGB,
253*f0687c8aSRaman Tenneti 					    1,
254*f0687c8aSRaman Tenneti 					    { { 32, 1, 1 } },
255*f0687c8aSRaman Tenneti 				    } },
256*f0687c8aSRaman Tenneti 	{ PixelFormat::ABGR2101010, {
257*f0687c8aSRaman Tenneti 					    PixelColorType::RGB,
258*f0687c8aSRaman Tenneti 					    1,
259*f0687c8aSRaman Tenneti 					    { { 32, 1, 1 } },
260*f0687c8aSRaman Tenneti 				    } },
261*f0687c8aSRaman Tenneti 	{ PixelFormat::RGBA1010102, {
262*f0687c8aSRaman Tenneti 					    PixelColorType::RGB,
263*f0687c8aSRaman Tenneti 					    1,
264*f0687c8aSRaman Tenneti 					    { { 32, 1, 1 } },
265*f0687c8aSRaman Tenneti 				    } },
266*f0687c8aSRaman Tenneti 	{ PixelFormat::BGRA1010102, {
267*f0687c8aSRaman Tenneti 					    PixelColorType::RGB,
268*f0687c8aSRaman Tenneti 					    1,
269*f0687c8aSRaman Tenneti 					    { { 32, 1, 1 } },
270*f0687c8aSRaman Tenneti 				    } },
271*f0687c8aSRaman Tenneti };
272*f0687c8aSRaman Tenneti 
get_pixel_format_info(PixelFormat format)273*f0687c8aSRaman Tenneti const struct PixelFormatInfo& get_pixel_format_info(PixelFormat format)
274*f0687c8aSRaman Tenneti {
275*f0687c8aSRaman Tenneti 	if (!format_info_array.count(format))
276*f0687c8aSRaman Tenneti 		throw invalid_argument("get_pixel_format_info: Unsupported pixelformat");
277*f0687c8aSRaman Tenneti 
278*f0687c8aSRaman Tenneti 	return format_info_array.at(format);
279*f0687c8aSRaman Tenneti }
280*f0687c8aSRaman Tenneti 
281*f0687c8aSRaman Tenneti } // namespace kms
282