ifdef undefined stuff
[GitHub/LineageOS/android_hardware_samsung_slsi_exynos.git] / libexynosutils / exynos_format_v4l2.c
CommitLineData
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
45int 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
162int 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
272int 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
306unsigned 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
375int 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
427int 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
437int 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