blob: 04609b4ad048ecc1435be65d814b07963f2d7247 [file] [log] [blame]
Jiho Chang61bc1542012-03-24 05:52:01 +09001/*
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"
Jiho Changc3e0af62012-04-26 13:52:52 -070045#include "videodev2_exynos_media.h"
Jiho Chang61bc1542012-03-24 05:52:01 +090046
47int 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 v4l2_pixel_format = V4L2_PIX_FMT_RGB32;
56 break;
57
58 case HAL_PIXEL_FORMAT_RGB_888:
59 v4l2_pixel_format = V4L2_PIX_FMT_RGB24;
60 break;
61
62 case HAL_PIXEL_FORMAT_RGB_565:
63 v4l2_pixel_format = V4L2_PIX_FMT_RGB565;
64 break;
65
66 case HAL_PIXEL_FORMAT_BGRA_8888:
67 v4l2_pixel_format = V4L2_PIX_FMT_BGR32;
68 break;
69
70 case HAL_PIXEL_FORMAT_RGBA_5551:
71 v4l2_pixel_format = V4L2_PIX_FMT_RGB555X;
72 break;
73
74 case HAL_PIXEL_FORMAT_RGBA_4444:
75 v4l2_pixel_format = V4L2_PIX_FMT_RGB444;
76 break;
77
78 case HAL_PIXEL_FORMAT_YV12:
79 v4l2_pixel_format = V4L2_PIX_FMT_YVU420M;
80 break;
81
82 case HAL_PIXEL_FORMAT_YCbCr_420_P:
83 v4l2_pixel_format = V4L2_PIX_FMT_YUV420M;
84 break;
85
86 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
87 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
88 v4l2_pixel_format = V4L2_PIX_FMT_NV61;
89 break;
90
91 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
92 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
93 v4l2_pixel_format = V4L2_PIX_FMT_NV12M;
94 break;
95
96 case HAL_PIXEL_FORMAT_YCbCr_422_I:
97 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
98 v4l2_pixel_format = V4L2_PIX_FMT_YUYV;
99 break;
100
101 case HAL_PIXEL_FORMAT_YCbCr_422_P:
102 v4l2_pixel_format = V4L2_PIX_FMT_YUV422P;
103 break;
104
105 case HAL_PIXEL_FORMAT_CbYCrY_422_I:
106 case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
107 v4l2_pixel_format = V4L2_PIX_FMT_UYVY;
108 break;
109
110 case HAL_PIXEL_FORMAT_YCrCb_422_SP:
111 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
112 v4l2_pixel_format = V4L2_PIX_FMT_NV16;
113 break;
114
115 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
116 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
117 v4l2_pixel_format = V4L2_PIX_FMT_NV21M;
118 break;
119
120 case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
121 v4l2_pixel_format = V4L2_PIX_FMT_NV12MT_16X16;
122 break;
123
124 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
125 v4l2_pixel_format = V4L2_PIX_FMT_NV12MT_16X16;
126 break;
127
128 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
129 v4l2_pixel_format = V4L2_PIX_FMT_YVYU;
130 break;
131
132 case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
133 v4l2_pixel_format = V4L2_PIX_FMT_VYUY;
134 break;
135
136 default:
Dima Zavin53b41972012-04-02 10:29:34 -0700137 ALOGE("%s::unmatched HAL_PIXEL_FORMAT color_space(0x%x)\n",
Jiho Chang61bc1542012-03-24 05:52:01 +0900138 __func__, hal_pixel_format);
139 break;
140 }
141
142 return v4l2_pixel_format;
143}
144
145int V4L2_PIX_2_HAL_PIXEL_FORMAT(
146 int v4l2_pixel_format)
147{
148 int hal_pixel_format = -1;
149
150 switch (v4l2_pixel_format) {
151 case V4L2_PIX_FMT_RGB32:
152 hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_8888;
153 break;
154
155 case V4L2_PIX_FMT_RGB24:
156 hal_pixel_format = HAL_PIXEL_FORMAT_RGB_888;
157 break;
158
159 case V4L2_PIX_FMT_RGB565:
160 hal_pixel_format = HAL_PIXEL_FORMAT_RGB_565;
161 break;
162
163 case V4L2_PIX_FMT_BGR32:
164 hal_pixel_format = HAL_PIXEL_FORMAT_BGRA_8888;
165 break;
166
167 case V4L2_PIX_FMT_RGB555X:
168 hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_5551;
169 break;
170
171 case V4L2_PIX_FMT_RGB444:
172 hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_4444;
173 break;
174
175 case V4L2_PIX_FMT_YUV420:
176 case V4L2_PIX_FMT_YUV420M:
177 hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_P;
178 break;
179
180 case V4L2_PIX_FMT_YVU420:
181 case V4L2_PIX_FMT_YVU420M:
182 hal_pixel_format = HAL_PIXEL_FORMAT_YV12;
183 break;
184
185 case V4L2_PIX_FMT_NV16:
186 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP;
187 break;
188
189 case V4L2_PIX_FMT_NV12:
190 hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_SP;
191 break;
192
193 case V4L2_PIX_FMT_NV12M:
194 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP;
195 break;
196
197 case V4L2_PIX_FMT_YUYV:
198 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I;
199 break;
200
201 case V4L2_PIX_FMT_YUV422P:
202 hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_422_P;
203 break;
204
205 case V4L2_PIX_FMT_UYVY:
206 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I;
207 break;
208
209 case V4L2_PIX_FMT_NV21:
210 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP;
211 break;
212 case V4L2_PIX_FMT_NV12MT_16X16:
213
214 hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED;
215 break;
216
217 case V4L2_PIX_FMT_NV61:
218 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP;
219 break;
220
221 case V4L2_PIX_FMT_YVYU:
222 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I;
223 break;
224
225 case V4L2_PIX_FMT_VYUY:
226 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I;
227 break;
228
229 default:
Dima Zavin53b41972012-04-02 10:29:34 -0700230 ALOGE("%s::unmatched V4L2_PIX color_space(%d)\n",
Jiho Chang61bc1542012-03-24 05:52:01 +0900231 __func__, v4l2_pixel_format);
232 break;
233 }
234
235 return hal_pixel_format;
236}
237
Rebecca Schultz Zavin471812b2012-05-15 16:49:56 -0700238int NUM_PLANES(int hal_pixel_format)
239{
240 switch(hal_pixel_format) {
241 case HAL_PIXEL_FORMAT_YV12:
242 case HAL_PIXEL_FORMAT_YCbCr_420_P:
243 return 3;
244 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
245 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
246 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
247 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
248 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
249 return 2;
250 break;
251 case HAL_PIXEL_FORMAT_YCbCr_420_I:
252 case HAL_PIXEL_FORMAT_CbYCrY_420_I:
253 return 1;
254 default:
255 return 1;
256 }
257}
258
Jiho Chang61bc1542012-03-24 05:52:01 +0900259unsigned int FRAME_SIZE(
260 int hal_pixel_format,
261 int width,
262 int height)
263{
264 unsigned int frame_size = 0;
265 unsigned int size = 0;
266
267 switch (hal_pixel_format) {
268 // 16bpp
269 case HAL_PIXEL_FORMAT_RGB_565:
270 case HAL_PIXEL_FORMAT_RGBA_5551:
271 case HAL_PIXEL_FORMAT_RGBA_4444:
272 frame_size = GET_16BPP_FRAME_SIZE(width, height);
273 break;
274
275 // 24bpp
276 case HAL_PIXEL_FORMAT_RGB_888:
277 frame_size = GET_24BPP_FRAME_SIZE(width, height);
278 break;
279
280 // 32bpp
281 case HAL_PIXEL_FORMAT_RGBA_8888:
282 case HAL_PIXEL_FORMAT_BGRA_8888:
283 case HAL_PIXEL_FORMAT_RGBX_8888:
284 frame_size = GET_32BPP_FRAME_SIZE(width, height);
285 break;
286
287 // 12bpp
288 case HAL_PIXEL_FORMAT_YV12:
289 case HAL_PIXEL_FORMAT_YCbCr_420_P:
290 case HAL_PIXEL_FORMAT_YCbCr_420_I:
291 case HAL_PIXEL_FORMAT_CbYCrY_420_I:
292 size = ALIGN(width, 16) * ALIGN(height, 16);
293 frame_size = size + 2 * ALIGN(width >> 1, 8) * ALIGN(height >> 1, 8);
294 break;
295
296 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
297 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
298 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
299 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
300 size = ALIGN(ALIGN(width, 16) * ALIGN(height, 16), 2048);
301 frame_size = size + ALIGN(ALIGN(width, 16) * ALIGN(height >> 1, 8), 2048);
302 break;
303
304 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
305 frame_size = ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height))
306 + ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height >> 1));
307 break;
308
309 // 16bpp
310 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
311 case HAL_PIXEL_FORMAT_YCbCr_422_I:
312 case HAL_PIXEL_FORMAT_YCbCr_422_P:
313 case HAL_PIXEL_FORMAT_CbYCrY_422_I:
314 case HAL_PIXEL_FORMAT_YCrCb_422_SP:
315 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
316 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
317 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
318 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
319 case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
320 case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
321 frame_size = GET_16BPP_FRAME_SIZE(width, height);
322 break;
323
324 default:
Dima Zavin53b41972012-04-02 10:29:34 -0700325 ALOGD("%s::no matching source colorformat(0x%x), width(%d), h(%d) fail\n",
Jiho Chang61bc1542012-03-24 05:52:01 +0900326 __func__, hal_pixel_format, width, height);
327 break;
328 }
329
330 return frame_size;
331}
332
Rebecca Schultz Zavin471812b2012-05-15 16:49:56 -0700333int PLANAR_FRAME_SIZE(int hal_pixel_format, int width, int height,
334 unsigned int *luma_size, unsigned int *chroma_size)
335{
336 unsigned int size = 0;
337
338 switch(hal_pixel_format) {
339 case HAL_PIXEL_FORMAT_YV12:
340 case HAL_PIXEL_FORMAT_YCbCr_420_P:
341 size = width * height;
342 *luma_size = size;
343 *chroma_size = size >> 2;
344 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
345 case HAL_PIXEL_FORMAT_YCbCr_420_I:
346 case HAL_PIXEL_FORMAT_CbYCrY_420_I:
347 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
348 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
349 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
350 size = width * height;
351 *luma_size = size;
352 *chroma_size = (size >> 2) << 1;
353 break;
354 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
355 *luma_size = ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height));
356 *chroma_size = ALIGN_TO_8KB(ALIGN_TO_128B(width) *
357 ALIGN_TO_32B(height >> 1));
358 break;
359 default:
360 *luma_size = FRAME_SIZE(hal_pixel_format, width, height);
361 }
362 return 0;
363}
364
365
Jiho Chang61bc1542012-03-24 05:52:01 +0900366int V4L2_PIX_2_YUV_INFO(unsigned int v4l2_pixel_format, unsigned int * bpp, unsigned int * planes)
367{
368 switch (v4l2_pixel_format) {
369 case V4L2_PIX_FMT_NV12:
370 *bpp = 12;
371 *planes = 1;
372 break;
373 case V4L2_PIX_FMT_NV21:
374 case V4L2_PIX_FMT_NV21X:
375 case V4L2_PIX_FMT_NV12M:
376 case V4L2_PIX_FMT_NV21M:
377 *bpp = 12;
378 *planes = 2;
379 break;
380 case V4L2_PIX_FMT_YUV420:
381 case V4L2_PIX_FMT_YUV420M:
382 case V4L2_PIX_FMT_YVU420M:
383 *bpp = 12;
384 *planes = 3;
385 break;
386 case V4L2_PIX_FMT_YUYV:
387 case V4L2_PIX_FMT_YVYU:
388 case V4L2_PIX_FMT_UYVY:
389 case V4L2_PIX_FMT_VYUY:
390 *bpp = 16;
391 *planes = 1;
392 break;
393 case V4L2_PIX_FMT_NV16:
394 case V4L2_PIX_FMT_NV61:
395 case V4L2_PIX_FMT_NV16X:
396 case V4L2_PIX_FMT_NV61X:
397 *bpp = 16;
398 *planes = 2;
399 break;
400 case V4L2_PIX_FMT_YUV422P:
401 *bpp = 16;
402 *planes = 3;
403 break;
404 default:
405 return -1;
406 break;
407 }
408
409 return 0;
410}
411
412unsigned int get_yuv_bpp(unsigned int v4l2_pixel_format)
413{
414 unsigned int bpp, planes;
415
416 if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0)
417 bpp = -1;
418
419 return bpp;
420}
421
422unsigned int get_yuv_planes(unsigned int v4l2_pixel_format)
423{
424 unsigned int bpp, planes;
425
426 if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0)
427 planes = -1;
428
429 return planes;
430}
431#endif