Home | History | Annotate | Download | only in include
      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 #ifndef __SAMSUNG_SYSLSI_SEC_COMMON_H__
     18 #define __SAMSUNG_SYSLSI_SEC_COMMON_H__
     19 
     20 //---------------------------------------------------------//
     21 // Include
     22 //---------------------------------------------------------//
     23 
     24 #include <hardware/hardware.h>
     25 #include "sec_format.h"
     26 
     27 #ifdef __cplusplus
     28 extern "C" {
     29 #endif
     30 
     31 #include <linux/videodev2.h>
     32 
     33 #ifdef __cplusplus
     34 }
     35 #endif
     36 
     37 //---------------------------------------------------------//
     38 // Common structure                                        //
     39 //---------------------------------------------------------//
     40 struct ADDRS {
     41     unsigned int addr_y;
     42     unsigned int addr_cbcr;
     43     unsigned int buf_idx;
     44     unsigned int reserved;
     45 };
     46 
     47 //---------------------------------------------------------//
     48 // Common function                                         //
     49 //---------------------------------------------------------//
     50 inline int HAL_PIXEL_FORMAT_2_V4L2_PIX(int HAL_PIXEL_FORMAT)
     51 {
     52     int V4L2_PIX = -1;
     53 
     54     switch (HAL_PIXEL_FORMAT) {
     55     case HAL_PIXEL_FORMAT_RGBA_8888:
     56     case HAL_PIXEL_FORMAT_RGBX_8888:
     57         V4L2_PIX = V4L2_PIX_FMT_RGB32;
     58         break;
     59 
     60     case HAL_PIXEL_FORMAT_RGB_888:
     61         V4L2_PIX = V4L2_PIX_FMT_RGB24;
     62         break;
     63 
     64     case HAL_PIXEL_FORMAT_RGB_565:
     65         V4L2_PIX = V4L2_PIX_FMT_RGB565;
     66         break;
     67 
     68     case HAL_PIXEL_FORMAT_BGRA_8888:
     69         //V4L2_PIX = V4L2_PIX_FMT_BGR32; // this is not proper on fimc.
     70         V4L2_PIX = V4L2_PIX_FMT_RGB32;
     71         break;
     72 
     73     case HAL_PIXEL_FORMAT_RGBA_5551:
     74         V4L2_PIX = V4L2_PIX_FMT_RGB555X;
     75         break;
     76 
     77     case HAL_PIXEL_FORMAT_RGBA_4444:
     78         V4L2_PIX = V4L2_PIX_FMT_RGB444;
     79         break;
     80 
     81     case HAL_PIXEL_FORMAT_YV12:
     82     case HAL_PIXEL_FORMAT_YCbCr_420_P:
     83         V4L2_PIX = V4L2_PIX_FMT_YUV420;
     84         break;
     85 
     86     case HAL_PIXEL_FORMAT_YCbCr_422_SP:
     87     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
     88         V4L2_PIX = 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_PIX = V4L2_PIX_FMT_NV12;
     94         break;
     95 
     96     case HAL_PIXEL_FORMAT_YCbCr_422_I:
     97     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
     98         V4L2_PIX = V4L2_PIX_FMT_YUYV;
     99         break;
    100 
    101     case HAL_PIXEL_FORMAT_YCbCr_422_P:
    102         V4L2_PIX = 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_PIX = 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_PIX = 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_PIX = V4L2_PIX_FMT_NV21;
    118         break;
    119 
    120     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
    121         V4L2_PIX = V4L2_PIX_FMT_NV12T;
    122         break;
    123 
    124    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
    125         V4L2_PIX = V4L2_PIX_FMT_YVYU;
    126         break;
    127 
    128    case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
    129         V4L2_PIX = V4L2_PIX_FMT_VYUY;
    130         break;
    131 
    132     default:
    133         ALOGE("%s::unmatched HAL_PIXEL_FORMAT color_space(0x%x)\n",
    134                 __func__, HAL_PIXEL_FORMAT);
    135         break;
    136     }
    137 
    138     return V4L2_PIX;
    139 }
    140 
    141 inline int V4L2_PIX_2_HAL_PIXEL_FORMAT(int V4L2_PIX)
    142 {
    143     int HAL_PIXEL_FORMAT = -1;
    144 
    145     switch (V4L2_PIX) {
    146     case V4L2_PIX_FMT_RGB32:
    147         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGBA_8888;
    148         //HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGBX_8888;
    149         break;
    150 
    151     case V4L2_PIX_FMT_RGB24:
    152         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGB_888;
    153         break;
    154 
    155     case V4L2_PIX_FMT_RGB565:
    156         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGB_565;
    157         break;
    158 
    159     case V4L2_PIX_FMT_BGR32:
    160         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_BGRA_8888;
    161         break;
    162 
    163     case V4L2_PIX_FMT_RGB555X:
    164         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGBA_5551;
    165         break;
    166 
    167     case V4L2_PIX_FMT_RGB444:
    168         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGBA_4444;
    169         break;
    170 
    171     case V4L2_PIX_FMT_YUV420:
    172         //HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_YV12;
    173         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_YCbCr_420_P;
    174         break;
    175 
    176     case V4L2_PIX_FMT_NV16:
    177         //HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_YCrCb_422_SP;
    178         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP;
    179         break;
    180 
    181     case V4L2_PIX_FMT_NV12:
    182         //HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_YCrCb_420_SP;
    183         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP;
    184         break;
    185 
    186     case V4L2_PIX_FMT_YUYV:
    187         //HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_YCbCr_422_I;
    188         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I;
    189         break;
    190 
    191     case V4L2_PIX_FMT_YUV422P:
    192         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_YCbCr_422_P;
    193         break;
    194 
    195     case V4L2_PIX_FMT_UYVY:
    196         //HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CbYCrY_422_I;
    197         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I;
    198         break;
    199 
    200     case V4L2_PIX_FMT_NV21:
    201         //HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_YCbCr_420_SP;
    202         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP;
    203         break;
    204 
    205     case V4L2_PIX_FMT_NV12T:
    206         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED;
    207         break;
    208 
    209     case V4L2_PIX_FMT_NV61:
    210         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP;
    211         break;
    212 
    213     case V4L2_PIX_FMT_YVYU:
    214         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I;
    215         break;
    216 
    217     case V4L2_PIX_FMT_VYUY:
    218         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I;
    219         break;
    220 
    221     default:
    222         ALOGE("%s::unmatched V4L2_PIX color_space(%d)\n",
    223                 __func__, V4L2_PIX);
    224         break;
    225     }
    226 
    227     return HAL_PIXEL_FORMAT;
    228 }
    229 
    230 #define ALIGN_TO_32B(x)   ((((x) + (1 <<  5) - 1) >>  5) <<  5)
    231 #define ALIGN_TO_128B(x)  ((((x) + (1 <<  7) - 1) >>  7) <<  7)
    232 #define ALIGN_TO_8KB(x)   ((((x) + (1 << 13) - 1) >> 13) << 13)
    233 
    234 #define GET_32BPP_FRAME_SIZE(w, h)  (((w) * (h)) << 2)
    235 #define GET_24BPP_FRAME_SIZE(w, h)  (((w) * (h)) * 3)
    236 #define GET_16BPP_FRAME_SIZE(w, h)  (((w) * (h)) << 1)
    237 
    238 inline unsigned int FRAME_SIZE(int HAL_PIXEL_FORMAT, int w, int h)
    239 {
    240     unsigned int frame_size = 0;
    241     unsigned int size       = 0;
    242 
    243     switch (HAL_PIXEL_FORMAT) {
    244     // 16bpp
    245     case HAL_PIXEL_FORMAT_RGB_565:
    246     case HAL_PIXEL_FORMAT_RGBA_5551:
    247     //case HAL_PIXEL_FORMAT_ARGB_1555:
    248     //case HAL_PIXEL_FORMAT_BGRA_5551:
    249     //case HAL_PIXEL_FORMAT_ABGR_1555:
    250 
    251     //case HAL_PIXEL_FORMAT_RGBX_5551:
    252     //case HAL_PIXEL_FORMAT_XRGB_1555:
    253     //case HAL_PIXEL_FORMAT_BGRX_5551:
    254     //case HAL_PIXEL_FORMAT_XBGR_1555:
    255 
    256     case HAL_PIXEL_FORMAT_RGBA_4444:
    257     //case HAL_PIXEL_FORMAT_ARGB_4444:
    258     //case HAL_PIXEL_FORMAT_BGRA_4444:
    259     //case HAL_PIXEL_FORMAT_ABGR_4444:
    260 
    261     //case HAL_PIXEL_FORMAT_RGBX_4444:
    262     //case HAL_PIXEL_FORMAT_XRGB_4444:
    263     //case HAL_PIXEL_FORMAT_BGRX_4444:
    264     //case HAL_PIXEL_FORMAT_XBGR_4444:
    265         frame_size = GET_16BPP_FRAME_SIZE(w, h);
    266         break;
    267 
    268     // 24bpp
    269     case HAL_PIXEL_FORMAT_RGB_888:
    270         frame_size = GET_24BPP_FRAME_SIZE(w, h);
    271         break;
    272 
    273     // 32bpp
    274     case HAL_PIXEL_FORMAT_RGBA_8888:
    275     //case HAL_PIXEL_FORMAT_ARGB_8888:
    276     case HAL_PIXEL_FORMAT_BGRA_8888:
    277     //case HAL_PIXEL_FORMAT_ABGR_8888:
    278 
    279     case HAL_PIXEL_FORMAT_RGBX_8888:
    280     //case HAL_PIXEL_FORMAT_XRGB_8888:
    281     //case HAL_PIXEL_FORMAT_BGRX_8888:
    282     //case HAL_PIXEL_FORMAT_XBGR_8888:
    283         frame_size = GET_32BPP_FRAME_SIZE(w, h);
    284         break;
    285 
    286     // 12bpp
    287     case HAL_PIXEL_FORMAT_YV12:
    288     case HAL_PIXEL_FORMAT_YCrCb_420_SP:
    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     case HAL_PIXEL_FORMAT_YCbCr_420_SP:
    293     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
    294     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
    295         size = w * h;
    296         // frame_size = width * height * 3 / 2;
    297         // sw5771.park : very curious...
    298         // frame_size = size + ((size / 4) * 2);
    299         frame_size = size + ((size >> 2) << 1);
    300         break;
    301 
    302     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
    303         frame_size =   ALIGN_TO_8KB(ALIGN_TO_128B(w) * ALIGN_TO_32B(h))
    304                      + ALIGN_TO_8KB(ALIGN_TO_128B(w) * ALIGN_TO_32B(h >> 1));
    305         break;
    306 
    307     // 16bpp
    308     case HAL_PIXEL_FORMAT_YCbCr_422_SP:
    309     case HAL_PIXEL_FORMAT_YCbCr_422_I:
    310     case HAL_PIXEL_FORMAT_YCbCr_422_P:
    311     case HAL_PIXEL_FORMAT_CbYCrY_422_I:
    312     case HAL_PIXEL_FORMAT_YCrCb_422_SP:
    313     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
    314     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
    315     case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
    316     case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
    317     case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
    318     case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
    319         frame_size = GET_16BPP_FRAME_SIZE(w, h);
    320         break;
    321 
    322     default:
    323         ALOGD("%s::no matching source colorformat(0x%x), w(%d), h(%d) fail\n",
    324                 __func__, HAL_PIXEL_FORMAT, w, h);
    325         break;
    326     }
    327 
    328     return frame_size;
    329 }
    330 
    331 #endif //__SAMSUNG_SYSLSI_SEC_COMMON_H__
    332