2 * Copyright@ Samsung Electronics Co. LTD
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * file exynos5_format_v4l2.c
19 * author Sangwoo, Park(sw5771.park@samsung.com)
23 * - 2010/06/03 : Sangwoo, Park(sw5771.park@samsung.com)
26 * - 2011/12/07 : Hyeonmyeong Choi( hyeon.choi@samsung.com)
27 * Add V4L2_PIX_FMT_YVU420M
29 * - 2012/03/06 : shinwon lee(shinwon.lee@samsung.com)
30 * Merge to libexynosutils
34 #ifndef __EXYNOS5_FORMAT_V4L2_H__
35 #define __EXYNOS5_FORMAT_V4L2_H__
37 //---------------------------------------------------------//
39 //---------------------------------------------------------//
40 #include <hardware/hardware.h>
41 #include "exynos_format.h"
42 #include "s5p_fimc_v4l2.h"
43 #include <utils/Log.h>
44 #include <linux/videodev2.h>
45 #include "videodev2_exynos_media.h"
47 int HAL_PIXEL_FORMAT_2_V4L2_PIX(
50 int v4l2_pixel_format
= -1;
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
;
59 case HAL_PIXEL_FORMAT_RGB_888
:
60 v4l2_pixel_format
= V4L2_PIX_FMT_RGB24
;
63 case HAL_PIXEL_FORMAT_RGB_565
:
64 v4l2_pixel_format
= V4L2_PIX_FMT_RGB565
;
67 case HAL_PIXEL_FORMAT_BGRA_8888
:
68 v4l2_pixel_format
= V4L2_PIX_FMT_BGR32
;
71 case HAL_PIXEL_FORMAT_EXYNOS_YV12
:
72 v4l2_pixel_format
= V4L2_PIX_FMT_YVU420M
;
75 case HAL_PIXEL_FORMAT_YCbCr_420_P
:
76 v4l2_pixel_format
= V4L2_PIX_FMT_YUV420M
;
79 case HAL_PIXEL_FORMAT_YCbCr_422_SP
:
80 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP
:
81 v4l2_pixel_format
= V4L2_PIX_FMT_NV61
;
84 case HAL_PIXEL_FORMAT_YCbCr_420_SP
:
85 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP
:
86 v4l2_pixel_format
= V4L2_PIX_FMT_NV12M
;
89 case HAL_PIXEL_FORMAT_YCbCr_422_I
:
90 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I
:
91 v4l2_pixel_format
= V4L2_PIX_FMT_YUYV
;
94 case HAL_PIXEL_FORMAT_YCbCr_422_P
:
95 v4l2_pixel_format
= V4L2_PIX_FMT_YUV422P
;
98 case HAL_PIXEL_FORMAT_CbYCrY_422_I
:
99 case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I
:
100 v4l2_pixel_format
= V4L2_PIX_FMT_UYVY
;
103 case HAL_PIXEL_FORMAT_YCrCb_422_SP
:
104 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP
:
105 v4l2_pixel_format
= V4L2_PIX_FMT_NV16
;
108 case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP
:
109 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP
:
110 v4l2_pixel_format
= V4L2_PIX_FMT_NV21M
;
113 case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED
:
114 v4l2_pixel_format
= V4L2_PIX_FMT_NV12MT_16X16
;
117 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED
:
118 v4l2_pixel_format
= V4L2_PIX_FMT_NV12MT_16X16
;
121 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I
:
122 v4l2_pixel_format
= V4L2_PIX_FMT_YVYU
;
125 case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I
:
126 v4l2_pixel_format
= V4L2_PIX_FMT_VYUY
;
130 ALOGE("%s::unmatched HAL_PIXEL_FORMAT color_space(0x%x)\n",
131 __func__
, hal_pixel_format
);
135 return v4l2_pixel_format
;
138 int V4L2_PIX_2_HAL_PIXEL_FORMAT(
139 int v4l2_pixel_format
)
141 int hal_pixel_format
= -1;
143 switch (v4l2_pixel_format
) {
144 case V4L2_PIX_FMT_RGB32
:
145 hal_pixel_format
= HAL_PIXEL_FORMAT_RGBA_8888
;
148 case V4L2_PIX_FMT_RGB24
:
149 hal_pixel_format
= HAL_PIXEL_FORMAT_RGB_888
;
152 case V4L2_PIX_FMT_RGB565
:
153 hal_pixel_format
= HAL_PIXEL_FORMAT_RGB_565
;
156 case V4L2_PIX_FMT_BGR32
:
157 hal_pixel_format
= HAL_PIXEL_FORMAT_BGRA_8888
;
160 case V4L2_PIX_FMT_YUV420
:
161 case V4L2_PIX_FMT_YUV420M
:
162 hal_pixel_format
= HAL_PIXEL_FORMAT_YCbCr_420_P
;
165 case V4L2_PIX_FMT_YVU420
:
166 case V4L2_PIX_FMT_YVU420M
:
167 hal_pixel_format
= HAL_PIXEL_FORMAT_EXYNOS_YV12
;
170 case V4L2_PIX_FMT_NV16
:
171 hal_pixel_format
= HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP
;
174 case V4L2_PIX_FMT_NV12
:
175 hal_pixel_format
= HAL_PIXEL_FORMAT_YCbCr_420_SP
;
178 case V4L2_PIX_FMT_NV12M
:
179 hal_pixel_format
= HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP
;
182 case V4L2_PIX_FMT_YUYV
:
183 hal_pixel_format
= HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I
;
186 case V4L2_PIX_FMT_YUV422P
:
187 hal_pixel_format
= HAL_PIXEL_FORMAT_YCbCr_422_P
;
190 case V4L2_PIX_FMT_UYVY
:
191 hal_pixel_format
= HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I
;
194 case V4L2_PIX_FMT_NV21
:
195 hal_pixel_format
= HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP
;
197 case V4L2_PIX_FMT_NV12MT_16X16
:
199 hal_pixel_format
= HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED
;
202 case V4L2_PIX_FMT_NV61
:
203 hal_pixel_format
= HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP
;
206 case V4L2_PIX_FMT_YVYU
:
207 hal_pixel_format
= HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I
;
210 case V4L2_PIX_FMT_VYUY
:
211 hal_pixel_format
= HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I
;
215 ALOGE("%s::unmatched V4L2_PIX color_space(%d)\n",
216 __func__
, v4l2_pixel_format
);
220 return hal_pixel_format
;
223 int NUM_PLANES(int hal_pixel_format
)
225 switch(hal_pixel_format
) {
226 case HAL_PIXEL_FORMAT_EXYNOS_YV12
:
227 case HAL_PIXEL_FORMAT_YCbCr_420_P
:
229 case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP
:
230 case HAL_PIXEL_FORMAT_YCbCr_420_SP
:
231 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP
:
232 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP
:
233 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED
:
236 case HAL_PIXEL_FORMAT_YCbCr_420_I
:
237 case HAL_PIXEL_FORMAT_CbYCrY_420_I
:
244 unsigned int FRAME_SIZE(
245 int hal_pixel_format
,
249 unsigned int frame_size
= 0;
250 unsigned int size
= 0;
252 switch (hal_pixel_format
) {
254 case HAL_PIXEL_FORMAT_RGB_565
:
255 frame_size
= GET_16BPP_FRAME_SIZE(width
, height
);
259 case HAL_PIXEL_FORMAT_RGB_888
:
260 frame_size
= GET_24BPP_FRAME_SIZE(width
, height
);
264 case HAL_PIXEL_FORMAT_RGBA_8888
:
265 case HAL_PIXEL_FORMAT_BGRA_8888
:
266 case HAL_PIXEL_FORMAT_RGBX_8888
:
267 case HAL_PIXEL_FORMAT_CUSTOM_ARGB_8888
:
268 frame_size
= GET_32BPP_FRAME_SIZE(width
, height
);
272 case HAL_PIXEL_FORMAT_EXYNOS_YV12
:
273 case HAL_PIXEL_FORMAT_YCbCr_420_P
:
274 case HAL_PIXEL_FORMAT_YCbCr_420_I
:
275 case HAL_PIXEL_FORMAT_CbYCrY_420_I
:
276 size
= ALIGN(width
, 16) * ALIGN(height
, 16);
277 frame_size
= size
+ 2 * ALIGN(width
>> 1, 8) * ALIGN(height
>> 1, 8);
280 case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP
:
281 case HAL_PIXEL_FORMAT_YCbCr_420_SP
:
282 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP
:
283 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP
:
284 size
= ALIGN(ALIGN(width
, 16) * ALIGN(height
, 16), 2048);
285 frame_size
= size
+ ALIGN(ALIGN(width
, 16) * ALIGN(height
>> 1, 8), 2048);
288 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED
:
289 frame_size
= ALIGN_TO_8KB(ALIGN_TO_128B(width
) * ALIGN_TO_32B(height
))
290 + ALIGN_TO_8KB(ALIGN_TO_128B(width
) * ALIGN_TO_32B(height
>> 1));
294 case HAL_PIXEL_FORMAT_YCbCr_422_SP
:
295 case HAL_PIXEL_FORMAT_YCbCr_422_I
:
296 case HAL_PIXEL_FORMAT_YCbCr_422_P
:
297 case HAL_PIXEL_FORMAT_CbYCrY_422_I
:
298 case HAL_PIXEL_FORMAT_YCrCb_422_SP
:
299 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP
:
300 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP
:
301 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I
:
302 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I
:
303 case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I
:
304 case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I
:
305 frame_size
= GET_16BPP_FRAME_SIZE(width
, height
);
309 ALOGD("%s::no matching source colorformat(0x%x), width(%d), h(%d) fail\n",
310 __func__
, hal_pixel_format
, width
, height
);
317 int PLANAR_FRAME_SIZE(int hal_pixel_format
, int width
, int height
,
318 unsigned int *luma_size
, unsigned int *chroma_size
)
320 unsigned int size
= 0;
322 switch(hal_pixel_format
) {
323 case HAL_PIXEL_FORMAT_EXYNOS_YV12
:
324 case HAL_PIXEL_FORMAT_YCbCr_420_P
:
325 size
= width
* height
;
327 *chroma_size
= size
>> 2;
328 case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP
:
329 case HAL_PIXEL_FORMAT_YCbCr_420_I
:
330 case HAL_PIXEL_FORMAT_CbYCrY_420_I
:
331 case HAL_PIXEL_FORMAT_YCbCr_420_SP
:
332 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP
:
333 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP
:
334 size
= width
* height
;
336 *chroma_size
= (size
>> 2) << 1;
338 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED
:
339 *luma_size
= ALIGN_TO_8KB(ALIGN_TO_128B(width
) * ALIGN_TO_32B(height
));
340 *chroma_size
= ALIGN_TO_8KB(ALIGN_TO_128B(width
) *
341 ALIGN_TO_32B(height
>> 1));
344 *luma_size
= FRAME_SIZE(hal_pixel_format
, width
, height
);
350 int V4L2_PIX_2_YUV_INFO(unsigned int v4l2_pixel_format
, unsigned int * bpp
, unsigned int * planes
)
352 switch (v4l2_pixel_format
) {
353 case V4L2_PIX_FMT_NV12
:
357 case V4L2_PIX_FMT_NV21
:
358 case V4L2_PIX_FMT_NV21X
:
359 case V4L2_PIX_FMT_NV12M
:
360 case V4L2_PIX_FMT_NV21M
:
361 case V4L2_PIX_FMT_NV12MT_16X16
:
365 case V4L2_PIX_FMT_YUV420
:
366 case V4L2_PIX_FMT_YUV420M
:
367 case V4L2_PIX_FMT_YVU420M
:
371 case V4L2_PIX_FMT_YUYV
:
372 case V4L2_PIX_FMT_YVYU
:
373 case V4L2_PIX_FMT_UYVY
:
374 case V4L2_PIX_FMT_VYUY
:
378 case V4L2_PIX_FMT_NV16
:
379 case V4L2_PIX_FMT_NV61
:
380 case V4L2_PIX_FMT_NV16X
:
381 case V4L2_PIX_FMT_NV61X
:
385 case V4L2_PIX_FMT_YUV422P
:
397 unsigned int get_yuv_bpp(unsigned int v4l2_pixel_format
)
399 unsigned int bpp
, planes
;
401 if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format
, &bpp
, &planes
) < 0)
407 unsigned int get_yuv_planes(unsigned int v4l2_pixel_format
)
409 unsigned int bpp
, planes
;
411 if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format
, &bpp
, &planes
) < 0)