Home | History | Annotate | Download | only in libexynosutils
      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