1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (C) 2020 Jernej Skrabec <jernej.skrabec@siol.net> */
3
4 #include "sun8i-formats.h"
5 #include "sun8i-rotate.h"
6
7 /*
8 * Formats not included in array:
9 * ROTATE_FORMAT_BGR565
10 * ROTATE_FORMAT_VYUV
11 */
12
13 static const struct rotate_format rotate_formats[] = {
14 {
15 .fourcc = V4L2_PIX_FMT_ARGB32,
16 .hw_format = ROTATE_FORMAT_ARGB32,
17 .planes = 1,
18 .bpp = { 4, 0, 0 },
19 .hsub = 1,
20 .vsub = 1,
21 .flags = ROTATE_FLAG_OUTPUT
22 }, {
23 .fourcc = V4L2_PIX_FMT_ABGR32,
24 .hw_format = ROTATE_FORMAT_ABGR32,
25 .planes = 1,
26 .bpp = { 4, 0, 0 },
27 .hsub = 1,
28 .vsub = 1,
29 .flags = ROTATE_FLAG_OUTPUT
30 }, {
31 .fourcc = V4L2_PIX_FMT_RGBA32,
32 .hw_format = ROTATE_FORMAT_RGBA32,
33 .planes = 1,
34 .bpp = { 4, 0, 0 },
35 .hsub = 1,
36 .vsub = 1,
37 .flags = ROTATE_FLAG_OUTPUT
38 }, {
39 .fourcc = V4L2_PIX_FMT_BGRA32,
40 .hw_format = ROTATE_FORMAT_BGRA32,
41 .planes = 1,
42 .bpp = { 4, 0, 0 },
43 .hsub = 1,
44 .vsub = 1,
45 .flags = ROTATE_FLAG_OUTPUT
46 }, {
47 .fourcc = V4L2_PIX_FMT_XRGB32,
48 .hw_format = ROTATE_FORMAT_XRGB32,
49 .planes = 1,
50 .bpp = { 4, 0, 0 },
51 .hsub = 1,
52 .vsub = 1,
53 .flags = ROTATE_FLAG_OUTPUT
54 }, {
55 .fourcc = V4L2_PIX_FMT_XBGR32,
56 .hw_format = ROTATE_FORMAT_XBGR32,
57 .planes = 1,
58 .bpp = { 4, 0, 0 },
59 .hsub = 1,
60 .vsub = 1,
61 .flags = ROTATE_FLAG_OUTPUT
62 }, {
63 .fourcc = V4L2_PIX_FMT_RGB32,
64 .hw_format = ROTATE_FORMAT_RGBX32,
65 .planes = 1,
66 .bpp = { 4, 0, 0 },
67 .hsub = 1,
68 .vsub = 1,
69 .flags = ROTATE_FLAG_OUTPUT
70 }, {
71 .fourcc = V4L2_PIX_FMT_BGR32,
72 .hw_format = ROTATE_FORMAT_BGRX32,
73 .planes = 1,
74 .bpp = { 4, 0, 0 },
75 .hsub = 1,
76 .vsub = 1,
77 .flags = ROTATE_FLAG_OUTPUT
78 }, {
79 .fourcc = V4L2_PIX_FMT_RGB24,
80 .hw_format = ROTATE_FORMAT_RGB24,
81 .planes = 1,
82 .bpp = { 3, 0, 0 },
83 .hsub = 1,
84 .vsub = 1,
85 .flags = ROTATE_FLAG_OUTPUT
86 }, {
87 .fourcc = V4L2_PIX_FMT_BGR24,
88 .hw_format = ROTATE_FORMAT_BGR24,
89 .planes = 1,
90 .bpp = { 3, 0, 0 },
91 .hsub = 1,
92 .vsub = 1,
93 .flags = ROTATE_FLAG_OUTPUT
94 }, {
95 .fourcc = V4L2_PIX_FMT_RGB565,
96 .hw_format = ROTATE_FORMAT_RGB565,
97 .planes = 1,
98 .bpp = { 2, 0, 0 },
99 .hsub = 1,
100 .vsub = 1,
101 .flags = ROTATE_FLAG_OUTPUT
102 }, {
103 .fourcc = V4L2_PIX_FMT_ARGB444,
104 .hw_format = ROTATE_FORMAT_ARGB4444,
105 .planes = 1,
106 .bpp = { 2, 0, 0 },
107 .hsub = 1,
108 .vsub = 1,
109 .flags = ROTATE_FLAG_OUTPUT
110 }, {
111 .fourcc = V4L2_PIX_FMT_ABGR444,
112 .hw_format = ROTATE_FORMAT_ABGR4444,
113 .planes = 1,
114 .bpp = { 2, 0, 0 },
115 .hsub = 1,
116 .vsub = 1,
117 .flags = ROTATE_FLAG_OUTPUT
118 }, {
119 .fourcc = V4L2_PIX_FMT_RGBA444,
120 .hw_format = ROTATE_FORMAT_RGBA4444,
121 .planes = 1,
122 .bpp = { 2, 0, 0 },
123 .hsub = 1,
124 .vsub = 1,
125 .flags = ROTATE_FLAG_OUTPUT
126 }, {
127 .fourcc = V4L2_PIX_FMT_BGRA444,
128 .hw_format = ROTATE_FORMAT_BGRA4444,
129 .planes = 1,
130 .bpp = { 2, 0, 0 },
131 .hsub = 1,
132 .vsub = 1,
133 .flags = ROTATE_FLAG_OUTPUT
134 }, {
135 .fourcc = V4L2_PIX_FMT_ARGB555,
136 .hw_format = ROTATE_FORMAT_ARGB1555,
137 .planes = 1,
138 .bpp = { 2, 0, 0 },
139 .hsub = 1,
140 .vsub = 1,
141 .flags = ROTATE_FLAG_OUTPUT
142 }, {
143 .fourcc = V4L2_PIX_FMT_ABGR555,
144 .hw_format = ROTATE_FORMAT_ABGR1555,
145 .planes = 1,
146 .bpp = { 2, 0, 0 },
147 .hsub = 1,
148 .vsub = 1,
149 .flags = ROTATE_FLAG_OUTPUT
150 }, {
151 .fourcc = V4L2_PIX_FMT_RGBA555,
152 .hw_format = ROTATE_FORMAT_RGBA5551,
153 .planes = 1,
154 .bpp = { 2, 0, 0 },
155 .hsub = 1,
156 .vsub = 1,
157 .flags = ROTATE_FLAG_OUTPUT
158 }, {
159 .fourcc = V4L2_PIX_FMT_BGRA555,
160 .hw_format = ROTATE_FORMAT_BGRA5551,
161 .planes = 1,
162 .bpp = { 2, 0, 0 },
163 .hsub = 1,
164 .vsub = 1,
165 .flags = ROTATE_FLAG_OUTPUT
166 }, {
167 .fourcc = V4L2_PIX_FMT_YVYU,
168 .hw_format = ROTATE_FORMAT_YVYU,
169 .planes = 1,
170 .bpp = { 2, 0, 0 },
171 .hsub = 2,
172 .vsub = 1,
173 .flags = ROTATE_FLAG_YUV
174 }, {
175 .fourcc = V4L2_PIX_FMT_UYVY,
176 .hw_format = ROTATE_FORMAT_UYVY,
177 .planes = 1,
178 .bpp = { 2, 0, 0 },
179 .hsub = 2,
180 .vsub = 1,
181 .flags = ROTATE_FLAG_YUV
182 }, {
183 .fourcc = V4L2_PIX_FMT_YUYV,
184 .hw_format = ROTATE_FORMAT_YUYV,
185 .planes = 1,
186 .bpp = { 2, 0, 0 },
187 .hsub = 2,
188 .vsub = 1,
189 .flags = ROTATE_FLAG_YUV
190 }, {
191 .fourcc = V4L2_PIX_FMT_NV61,
192 .hw_format = ROTATE_FORMAT_NV61,
193 .planes = 2,
194 .bpp = { 1, 2, 0 },
195 .hsub = 2,
196 .vsub = 1,
197 .flags = ROTATE_FLAG_YUV
198 }, {
199 .fourcc = V4L2_PIX_FMT_NV16,
200 .hw_format = ROTATE_FORMAT_NV16,
201 .planes = 2,
202 .bpp = { 1, 2, 0 },
203 .hsub = 2,
204 .vsub = 1,
205 .flags = ROTATE_FLAG_YUV
206 }, {
207 .fourcc = V4L2_PIX_FMT_YUV422P,
208 .hw_format = ROTATE_FORMAT_YUV422P,
209 .planes = 3,
210 .bpp = { 1, 1, 1 },
211 .hsub = 2,
212 .vsub = 1,
213 .flags = ROTATE_FLAG_YUV
214 }, {
215 .fourcc = V4L2_PIX_FMT_NV21,
216 .hw_format = ROTATE_FORMAT_NV21,
217 .planes = 2,
218 .bpp = { 1, 2, 0 },
219 .hsub = 2,
220 .vsub = 2,
221 .flags = ROTATE_FLAG_YUV
222 }, {
223 .fourcc = V4L2_PIX_FMT_NV12,
224 .hw_format = ROTATE_FORMAT_NV12,
225 .planes = 2,
226 .bpp = { 1, 2, 0 },
227 .hsub = 2,
228 .vsub = 2,
229 .flags = ROTATE_FLAG_YUV
230 }, {
231 .fourcc = V4L2_PIX_FMT_YUV420,
232 .hw_format = ROTATE_FORMAT_YUV420P,
233 .planes = 3,
234 .bpp = { 1, 1, 1 },
235 .hsub = 2,
236 .vsub = 2,
237 .flags = ROTATE_FLAG_YUV | ROTATE_FLAG_OUTPUT
238 },
239 };
240
rotate_find_format(u32 pixelformat)241 const struct rotate_format *rotate_find_format(u32 pixelformat)
242 {
243 unsigned int i;
244
245 for (i = 0; i < ARRAY_SIZE(rotate_formats); i++)
246 if (rotate_formats[i].fourcc == pixelformat)
247 return &rotate_formats[i];
248
249 return NULL;
250 }
251
rotate_enum_fmt(struct v4l2_fmtdesc * f,bool dst)252 int rotate_enum_fmt(struct v4l2_fmtdesc *f, bool dst)
253 {
254 int i, index;
255
256 index = 0;
257
258 for (i = 0; i < ARRAY_SIZE(rotate_formats); i++) {
259 /* not all formats can be used for capture buffers */
260 if (dst && !(rotate_formats[i].flags & ROTATE_FLAG_OUTPUT))
261 continue;
262
263 if (index == f->index) {
264 f->pixelformat = rotate_formats[i].fourcc;
265
266 return 0;
267 }
268
269 index++;
270 }
271
272 return -EINVAL;
273 }
274