Home | History | Annotate | Download | only in xcore
      1 /*
      2  * xcam_buffer.cpp - video buffer standard version
      3  *
      4  *  Copyright (c) 2016 Intel Corporation
      5  *
      6  * Licensed under the Apache License, Version 2.0 (the "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *      http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  *
     18  * Author: Wind Yuan <feng.yuan (at) intel.com>
     19  */
     20 
     21 #include <base/xcam_buffer.h>
     22 
     23 XCamReturn
     24 xcam_video_buffer_info_reset (
     25     XCamVideoBufferInfo *info,
     26     uint32_t format,
     27     uint32_t width, uint32_t height,
     28     uint32_t aligned_width, uint32_t aligned_height, uint32_t size)
     29 {
     30     uint32_t image_size = 0;
     31     uint32_t i = 0;
     32 
     33     XCAM_ASSERT (info && format);
     34     XCAM_ASSERT (!aligned_width  || aligned_width >= width);
     35     XCAM_ASSERT (!aligned_height  || aligned_height >= height);
     36 
     37     if (!aligned_width)
     38         aligned_width = XCAM_ALIGN_UP (width, 4);
     39     if (!aligned_height)
     40         aligned_height = XCAM_ALIGN_UP (height, 2);
     41 
     42     info->format = format;
     43     info->width = width;
     44     info->height = height;
     45     info->aligned_width = aligned_width;
     46     info->aligned_height = aligned_height;
     47 
     48     switch (format) {
     49     case V4L2_PIX_FMT_GREY:
     50         info->color_bits = 8;
     51         info->components = 1;
     52         info->strides [0] = aligned_width;
     53         info->offsets [0] = 0;
     54         image_size = info->strides [0] * aligned_height;
     55         break;
     56     case V4L2_PIX_FMT_NV12:
     57         info->color_bits = 8;
     58         info->components = 2;
     59         info->strides [0] = aligned_width;
     60         info->strides [1] = info->strides [0];
     61         info->offsets [0] = 0;
     62         info->offsets [1] = info->offsets [0] + info->strides [0] * aligned_height;
     63         image_size = info->strides [0] * aligned_height + info->strides [1] * aligned_height / 2;
     64         break;
     65     case V4L2_PIX_FMT_YUYV:
     66         info->color_bits = 8;
     67         info->components = 1;
     68         info->strides [0] = aligned_width * 2;
     69         info->offsets [0] = 0;
     70         image_size = info->strides [0] * aligned_height;
     71         break;
     72     case V4L2_PIX_FMT_RGB565:
     73         info->color_bits = 16;
     74         info->components = 1;
     75         info->strides [0] = aligned_width * 2;
     76         info->offsets [0] = 0;
     77         image_size = info->strides [0] * aligned_height;
     78         break;
     79     case V4L2_PIX_FMT_RGB24:
     80         info->color_bits = 8;
     81         info->components = 1;
     82         info->strides [0] = aligned_width * 3;
     83         info->offsets [0] = 0;
     84         image_size = info->strides [0] * aligned_height;
     85         break;
     86         // memory order RGBA 8-8-8-8
     87     case V4L2_PIX_FMT_RGBA32:
     88         // memory order: BGRA 8-8-8-8
     89     case V4L2_PIX_FMT_XBGR32:
     90     case V4L2_PIX_FMT_ABGR32:
     91     case V4L2_PIX_FMT_BGR32:
     92         // memory order: ARGB 8-8-8-8
     93     case V4L2_PIX_FMT_RGB32:
     94     case V4L2_PIX_FMT_ARGB32:
     95     case V4L2_PIX_FMT_XRGB32:
     96         info->color_bits = 8;
     97         info->components = 1;
     98         info->strides [0] = aligned_width * 4;
     99         info->offsets [0] = 0;
    100         image_size = info->strides [0] * aligned_height;
    101         break;
    102     case XCAM_PIX_FMT_RGB48:
    103         info->color_bits = 16;
    104         info->components = 1;
    105         info->strides [0] = aligned_width * 3 * 2;
    106         info->offsets [0] = 0;
    107         image_size = info->strides [0] * aligned_height;
    108         break;
    109     case XCAM_PIX_FMT_RGBA64:
    110         info->color_bits = 16;
    111         info->components = 1;
    112         info->strides [0] = aligned_width * 4 * 2;
    113         info->offsets [0] = 0;
    114         image_size = info->strides [0] * aligned_height;
    115         break;
    116 
    117     case V4L2_PIX_FMT_SBGGR8:
    118     case V4L2_PIX_FMT_SGBRG8:
    119     case V4L2_PIX_FMT_SGRBG8:
    120     case V4L2_PIX_FMT_SRGGB8:
    121         info->color_bits = 8;
    122         info->components = 1;
    123         info->strides [0] = aligned_width;
    124         info->offsets [0] = 0;
    125         image_size = info->strides [0] * aligned_height;
    126         break;
    127 
    128     case V4L2_PIX_FMT_SBGGR10:
    129     case V4L2_PIX_FMT_SGBRG10:
    130     case V4L2_PIX_FMT_SGRBG10:
    131     case V4L2_PIX_FMT_SRGGB10:
    132         info->color_bits = 10;
    133         info->components = 1;
    134         info->strides [0] = aligned_width * 2;
    135         info->offsets [0] = 0;
    136         image_size = info->strides [0] * aligned_height;
    137         break;
    138 
    139     case V4L2_PIX_FMT_SBGGR12:
    140     case V4L2_PIX_FMT_SGBRG12:
    141     case V4L2_PIX_FMT_SGRBG12:
    142     case V4L2_PIX_FMT_SRGGB12:
    143         info->color_bits = 12;
    144         info->components = 1;
    145         info->strides [0] = aligned_width * 2;
    146         info->offsets [0] = 0;
    147         image_size = info->strides [0] * aligned_height;
    148         break;
    149 
    150     case V4L2_PIX_FMT_SBGGR16:
    151     case XCAM_PIX_FMT_SGRBG16:
    152         info->color_bits = 16;
    153         info->components = 1;
    154         info->strides [0] = aligned_width * 2;
    155         info->offsets [0] = 0;
    156         image_size = info->strides [0] * aligned_height;
    157         break;
    158 
    159     case XCAM_PIX_FMT_LAB:
    160         info->color_bits = 8;
    161         info->components = 1;
    162         info->strides [0] = aligned_width * 3;
    163         info->offsets [0] = 0;
    164         image_size = info->strides [0] * aligned_height;
    165         break;
    166 
    167     case XCAM_PIX_FMT_RGB48_planar:
    168     case XCAM_PIX_FMT_RGB24_planar:
    169         if (XCAM_PIX_FMT_RGB48_planar == format)
    170             info->color_bits = 16;
    171         else
    172             info->color_bits = 8;
    173         info->components = 3;
    174         info->strides [0] = info->strides [1] = info->strides [2] = aligned_width * (info->color_bits / 8);
    175         info->offsets [0] = 0;
    176         info->offsets [1] = info->offsets [0] + info->strides [0] * aligned_height;
    177         info->offsets [2] = info->offsets [1] + info->strides [1] * aligned_height;
    178         image_size = info->offsets [2] + info->strides [2] * aligned_height;
    179         break;
    180 
    181     case XCAM_PIX_FMT_SGRBG16_planar:
    182     case XCAM_PIX_FMT_SGRBG8_planar:
    183         if (XCAM_PIX_FMT_SGRBG16_planar == format)
    184             info->color_bits = 16;
    185         else
    186             info->color_bits = 8;
    187         info->components = 4;
    188         for (i = 0; i < info->components; ++i) {
    189             info->strides [i] = aligned_width * (info->color_bits / 8);
    190         }
    191         info->offsets [0] = 0;
    192         for (i = 1; i < info->components; ++i) {
    193             info->offsets [i] = info->offsets [i - 1] + info->strides [i - 1] * aligned_height;
    194         }
    195         image_size = info->offsets [info->components - 1] + info->strides [info->components - 1] * aligned_height;
    196         break;
    197 
    198     default:
    199         XCAM_LOG_WARNING ("XCamVideoBufferInfo reset failed, unsupported format:%s", xcam_fourcc_to_string (format));
    200         return XCAM_RETURN_ERROR_PARAM;
    201     }
    202 
    203     if (!size)
    204         info->size = image_size;
    205     else {
    206         XCAM_ASSERT (size >= image_size);
    207         info->size = size;
    208     }
    209 
    210     return XCAM_RETURN_NO_ERROR;
    211 }
    212 
    213 XCamReturn
    214 xcam_video_buffer_get_planar_info (
    215     const XCamVideoBufferInfo *buf_info,  XCamVideoBufferPlanarInfo *planar_info, const uint32_t index)
    216 {
    217     XCAM_ASSERT (buf_info);
    218     XCAM_ASSERT (planar_info);
    219 
    220     planar_info->width = buf_info->width;
    221     planar_info->height = buf_info->height;
    222     planar_info->pixel_bytes = XCAM_ALIGN_UP (buf_info->color_bits, 8) / 8;
    223 
    224     switch (buf_info->format) {
    225     case V4L2_PIX_FMT_NV12:
    226         XCAM_ASSERT (index <= 1);
    227         if (index == 1) {
    228             planar_info->height = buf_info->height / 2;
    229         }
    230         break;
    231 
    232     case V4L2_PIX_FMT_GREY:
    233     case V4L2_PIX_FMT_YUYV:
    234     case V4L2_PIX_FMT_RGB565:
    235     case V4L2_PIX_FMT_SBGGR8:
    236     case V4L2_PIX_FMT_SGBRG8:
    237     case V4L2_PIX_FMT_SGRBG8:
    238     case V4L2_PIX_FMT_SRGGB8:
    239     case V4L2_PIX_FMT_SBGGR10:
    240     case V4L2_PIX_FMT_SGBRG10:
    241     case V4L2_PIX_FMT_SGRBG10:
    242     case V4L2_PIX_FMT_SRGGB10:
    243     case V4L2_PIX_FMT_SBGGR12:
    244     case V4L2_PIX_FMT_SGBRG12:
    245     case V4L2_PIX_FMT_SGRBG12:
    246     case V4L2_PIX_FMT_SRGGB12:
    247     case V4L2_PIX_FMT_SBGGR16:
    248     case XCAM_PIX_FMT_SGRBG16:
    249         XCAM_ASSERT (index <= 0);
    250         break;
    251 
    252     case V4L2_PIX_FMT_RGB24:
    253         XCAM_ASSERT (index <= 0);
    254         planar_info->pixel_bytes = 3;
    255         break;
    256 
    257     case V4L2_PIX_FMT_RGBA32:
    258     case V4L2_PIX_FMT_XBGR32:
    259     case V4L2_PIX_FMT_ABGR32:
    260     case V4L2_PIX_FMT_BGR32:
    261     case V4L2_PIX_FMT_RGB32:
    262     case V4L2_PIX_FMT_ARGB32:
    263     case V4L2_PIX_FMT_XRGB32:
    264         XCAM_ASSERT (index <= 0);
    265         planar_info->pixel_bytes = 4;
    266         break;
    267 
    268     case XCAM_PIX_FMT_RGB48:
    269         XCAM_ASSERT (index <= 0);
    270         planar_info->pixel_bytes = 3 * 2;
    271         break;
    272 
    273     case XCAM_PIX_FMT_RGBA64:
    274         planar_info->pixel_bytes = 4 * 2;
    275         break;
    276 
    277     case XCAM_PIX_FMT_LAB:
    278         planar_info->pixel_bytes = 3;
    279         break;
    280 
    281     case XCAM_PIX_FMT_RGB48_planar:
    282     case XCAM_PIX_FMT_RGB24_planar:
    283         XCAM_ASSERT (index <= 2);
    284         break;
    285 
    286     case XCAM_PIX_FMT_SGRBG16_planar:
    287     case XCAM_PIX_FMT_SGRBG8_planar:
    288         XCAM_ASSERT (index <= 3);
    289         break;
    290 
    291     default:
    292         XCAM_LOG_WARNING ("VideoBufferInfo get_planar_info failed, unsupported format:%s", xcam_fourcc_to_string (buf_info->format));
    293         return XCAM_RETURN_ERROR_PARAM;
    294     }
    295 
    296     return XCAM_RETURN_NO_ERROR;
    297 }
    298