Commit | Line | Data |
---|---|---|
5763fb39 T |
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> | |
5763fb39 T |
44 | |
45 | int HAL_PIXEL_FORMAT_2_V4L2_PIX( | |
46 | int hal_pixel_format) | |
47 | { | |
48 | int v4l2_pixel_format = -1; | |
49 | ||
50 | switch (hal_pixel_format) { | |
51 | case HAL_PIXEL_FORMAT_RGBA_8888: | |
52 | case HAL_PIXEL_FORMAT_RGBX_8888: | |
53 | v4l2_pixel_format = V4L2_PIX_FMT_RGB32; | |
54 | break; | |
55 | ||
56 | case HAL_PIXEL_FORMAT_RGB_888: | |
57 | v4l2_pixel_format = V4L2_PIX_FMT_RGB24; | |
58 | break; | |
59 | ||
60 | case HAL_PIXEL_FORMAT_RGB_565: | |
61 | v4l2_pixel_format = V4L2_PIX_FMT_RGB565; | |
62 | break; | |
63 | ||
64 | case HAL_PIXEL_FORMAT_BGRA_8888: | |
65 | v4l2_pixel_format = V4L2_PIX_FMT_BGR32; | |
66 | break; | |
67 | ||
68 | case HAL_PIXEL_FORMAT_EXYNOS_YV12_M: | |
69 | v4l2_pixel_format = V4L2_PIX_FMT_YVU420M; | |
70 | break; | |
71 | ||
72 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_P_M: | |
73 | v4l2_pixel_format = V4L2_PIX_FMT_YUV420M; | |
74 | break; | |
75 | ||
76 | case HAL_PIXEL_FORMAT_YV12: | |
77 | v4l2_pixel_format = V4L2_PIX_FMT_YVU420; | |
78 | break; | |
79 | ||
80 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_P: | |
81 | v4l2_pixel_format = V4L2_PIX_FMT_YUV420; | |
82 | break; | |
1429cf3c | 83 | #ifdef V4L2_PIX_FMT_YUV420N |
5763fb39 T |
84 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_PN: |
85 | v4l2_pixel_format = V4L2_PIX_FMT_YUV420N; | |
86 | break; | |
1429cf3c | 87 | #endif |
5763fb39 T |
88 | case HAL_PIXEL_FORMAT_YCbCr_422_SP: |
89 | v4l2_pixel_format = V4L2_PIX_FMT_NV16; | |
90 | break; | |
91 | ||
92 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP: | |
93 | v4l2_pixel_format = V4L2_PIX_FMT_NV12; | |
94 | break; | |
1429cf3c | 95 | #ifdef V4L2_PIX_FMT_NV12N |
5763fb39 T |
96 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN: |
97 | v4l2_pixel_format = V4L2_PIX_FMT_NV12N; | |
98 | break; | |
1429cf3c | 99 | #endif |
5763fb39 T |
100 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M: |
101 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_PRIV: | |
102 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_S10B: | |
103 | v4l2_pixel_format = V4L2_PIX_FMT_NV12M; | |
104 | break; | |
105 | ||
360b3997 | 106 | #ifdef V4L2_PIX_FMT_NV12N_10B |
5763fb39 T |
107 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_S10B: |
108 | v4l2_pixel_format = V4L2_PIX_FMT_NV12N_10B; | |
109 | break; | |
360b3997 | 110 | #endif |
5763fb39 T |
111 | |
112 | case HAL_PIXEL_FORMAT_YCbCr_422_I: | |
113 | v4l2_pixel_format = V4L2_PIX_FMT_YUYV; | |
114 | break; | |
115 | ||
116 | case HAL_PIXEL_FORMAT_EXYNOS_CbYCrY_422_I: | |
117 | v4l2_pixel_format = V4L2_PIX_FMT_UYVY; | |
118 | break; | |
119 | ||
120 | case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_422_SP: | |
121 | v4l2_pixel_format = V4L2_PIX_FMT_NV61; | |
122 | break; | |
123 | ||
124 | case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M: | |
125 | case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M_FULL: | |
126 | v4l2_pixel_format = V4L2_PIX_FMT_NV21M; | |
127 | break; | |
128 | ||
129 | case HAL_PIXEL_FORMAT_YCrCb_420_SP: | |
130 | v4l2_pixel_format = V4L2_PIX_FMT_NV21; | |
131 | break; | |
132 | ||
133 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_TILED: | |
134 | #ifdef USES_FIMC | |
135 | v4l2_pixel_format = V4L2_PIX_FMT_NV12MT; | |
136 | #else | |
137 | v4l2_pixel_format = V4L2_PIX_FMT_NV12MT_16X16; | |
138 | #endif | |
139 | break; | |
1429cf3c | 140 | #ifdef V4L2_PIX_FMT_NV12NT |
5763fb39 T |
141 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_TILED: |
142 | v4l2_pixel_format = V4L2_PIX_FMT_NV12NT; | |
143 | break; | |
1429cf3c | 144 | #endif |
5763fb39 T |
145 | case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_422_I: |
146 | v4l2_pixel_format = V4L2_PIX_FMT_YVYU; | |
147 | break; | |
148 | ||
149 | case HAL_PIXEL_FORMAT_EXYNOS_CrYCbY_422_I: | |
150 | v4l2_pixel_format = V4L2_PIX_FMT_VYUY; | |
151 | break; | |
152 | ||
153 | default: | |
154 | ALOGE("%s::unmatched HAL_PIXEL_FORMAT color_space(0x%x)\n", | |
155 | __func__, hal_pixel_format); | |
156 | break; | |
157 | } | |
158 | ||
159 | return v4l2_pixel_format; | |
160 | } | |
161 | ||
162 | int V4L2_PIX_2_HAL_PIXEL_FORMAT( | |
163 | int v4l2_pixel_format) | |
164 | { | |
165 | int hal_pixel_format = -1; | |
166 | ||
167 | switch (v4l2_pixel_format) { | |
168 | case V4L2_PIX_FMT_RGB32: | |
169 | hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_8888; | |
170 | break; | |
171 | ||
172 | case V4L2_PIX_FMT_RGB24: | |
173 | hal_pixel_format = HAL_PIXEL_FORMAT_RGB_888; | |
174 | break; | |
175 | ||
176 | case V4L2_PIX_FMT_RGB565: | |
177 | hal_pixel_format = HAL_PIXEL_FORMAT_RGB_565; | |
178 | break; | |
179 | ||
180 | case V4L2_PIX_FMT_BGR32: | |
181 | hal_pixel_format = HAL_PIXEL_FORMAT_BGRA_8888; | |
182 | break; | |
183 | ||
184 | case V4L2_PIX_FMT_YUV420: | |
185 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_P; | |
186 | break; | |
1429cf3c | 187 | #ifdef V4L2_PIX_FMT_YUV420N |
5763fb39 T |
188 | case V4L2_PIX_FMT_YUV420N: |
189 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_PN; | |
190 | break; | |
1429cf3c | 191 | #endif |
5763fb39 T |
192 | case V4L2_PIX_FMT_YUV420M: |
193 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_P_M; | |
194 | break; | |
195 | ||
196 | case V4L2_PIX_FMT_YVU420: | |
197 | hal_pixel_format = HAL_PIXEL_FORMAT_YV12; | |
198 | break; | |
199 | ||
200 | case V4L2_PIX_FMT_YVU420M: | |
201 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YV12_M; | |
202 | break; | |
203 | ||
204 | case V4L2_PIX_FMT_NV16: | |
205 | hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_422_SP; | |
206 | break; | |
207 | ||
208 | case V4L2_PIX_FMT_NV12: | |
209 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP; | |
210 | break; | |
1429cf3c | 211 | #ifdef V4L2_PIX_FMT_NV12N |
5763fb39 T |
212 | case V4L2_PIX_FMT_NV12N: |
213 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN; | |
214 | break; | |
1429cf3c | 215 | #endif |
5763fb39 T |
216 | case V4L2_PIX_FMT_NV12M: |
217 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M; | |
218 | break; | |
219 | ||
220 | case V4L2_PIX_FMT_NV21M: | |
221 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M; | |
222 | break; | |
223 | ||
224 | case V4L2_PIX_FMT_YUYV: | |
225 | hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_422_I; | |
226 | break; | |
227 | ||
228 | case V4L2_PIX_FMT_UYVY: | |
229 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_CbYCrY_422_I; | |
230 | break; | |
231 | ||
232 | case V4L2_PIX_FMT_NV21: | |
233 | hal_pixel_format = HAL_PIXEL_FORMAT_YCrCb_420_SP; | |
234 | break; | |
235 | ||
236 | case V4L2_PIX_FMT_NV12MT: | |
237 | case V4L2_PIX_FMT_NV12MT_16X16: | |
238 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_TILED; | |
239 | break; | |
1429cf3c | 240 | #ifdef V4L2_PIX_FMT_NV12NT |
5763fb39 T |
241 | case V4L2_PIX_FMT_NV12NT: |
242 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_TILED; | |
243 | break; | |
1429cf3c | 244 | #endif |
5763fb39 T |
245 | case V4L2_PIX_FMT_NV61: |
246 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YCrCb_422_SP; | |
247 | break; | |
248 | ||
249 | case V4L2_PIX_FMT_YVYU: | |
250 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YCrCb_422_I; | |
251 | break; | |
252 | ||
253 | case V4L2_PIX_FMT_VYUY: | |
254 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_CrYCbY_422_I; | |
255 | break; | |
256 | ||
360b3997 | 257 | #ifdef V4L2_PIX_FMT_NV12N_10B |
5763fb39 T |
258 | case V4L2_PIX_FMT_NV12N_10B: |
259 | hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_S10B; | |
260 | break; | |
360b3997 | 261 | #endif |
5763fb39 T |
262 | |
263 | default: | |
264 | ALOGE("%s::unmatched V4L2_PIX color_space(%d)\n", | |
265 | __func__, v4l2_pixel_format); | |
266 | break; | |
267 | } | |
268 | ||
269 | return hal_pixel_format; | |
270 | } | |
271 | ||
272 | int NUM_PLANES(int hal_pixel_format) | |
273 | { | |
274 | switch(hal_pixel_format) { | |
275 | case HAL_PIXEL_FORMAT_EXYNOS_YV12_M: | |
276 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_P_M: | |
277 | return 3; | |
278 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M: | |
279 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_PRIV: | |
280 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_S10B: | |
281 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_S10B: | |
282 | case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M: | |
283 | case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP_M_FULL: | |
284 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP_M_TILED: | |
285 | return 2; | |
286 | break; | |
287 | case HAL_PIXEL_FORMAT_YV12: | |
288 | case HAL_PIXEL_FORMAT_YCrCb_420_SP: | |
289 | case HAL_PIXEL_FORMAT_YCbCr_422_I: | |
290 | case HAL_PIXEL_FORMAT_YCbCr_422_SP: | |
291 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP: | |
292 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_P: | |
293 | case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_422_I: | |
294 | case HAL_PIXEL_FORMAT_EXYNOS_CbYCrY_422_I: | |
295 | case HAL_PIXEL_FORMAT_EXYNOS_CrYCbY_422_I: | |
296 | case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_422_SP: | |
297 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_TILED: | |
298 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN: | |
299 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_PN: | |
300 | return 1; | |
301 | default: | |
302 | return 1; | |
303 | } | |
304 | } | |
305 | ||
306 | unsigned int FRAME_SIZE( | |
307 | int hal_pixel_format, | |
308 | int width, | |
309 | int height) | |
310 | { | |
311 | unsigned int frame_size = 0; | |
312 | unsigned int size = 0; | |
313 | ||
314 | switch (hal_pixel_format) { | |
315 | // 16bpp | |
316 | case HAL_PIXEL_FORMAT_RGB_565: | |
317 | frame_size = GET_16BPP_FRAME_SIZE(width, height); | |
318 | break; | |
319 | ||
320 | // 24bpp | |
321 | case HAL_PIXEL_FORMAT_RGB_888: | |
322 | frame_size = GET_24BPP_FRAME_SIZE(width, height); | |
323 | break; | |
324 | ||
325 | // 32bpp | |
326 | case HAL_PIXEL_FORMAT_RGBA_8888: | |
327 | case HAL_PIXEL_FORMAT_BGRA_8888: | |
328 | case HAL_PIXEL_FORMAT_RGBX_8888: | |
329 | frame_size = GET_32BPP_FRAME_SIZE(width, height); | |
330 | break; | |
331 | ||
332 | // 12bpp | |
333 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_P: | |
334 | case HAL_PIXEL_FORMAT_YV12: | |
335 | size = ALIGN(width, 16) * height; | |
336 | frame_size = size + ALIGN(width / 2, 16) * height; | |
337 | break; | |
338 | ||
339 | ||
340 | case HAL_PIXEL_FORMAT_YCrCb_420_SP: | |
341 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SP: | |
342 | frame_size = width * height * 3 / 2; | |
343 | break; | |
344 | ||
345 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN: | |
346 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_SPN_TILED: | |
347 | frame_size = (ALIGN_UP(width, 16) * ALIGN_UP(height, 16) + 256) + | |
348 | (ALIGN_UP((ALIGN_UP(width, 16) * (ALIGN_UP(height, 16) / 2) + 256), 16)); | |
349 | break; | |
350 | ||
351 | case HAL_PIXEL_FORMAT_EXYNOS_YCbCr_420_PN: | |
352 | frame_size = (ALIGN_UP(width, 16) * ALIGN_UP(height, 16) + 256) + | |
353 | 2 * (ALIGN_UP((ALIGN_UP(width / 2, 16) * (ALIGN_UP(height, 16) / 2) + 256), 16)); | |
354 | break; | |
355 | ||
356 | // 16bpp | |
357 | case HAL_PIXEL_FORMAT_YCbCr_422_SP: | |
358 | case HAL_PIXEL_FORMAT_YCbCr_422_I: | |
359 | case HAL_PIXEL_FORMAT_EXYNOS_CbYCrY_422_I: | |
360 | case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_422_SP: | |
361 | case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_422_I: | |
362 | case HAL_PIXEL_FORMAT_EXYNOS_CrYCbY_422_I: | |
363 | frame_size = GET_16BPP_FRAME_SIZE(width, height); | |
364 | break; | |
365 | ||
366 | default: | |
367 | ALOGD("%s::no matching source colorformat(0x%x), width(%d), h(%d) fail\n", | |
368 | __func__, hal_pixel_format, width, height); | |
369 | break; | |
370 | } | |
371 | ||
372 | return frame_size; | |
373 | } | |
374 | ||
375 | int V4L2_PIX_2_YUV_INFO(unsigned int v4l2_pixel_format, unsigned int * bpp, unsigned int * planes) | |
376 | { | |
377 | switch (v4l2_pixel_format) { | |
378 | case V4L2_PIX_FMT_NV12: | |
379 | case V4L2_PIX_FMT_NV21: | |
1429cf3c | 380 | #ifdef V4L2_PIX_FMT_NV12N |
5763fb39 | 381 | case V4L2_PIX_FMT_NV12N: |
1429cf3c S |
382 | #endif |
383 | #ifdef V4L2_PIX_FMT_NV12NT | |
5763fb39 | 384 | case V4L2_PIX_FMT_NV12NT: |
1429cf3c | 385 | #endif |
5763fb39 T |
386 | case V4L2_PIX_FMT_YUV420: |
387 | case V4L2_PIX_FMT_YVU420: | |
1429cf3c | 388 | #ifdef V4L2_PIX_FMT_YUV420N |
5763fb39 | 389 | case V4L2_PIX_FMT_YUV420N: |
1429cf3c | 390 | #endif |
5763fb39 T |
391 | *bpp = 12; |
392 | *planes = 1; | |
393 | break; | |
394 | ||
395 | case V4L2_PIX_FMT_NV12M: | |
396 | case V4L2_PIX_FMT_NV21M: | |
397 | case V4L2_PIX_FMT_NV12MT: | |
398 | case V4L2_PIX_FMT_NV12MT_16X16: | |
399 | *bpp = 12; | |
400 | *planes = 2; | |
401 | break; | |
402 | ||
403 | case V4L2_PIX_FMT_YUV420M: | |
404 | case V4L2_PIX_FMT_YVU420M: | |
405 | *bpp = 12; | |
406 | *planes = 3; | |
407 | break; | |
408 | ||
409 | case V4L2_PIX_FMT_YUYV: | |
410 | case V4L2_PIX_FMT_YVYU: | |
411 | case V4L2_PIX_FMT_UYVY: | |
412 | case V4L2_PIX_FMT_VYUY: | |
413 | case V4L2_PIX_FMT_NV16: | |
414 | case V4L2_PIX_FMT_NV61: | |
415 | *bpp = 16; | |
416 | *planes = 1; | |
417 | break; | |
418 | break; | |
419 | default: | |
420 | return -1; | |
421 | break; | |
422 | } | |
423 | ||
424 | return 0; | |
425 | } | |
426 | ||
427 | int get_yuv_bpp(unsigned int v4l2_pixel_format) | |
428 | { | |
429 | unsigned int bpp, planes; | |
430 | ||
431 | if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0) | |
432 | bpp = -1; | |
433 | ||
434 | return bpp; | |
435 | } | |
436 | ||
437 | int get_yuv_planes(unsigned int v4l2_pixel_format) | |
438 | { | |
439 | unsigned int bpp, planes; | |
440 | ||
441 | if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0) | |
442 | planes = -1; | |
443 | ||
444 | return planes; | |
445 | } | |
446 | #endif |