1 /*
2 * Copyright@ Samsung Electronics Co. LTD
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 /*
18 * file exynos5_format_v4l2.c
19 * author Sangwoo, Park(sw5771.park@samsung.com)
20 * date 2011/06/02
21 *
22 * Revision History:
23 * - 2010/06/03 : Sangwoo, Park(sw5771.park@samsung.com)
24 * Initial version
25 *
26 * - 2011/12/07 : Hyeonmyeong Choi( hyeon.choi@samsung.com)
27 * Add V4L2_PIX_FMT_YVU420M
28 *
29 * - 2012/03/06 : shinwon lee(shinwon.lee@samsung.com)
30 * Merge to libexynosutils
31 *
32 */
33
34 #ifndef __EXYNOS5_FORMAT_V4L2_H__
35 #define __EXYNOS5_FORMAT_V4L2_H__
36
37 //---------------------------------------------------------//
38 // Include
39 //---------------------------------------------------------//
40 #include <hardware/hardware.h>
41 #include "exynos_format.h"
42 #include "s5p_fimc_v4l2.h"
43 #include <utils/Log.h>
44 #include "videodev2.h"
45 #include "videodev2_exynos_media.h"
46
HAL_PIXEL_FORMAT_2_V4L2_PIX(int hal_pixel_format)47 int HAL_PIXEL_FORMAT_2_V4L2_PIX(
48 int hal_pixel_format)
49 {
50 int v4l2_pixel_format = -1;
51
52 switch (hal_pixel_format) {
53 case HAL_PIXEL_FORMAT_RGBA_8888:
54 case HAL_PIXEL_FORMAT_RGBX_8888:
55 case HAL_PIXEL_FORMAT_CUSTOM_ARGB_8888:
56 v4l2_pixel_format = V4L2_PIX_FMT_RGB32;
57 break;
58
59 case HAL_PIXEL_FORMAT_RGB_888:
60 v4l2_pixel_format = V4L2_PIX_FMT_RGB24;
61 break;
62
63 case HAL_PIXEL_FORMAT_RGB_565:
64 v4l2_pixel_format = V4L2_PIX_FMT_RGB565;
65 break;
66
67 case HAL_PIXEL_FORMAT_BGRA_8888:
68 v4l2_pixel_format = V4L2_PIX_FMT_BGR32;
69 break;
70
71 case HAL_PIXEL_FORMAT_RGBA_5551:
72 v4l2_pixel_format = V4L2_PIX_FMT_RGB555X;
73 break;
74
75 case HAL_PIXEL_FORMAT_RGBA_4444:
76 v4l2_pixel_format = V4L2_PIX_FMT_RGB444;
77 break;
78
79 case HAL_PIXEL_FORMAT_EXYNOS_YV12:
80 v4l2_pixel_format = V4L2_PIX_FMT_YVU420M;
81 break;
82
83 case HAL_PIXEL_FORMAT_YCbCr_420_P:
84 v4l2_pixel_format = V4L2_PIX_FMT_YUV420M;
85 break;
86
87 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
88 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
89 v4l2_pixel_format = V4L2_PIX_FMT_NV61;
90 break;
91
92 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
93 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
94 v4l2_pixel_format = V4L2_PIX_FMT_NV12M;
95 break;
96
97 case HAL_PIXEL_FORMAT_YCbCr_422_I:
98 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
99 v4l2_pixel_format = V4L2_PIX_FMT_YUYV;
100 break;
101
102 case HAL_PIXEL_FORMAT_YCbCr_422_P:
103 v4l2_pixel_format = V4L2_PIX_FMT_YUV422P;
104 break;
105
106 case HAL_PIXEL_FORMAT_CbYCrY_422_I:
107 case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
108 v4l2_pixel_format = V4L2_PIX_FMT_UYVY;
109 break;
110
111 case HAL_PIXEL_FORMAT_YCrCb_422_SP:
112 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
113 v4l2_pixel_format = V4L2_PIX_FMT_NV16;
114 break;
115
116 case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
117 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
118 v4l2_pixel_format = V4L2_PIX_FMT_NV21M;
119 break;
120
121 case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
122 v4l2_pixel_format = V4L2_PIX_FMT_NV12MT_16X16;
123 break;
124
125 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
126 v4l2_pixel_format = V4L2_PIX_FMT_NV12MT_16X16;
127 break;
128
129 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
130 v4l2_pixel_format = V4L2_PIX_FMT_YVYU;
131 break;
132
133 case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
134 v4l2_pixel_format = V4L2_PIX_FMT_VYUY;
135 break;
136
137 default:
138 ALOGE("%s::unmatched HAL_PIXEL_FORMAT color_space(0x%x)\n",
139 __func__, hal_pixel_format);
140 break;
141 }
142
143 return v4l2_pixel_format;
144 }
145
V4L2_PIX_2_HAL_PIXEL_FORMAT(int v4l2_pixel_format)146 int V4L2_PIX_2_HAL_PIXEL_FORMAT(
147 int v4l2_pixel_format)
148 {
149 int hal_pixel_format = -1;
150
151 switch (v4l2_pixel_format) {
152 case V4L2_PIX_FMT_RGB32:
153 hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_8888;
154 break;
155
156 case V4L2_PIX_FMT_RGB24:
157 hal_pixel_format = HAL_PIXEL_FORMAT_RGB_888;
158 break;
159
160 case V4L2_PIX_FMT_RGB565:
161 hal_pixel_format = HAL_PIXEL_FORMAT_RGB_565;
162 break;
163
164 case V4L2_PIX_FMT_BGR32:
165 hal_pixel_format = HAL_PIXEL_FORMAT_BGRA_8888;
166 break;
167
168 case V4L2_PIX_FMT_RGB555X:
169 hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_5551;
170 break;
171
172 case V4L2_PIX_FMT_RGB444:
173 hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_4444;
174 break;
175
176 case V4L2_PIX_FMT_YUV420:
177 case V4L2_PIX_FMT_YUV420M:
178 hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_P;
179 break;
180
181 case V4L2_PIX_FMT_YVU420:
182 case V4L2_PIX_FMT_YVU420M:
183 hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YV12;
184 break;
185
186 case V4L2_PIX_FMT_NV16:
187 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP;
188 break;
189
190 case V4L2_PIX_FMT_NV12:
191 hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_SP;
192 break;
193
194 case V4L2_PIX_FMT_NV12M:
195 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP;
196 break;
197
198 case V4L2_PIX_FMT_YUYV:
199 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I;
200 break;
201
202 case V4L2_PIX_FMT_YUV422P:
203 hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_422_P;
204 break;
205
206 case V4L2_PIX_FMT_UYVY:
207 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I;
208 break;
209
210 case V4L2_PIX_FMT_NV21:
211 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP;
212 break;
213 case V4L2_PIX_FMT_NV12MT_16X16:
214
215 hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED;
216 break;
217
218 case V4L2_PIX_FMT_NV61:
219 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP;
220 break;
221
222 case V4L2_PIX_FMT_YVYU:
223 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I;
224 break;
225
226 case V4L2_PIX_FMT_VYUY:
227 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I;
228 break;
229
230 default:
231 ALOGE("%s::unmatched V4L2_PIX color_space(%d)\n",
232 __func__, v4l2_pixel_format);
233 break;
234 }
235
236 return hal_pixel_format;
237 }
238
NUM_PLANES(int hal_pixel_format)239 int NUM_PLANES(int hal_pixel_format)
240 {
241 switch(hal_pixel_format) {
242 case HAL_PIXEL_FORMAT_EXYNOS_YV12:
243 case HAL_PIXEL_FORMAT_YCbCr_420_P:
244 return 3;
245 case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
246 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
247 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
248 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
249 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
250 return 2;
251 break;
252 case HAL_PIXEL_FORMAT_YCbCr_420_I:
253 case HAL_PIXEL_FORMAT_CbYCrY_420_I:
254 return 1;
255 default:
256 return 1;
257 }
258 }
259
FRAME_SIZE(int hal_pixel_format,int width,int height)260 unsigned int FRAME_SIZE(
261 int hal_pixel_format,
262 int width,
263 int height)
264 {
265 unsigned int frame_size = 0;
266 unsigned int size = 0;
267
268 switch (hal_pixel_format) {
269 // 16bpp
270 case HAL_PIXEL_FORMAT_RGB_565:
271 case HAL_PIXEL_FORMAT_RGBA_5551:
272 case HAL_PIXEL_FORMAT_RGBA_4444:
273 frame_size = GET_16BPP_FRAME_SIZE(width, height);
274 break;
275
276 // 24bpp
277 case HAL_PIXEL_FORMAT_RGB_888:
278 frame_size = GET_24BPP_FRAME_SIZE(width, height);
279 break;
280
281 // 32bpp
282 case HAL_PIXEL_FORMAT_RGBA_8888:
283 case HAL_PIXEL_FORMAT_BGRA_8888:
284 case HAL_PIXEL_FORMAT_RGBX_8888:
285 case HAL_PIXEL_FORMAT_CUSTOM_ARGB_8888:
286 frame_size = GET_32BPP_FRAME_SIZE(width, height);
287 break;
288
289 // 12bpp
290 case HAL_PIXEL_FORMAT_EXYNOS_YV12:
291 case HAL_PIXEL_FORMAT_YCbCr_420_P:
292 case HAL_PIXEL_FORMAT_YCbCr_420_I:
293 case HAL_PIXEL_FORMAT_CbYCrY_420_I:
294 size = ALIGN(width, 16) * ALIGN(height, 16);
295 frame_size = size + 2 * ALIGN(width >> 1, 8) * ALIGN(height >> 1, 8);
296 break;
297
298 case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
299 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
300 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
301 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
302 size = ALIGN(ALIGN(width, 16) * ALIGN(height, 16), 2048);
303 frame_size = size + ALIGN(ALIGN(width, 16) * ALIGN(height >> 1, 8), 2048);
304 break;
305
306 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
307 frame_size = ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height))
308 + ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height >> 1));
309 break;
310
311 // 16bpp
312 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
313 case HAL_PIXEL_FORMAT_YCbCr_422_I:
314 case HAL_PIXEL_FORMAT_YCbCr_422_P:
315 case HAL_PIXEL_FORMAT_CbYCrY_422_I:
316 case HAL_PIXEL_FORMAT_YCrCb_422_SP:
317 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
318 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
319 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
320 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
321 case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
322 case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
323 frame_size = GET_16BPP_FRAME_SIZE(width, height);
324 break;
325
326 default:
327 ALOGD("%s::no matching source colorformat(0x%x), width(%d), h(%d) fail\n",
328 __func__, hal_pixel_format, width, height);
329 break;
330 }
331
332 return frame_size;
333 }
334
PLANAR_FRAME_SIZE(int hal_pixel_format,int width,int height,unsigned int * luma_size,unsigned int * chroma_size)335 int PLANAR_FRAME_SIZE(int hal_pixel_format, int width, int height,
336 unsigned int *luma_size, unsigned int *chroma_size)
337 {
338 unsigned int size = 0;
339
340 switch(hal_pixel_format) {
341 case HAL_PIXEL_FORMAT_EXYNOS_YV12:
342 case HAL_PIXEL_FORMAT_YCbCr_420_P:
343 size = width * height;
344 *luma_size = size;
345 *chroma_size = size >> 2;
346 case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
347 case HAL_PIXEL_FORMAT_YCbCr_420_I:
348 case HAL_PIXEL_FORMAT_CbYCrY_420_I:
349 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
350 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
351 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
352 size = width * height;
353 *luma_size = size;
354 *chroma_size = (size >> 2) << 1;
355 break;
356 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
357 *luma_size = ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height));
358 *chroma_size = ALIGN_TO_8KB(ALIGN_TO_128B(width) *
359 ALIGN_TO_32B(height >> 1));
360 break;
361 default:
362 *luma_size = FRAME_SIZE(hal_pixel_format, width, height);
363 }
364 return 0;
365 }
366
367
V4L2_PIX_2_YUV_INFO(unsigned int v4l2_pixel_format,unsigned int * bpp,unsigned int * planes)368 int V4L2_PIX_2_YUV_INFO(unsigned int v4l2_pixel_format, unsigned int * bpp, unsigned int * planes)
369 {
370 switch (v4l2_pixel_format) {
371 case V4L2_PIX_FMT_NV12:
372 *bpp = 12;
373 *planes = 1;
374 break;
375 case V4L2_PIX_FMT_NV21:
376 case V4L2_PIX_FMT_NV21X:
377 case V4L2_PIX_FMT_NV12M:
378 case V4L2_PIX_FMT_NV21M:
379 case V4L2_PIX_FMT_NV12MT_16X16:
380 *bpp = 12;
381 *planes = 2;
382 break;
383 case V4L2_PIX_FMT_YUV420:
384 case V4L2_PIX_FMT_YUV420M:
385 case V4L2_PIX_FMT_YVU420M:
386 *bpp = 12;
387 *planes = 3;
388 break;
389 case V4L2_PIX_FMT_YUYV:
390 case V4L2_PIX_FMT_YVYU:
391 case V4L2_PIX_FMT_UYVY:
392 case V4L2_PIX_FMT_VYUY:
393 *bpp = 16;
394 *planes = 1;
395 break;
396 case V4L2_PIX_FMT_NV16:
397 case V4L2_PIX_FMT_NV61:
398 case V4L2_PIX_FMT_NV16X:
399 case V4L2_PIX_FMT_NV61X:
400 *bpp = 16;
401 *planes = 2;
402 break;
403 case V4L2_PIX_FMT_YUV422P:
404 *bpp = 16;
405 *planes = 3;
406 break;
407 default:
408 return -1;
409 break;
410 }
411
412 return 0;
413 }
414
get_yuv_bpp(unsigned int v4l2_pixel_format)415 unsigned int get_yuv_bpp(unsigned int v4l2_pixel_format)
416 {
417 unsigned int bpp, planes;
418
419 if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0)
420 bpp = -1;
421
422 return bpp;
423 }
424
get_yuv_planes(unsigned int v4l2_pixel_format)425 unsigned int get_yuv_planes(unsigned int v4l2_pixel_format)
426 {
427 unsigned int bpp, planes;
428
429 if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0)
430 planes = -1;
431
432 return planes;
433 }
434 #endif
435