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 (at) samsung.com) 20 * date 2011/06/02 21 * 22 * Revision History: 23 * - 2010/06/03 : Sangwoo, Park(sw5771.park (at) samsung.com) 24 * Initial version 25 * 26 * - 2011/12/07 : Hyeonmyeong Choi( hyeon.choi (at) samsung.com) 27 * Add V4L2_PIX_FMT_YVU420M 28 * 29 * - 2012/03/06 : shinwon lee(shinwon.lee (at) 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 <linux/videodev2.h> 45 #include "videodev2_exynos_media.h" 46 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_EXYNOS_YV12: 72 v4l2_pixel_format = V4L2_PIX_FMT_YVU420M; 73 break; 74 75 case HAL_PIXEL_FORMAT_YCbCr_420_P: 76 v4l2_pixel_format = V4L2_PIX_FMT_YUV420M; 77 break; 78 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; 82 break; 83 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; 87 break; 88 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; 92 break; 93 94 case HAL_PIXEL_FORMAT_YCbCr_422_P: 95 v4l2_pixel_format = V4L2_PIX_FMT_YUV422P; 96 break; 97 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; 101 break; 102 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; 106 break; 107 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; 111 break; 112 113 case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: 114 v4l2_pixel_format = V4L2_PIX_FMT_NV12MT_16X16; 115 break; 116 117 case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED: 118 v4l2_pixel_format = V4L2_PIX_FMT_NV12MT_16X16; 119 break; 120 121 case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I: 122 v4l2_pixel_format = V4L2_PIX_FMT_YVYU; 123 break; 124 125 case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I: 126 v4l2_pixel_format = V4L2_PIX_FMT_VYUY; 127 break; 128 129 default: 130 ALOGE("%s::unmatched HAL_PIXEL_FORMAT color_space(0x%x)\n", 131 __func__, hal_pixel_format); 132 break; 133 } 134 135 return v4l2_pixel_format; 136 } 137 138 int V4L2_PIX_2_HAL_PIXEL_FORMAT( 139 int v4l2_pixel_format) 140 { 141 int hal_pixel_format = -1; 142 143 switch (v4l2_pixel_format) { 144 case V4L2_PIX_FMT_RGB32: 145 hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_8888; 146 break; 147 148 case V4L2_PIX_FMT_RGB24: 149 hal_pixel_format = HAL_PIXEL_FORMAT_RGB_888; 150 break; 151 152 case V4L2_PIX_FMT_RGB565: 153 hal_pixel_format = HAL_PIXEL_FORMAT_RGB_565; 154 break; 155 156 case V4L2_PIX_FMT_BGR32: 157 hal_pixel_format = HAL_PIXEL_FORMAT_BGRA_8888; 158 break; 159 160 case V4L2_PIX_FMT_YUV420: 161 case V4L2_PIX_FMT_YUV420M: 162 hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_P; 163 break; 164 165 case V4L2_PIX_FMT_YVU420: 166 case V4L2_PIX_FMT_YVU420M: 167 hal_pixel_format = HAL_PIXEL_FORMAT_EXYNOS_YV12; 168 break; 169 170 case V4L2_PIX_FMT_NV16: 171 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP; 172 break; 173 174 case V4L2_PIX_FMT_NV12: 175 hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_SP; 176 break; 177 178 case V4L2_PIX_FMT_NV12M: 179 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP; 180 break; 181 182 case V4L2_PIX_FMT_YUYV: 183 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I; 184 break; 185 186 case V4L2_PIX_FMT_YUV422P: 187 hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_422_P; 188 break; 189 190 case V4L2_PIX_FMT_UYVY: 191 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I; 192 break; 193 194 case V4L2_PIX_FMT_NV21: 195 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP; 196 break; 197 case V4L2_PIX_FMT_NV12MT_16X16: 198 199 hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED; 200 break; 201 202 case V4L2_PIX_FMT_NV61: 203 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP; 204 break; 205 206 case V4L2_PIX_FMT_YVYU: 207 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I; 208 break; 209 210 case V4L2_PIX_FMT_VYUY: 211 hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I; 212 break; 213 214 default: 215 ALOGE("%s::unmatched V4L2_PIX color_space(%d)\n", 216 __func__, v4l2_pixel_format); 217 break; 218 } 219 220 return hal_pixel_format; 221 } 222 223 int NUM_PLANES(int hal_pixel_format) 224 { 225 switch(hal_pixel_format) { 226 case HAL_PIXEL_FORMAT_EXYNOS_YV12: 227 case HAL_PIXEL_FORMAT_YCbCr_420_P: 228 return 3; 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: 234 return 2; 235 break; 236 case HAL_PIXEL_FORMAT_YCbCr_420_I: 237 case HAL_PIXEL_FORMAT_CbYCrY_420_I: 238 return 1; 239 default: 240 return 1; 241 } 242 } 243 244 unsigned int FRAME_SIZE( 245 int hal_pixel_format, 246 int width, 247 int height) 248 { 249 unsigned int frame_size = 0; 250 unsigned int size = 0; 251 252 switch (hal_pixel_format) { 253 // 16bpp 254 case HAL_PIXEL_FORMAT_RGB_565: 255 frame_size = GET_16BPP_FRAME_SIZE(width, height); 256 break; 257 258 // 24bpp 259 case HAL_PIXEL_FORMAT_RGB_888: 260 frame_size = GET_24BPP_FRAME_SIZE(width, height); 261 break; 262 263 // 32bpp 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); 269 break; 270 271 // 12bpp 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); 278 break; 279 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); 286 break; 287 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)); 291 break; 292 293 // 16bpp 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); 306 break; 307 308 default: 309 ALOGD("%s::no matching source colorformat(0x%x), width(%d), h(%d) fail\n", 310 __func__, hal_pixel_format, width, height); 311 break; 312 } 313 314 return frame_size; 315 } 316 317 int PLANAR_FRAME_SIZE(int hal_pixel_format, int width, int height, 318 unsigned int *luma_size, unsigned int *chroma_size) 319 { 320 unsigned int size = 0; 321 322 switch(hal_pixel_format) { 323 case HAL_PIXEL_FORMAT_EXYNOS_YV12: 324 case HAL_PIXEL_FORMAT_YCbCr_420_P: 325 size = width * height; 326 *luma_size = size; 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; 335 *luma_size = size; 336 *chroma_size = (size >> 2) << 1; 337 break; 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)); 342 break; 343 default: 344 *luma_size = FRAME_SIZE(hal_pixel_format, width, height); 345 } 346 return 0; 347 } 348 349 350 int V4L2_PIX_2_YUV_INFO(unsigned int v4l2_pixel_format, unsigned int * bpp, unsigned int * planes) 351 { 352 switch (v4l2_pixel_format) { 353 case V4L2_PIX_FMT_NV12: 354 *bpp = 12; 355 *planes = 1; 356 break; 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: 362 *bpp = 12; 363 *planes = 2; 364 break; 365 case V4L2_PIX_FMT_YUV420: 366 case V4L2_PIX_FMT_YUV420M: 367 case V4L2_PIX_FMT_YVU420M: 368 *bpp = 12; 369 *planes = 3; 370 break; 371 case V4L2_PIX_FMT_YUYV: 372 case V4L2_PIX_FMT_YVYU: 373 case V4L2_PIX_FMT_UYVY: 374 case V4L2_PIX_FMT_VYUY: 375 *bpp = 16; 376 *planes = 1; 377 break; 378 case V4L2_PIX_FMT_NV16: 379 case V4L2_PIX_FMT_NV61: 380 case V4L2_PIX_FMT_NV16X: 381 case V4L2_PIX_FMT_NV61X: 382 *bpp = 16; 383 *planes = 2; 384 break; 385 case V4L2_PIX_FMT_YUV422P: 386 *bpp = 16; 387 *planes = 3; 388 break; 389 default: 390 return -1; 391 break; 392 } 393 394 return 0; 395 } 396 397 unsigned int get_yuv_bpp(unsigned int v4l2_pixel_format) 398 { 399 unsigned int bpp, planes; 400 401 if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0) 402 bpp = -1; 403 404 return bpp; 405 } 406 407 unsigned int get_yuv_planes(unsigned int v4l2_pixel_format) 408 { 409 unsigned int bpp, planes; 410 411 if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0) 412 planes = -1; 413 414 return planes; 415 } 416 #endif 417