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 "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 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_EXYNOS_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_EXYNOS_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: 137 ALOGE("%s::unmatched HAL_PIXEL_FORMAT color_space(0x%x)\n", 138 __func__, hal_pixel_format); 139 break; 140 } 141 142 return v4l2_pixel_format; 143 } 144 145 int 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_EXYNOS_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: 230 ALOGE("%s::unmatched V4L2_PIX color_space(%d)\n", 231 __func__, v4l2_pixel_format); 232 break; 233 } 234 235 return hal_pixel_format; 236 } 237 238 int NUM_PLANES(int hal_pixel_format) 239 { 240 switch(hal_pixel_format) { 241 case HAL_PIXEL_FORMAT_EXYNOS_YV12: 242 case HAL_PIXEL_FORMAT_YCbCr_420_P: 243 return 3; 244 case HAL_PIXEL_FORMAT_EXYNOS_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 259 unsigned 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_EXYNOS_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_EXYNOS_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: 325 ALOGD("%s::no matching source colorformat(0x%x), width(%d), h(%d) fail\n", 326 __func__, hal_pixel_format, width, height); 327 break; 328 } 329 330 return frame_size; 331 } 332 333 int 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_EXYNOS_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_EXYNOS_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 366 int 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 case V4L2_PIX_FMT_NV12MT_16X16: 378 *bpp = 12; 379 *planes = 2; 380 break; 381 case V4L2_PIX_FMT_YUV420: 382 case V4L2_PIX_FMT_YUV420M: 383 case V4L2_PIX_FMT_YVU420M: 384 *bpp = 12; 385 *planes = 3; 386 break; 387 case V4L2_PIX_FMT_YUYV: 388 case V4L2_PIX_FMT_YVYU: 389 case V4L2_PIX_FMT_UYVY: 390 case V4L2_PIX_FMT_VYUY: 391 *bpp = 16; 392 *planes = 1; 393 break; 394 case V4L2_PIX_FMT_NV16: 395 case V4L2_PIX_FMT_NV61: 396 case V4L2_PIX_FMT_NV16X: 397 case V4L2_PIX_FMT_NV61X: 398 *bpp = 16; 399 *planes = 2; 400 break; 401 case V4L2_PIX_FMT_YUV422P: 402 *bpp = 16; 403 *planes = 3; 404 break; 405 default: 406 return -1; 407 break; 408 } 409 410 return 0; 411 } 412 413 unsigned int get_yuv_bpp(unsigned int v4l2_pixel_format) 414 { 415 unsigned int bpp, planes; 416 417 if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0) 418 bpp = -1; 419 420 return bpp; 421 } 422 423 unsigned int get_yuv_planes(unsigned int v4l2_pixel_format) 424 { 425 unsigned int bpp, planes; 426 427 if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0) 428 planes = -1; 429 430 return planes; 431 } 432 #endif 433