/*
|
* xcam_buffer.cpp - video buffer standard version
|
*
|
* Copyright (c) 2016 Intel Corporation
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*
|
* Author: Wind Yuan <feng.yuan@intel.com>
|
*/
|
|
#include <base/xcam_buffer.h>
|
#include <xcam_log.h>
|
|
XCamReturn
|
xcam_video_buffer_info_reset (
|
XCamVideoBufferInfo *info,
|
uint32_t format,
|
uint32_t width, uint32_t height,
|
uint32_t aligned_width, uint32_t aligned_height, uint32_t size, bool compacted)
|
{
|
uint32_t image_size = 0;
|
uint32_t i = 0;
|
|
XCAM_ASSERT (info && format);
|
XCAM_ASSERT (!aligned_width || aligned_width >= width);
|
XCAM_ASSERT (!aligned_height || aligned_height >= height);
|
|
if (!aligned_width)
|
aligned_width = XCAM_ALIGN_UP (width, 4);
|
if (!aligned_height)
|
aligned_height = XCAM_ALIGN_UP (height, 2);
|
|
info->format = format;
|
info->width = width;
|
info->height = height;
|
info->aligned_width = aligned_width;
|
info->aligned_height = aligned_height;
|
|
switch (format) {
|
case V4L2_PIX_FMT_GREY:
|
info->color_bits = 8;
|
info->components = 1;
|
info->strides [0] = aligned_width;
|
info->offsets [0] = 0;
|
image_size = info->strides [0] * aligned_height;
|
break;
|
case V4L2_PIX_FMT_NV12:
|
case V4L2_PIX_FMT_NV21:
|
info->color_bits = 8;
|
info->components = 2;
|
info->strides [0] = aligned_width;
|
info->strides [1] = info->strides [0];
|
info->offsets [0] = 0;
|
info->offsets [1] = info->offsets [0] + info->strides [0] * aligned_height;
|
image_size = info->strides [0] * aligned_height + info->strides [1] * aligned_height / 2;
|
break;
|
case V4L2_PIX_FMT_YUYV:
|
info->color_bits = 8;
|
info->components = 1;
|
info->strides [0] = aligned_width * 2;
|
info->offsets [0] = 0;
|
image_size = info->strides [0] * aligned_height;
|
break;
|
case V4L2_PIX_FMT_RGB565:
|
info->color_bits = 16;
|
info->components = 1;
|
info->strides [0] = aligned_width * 2;
|
info->offsets [0] = 0;
|
image_size = info->strides [0] * aligned_height;
|
break;
|
case V4L2_PIX_FMT_RGB24:
|
info->color_bits = 8;
|
info->components = 1;
|
info->strides [0] = aligned_width * 3;
|
info->offsets [0] = 0;
|
image_size = info->strides [0] * aligned_height;
|
break;
|
// memory order RGBA 8-8-8-8
|
case V4L2_PIX_FMT_RGBA32:
|
// memory order: BGRA 8-8-8-8
|
case V4L2_PIX_FMT_XBGR32:
|
case V4L2_PIX_FMT_ABGR32:
|
case V4L2_PIX_FMT_BGR32:
|
// memory order: ARGB 8-8-8-8
|
case V4L2_PIX_FMT_RGB32:
|
case V4L2_PIX_FMT_ARGB32:
|
case V4L2_PIX_FMT_XRGB32:
|
info->color_bits = 8;
|
info->components = 1;
|
info->strides [0] = aligned_width * 4;
|
info->offsets [0] = 0;
|
image_size = info->strides [0] * aligned_height;
|
break;
|
case XCAM_PIX_FMT_RGB48:
|
info->color_bits = 16;
|
info->components = 1;
|
info->strides [0] = aligned_width * 3 * 2;
|
info->offsets [0] = 0;
|
image_size = info->strides [0] * aligned_height;
|
break;
|
case XCAM_PIX_FMT_RGBA64:
|
info->color_bits = 16;
|
info->components = 1;
|
info->strides [0] = aligned_width * 4 * 2;
|
info->offsets [0] = 0;
|
image_size = info->strides [0] * aligned_height;
|
break;
|
|
case V4L2_PIX_FMT_SBGGR8:
|
case V4L2_PIX_FMT_SGBRG8:
|
case V4L2_PIX_FMT_SGRBG8:
|
case V4L2_PIX_FMT_SRGGB8:
|
info->color_bits = 8;
|
info->components = 1;
|
if (compacted)
|
info->strides [0] = XCAM_ALIGN_UP(aligned_width, 256);
|
else
|
info->strides [0] = aligned_width;
|
info->offsets [0] = 0;
|
image_size = info->strides [0] * aligned_height;
|
break;
|
|
case V4L2_PIX_FMT_SBGGR10:
|
case V4L2_PIX_FMT_SGBRG10:
|
case V4L2_PIX_FMT_SGRBG10:
|
case V4L2_PIX_FMT_SRGGB10:
|
info->color_bits = 10;
|
info->components = 1;
|
if (compacted)
|
info->strides [0] = XCAM_ALIGN_UP((aligned_width * info->color_bits) / 8, 256);
|
else
|
info->strides [0] = aligned_width * 2;
|
info->offsets [0] = 0;
|
image_size = info->strides [0] * aligned_height;
|
break;
|
|
case V4L2_PIX_FMT_SBGGR12:
|
case V4L2_PIX_FMT_SGBRG12:
|
case V4L2_PIX_FMT_SGRBG12:
|
case V4L2_PIX_FMT_SRGGB12:
|
info->color_bits = 12;
|
info->components = 1;
|
if (compacted)
|
info->strides [0] = XCAM_ALIGN_UP((aligned_width * info->color_bits) / 8, 256);
|
else
|
info->strides [0] = aligned_width * 2;
|
info->offsets [0] = 0;
|
image_size = info->strides [0] * aligned_height;
|
break;
|
|
case V4L2_PIX_FMT_SBGGR16:
|
case XCAM_PIX_FMT_SGRBG16:
|
info->color_bits = 16;
|
info->components = 1;
|
if (compacted)
|
info->strides [0] = XCAM_ALIGN_UP((aligned_width * 2), 256);
|
else
|
info->strides [0] = aligned_width * 2;
|
info->offsets [0] = 0;
|
image_size = info->strides [0] * aligned_height;
|
break;
|
|
case XCAM_PIX_FMT_LAB:
|
info->color_bits = 8;
|
info->components = 1;
|
info->strides [0] = aligned_width * 3;
|
info->offsets [0] = 0;
|
image_size = info->strides [0] * aligned_height;
|
break;
|
|
case XCAM_PIX_FMT_RGB48_planar:
|
case XCAM_PIX_FMT_RGB24_planar:
|
if (XCAM_PIX_FMT_RGB48_planar == format)
|
info->color_bits = 16;
|
else
|
info->color_bits = 8;
|
info->components = 3;
|
info->strides [0] = info->strides [1] = info->strides [2] = aligned_width * (info->color_bits / 8);
|
info->offsets [0] = 0;
|
info->offsets [1] = info->offsets [0] + info->strides [0] * aligned_height;
|
info->offsets [2] = info->offsets [1] + info->strides [1] * aligned_height;
|
image_size = info->offsets [2] + info->strides [2] * aligned_height;
|
break;
|
|
case XCAM_PIX_FMT_SGRBG16_planar:
|
case XCAM_PIX_FMT_SGRBG8_planar:
|
if (XCAM_PIX_FMT_SGRBG16_planar == format)
|
info->color_bits = 16;
|
else
|
info->color_bits = 8;
|
info->components = 4;
|
for (i = 0; i < info->components; ++i) {
|
info->strides [i] = aligned_width * (info->color_bits / 8);
|
}
|
info->offsets [0] = 0;
|
for (i = 1; i < info->components; ++i) {
|
info->offsets [i] = info->offsets [i - 1] + info->strides [i - 1] * aligned_height;
|
}
|
image_size = info->offsets [info->components - 1] + info->strides [info->components - 1] * aligned_height;
|
break;
|
|
default:
|
XCAM_LOG_WARNING ("XCamVideoBufferInfo reset failed, unsupported format:%s", xcam_fourcc_to_string (format));
|
return XCAM_RETURN_ERROR_PARAM;
|
}
|
|
if (!size)
|
info->size = image_size;
|
else {
|
XCAM_ASSERT (size >= image_size);
|
info->size = size;
|
}
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
XCamReturn
|
xcam_video_buffer_get_planar_info (
|
const XCamVideoBufferInfo *buf_info, XCamVideoBufferPlanarInfo *planar_info, const uint32_t index)
|
{
|
XCAM_ASSERT (buf_info);
|
XCAM_ASSERT (planar_info);
|
|
planar_info->width = buf_info->width;
|
planar_info->height = buf_info->height;
|
planar_info->pixel_bytes = XCAM_ALIGN_UP (buf_info->color_bits, 8) / 8;
|
|
switch (buf_info->format) {
|
case V4L2_PIX_FMT_NV12:
|
XCAM_ASSERT (index <= 1);
|
if (index == 1) {
|
planar_info->height = buf_info->height / 2;
|
}
|
break;
|
|
case V4L2_PIX_FMT_GREY:
|
case V4L2_PIX_FMT_YUYV:
|
case V4L2_PIX_FMT_RGB565:
|
case V4L2_PIX_FMT_SBGGR8:
|
case V4L2_PIX_FMT_SGBRG8:
|
case V4L2_PIX_FMT_SGRBG8:
|
case V4L2_PIX_FMT_SRGGB8:
|
case V4L2_PIX_FMT_SBGGR10:
|
case V4L2_PIX_FMT_SGBRG10:
|
case V4L2_PIX_FMT_SGRBG10:
|
case V4L2_PIX_FMT_SRGGB10:
|
case V4L2_PIX_FMT_SBGGR12:
|
case V4L2_PIX_FMT_SGBRG12:
|
case V4L2_PIX_FMT_SGRBG12:
|
case V4L2_PIX_FMT_SRGGB12:
|
case V4L2_PIX_FMT_SBGGR16:
|
case XCAM_PIX_FMT_SGRBG16:
|
XCAM_ASSERT (index <= 0);
|
break;
|
|
case V4L2_PIX_FMT_RGB24:
|
XCAM_ASSERT (index <= 0);
|
planar_info->pixel_bytes = 3;
|
break;
|
|
case V4L2_PIX_FMT_RGBA32:
|
case V4L2_PIX_FMT_XBGR32:
|
case V4L2_PIX_FMT_ABGR32:
|
case V4L2_PIX_FMT_BGR32:
|
case V4L2_PIX_FMT_RGB32:
|
case V4L2_PIX_FMT_ARGB32:
|
case V4L2_PIX_FMT_XRGB32:
|
XCAM_ASSERT (index <= 0);
|
planar_info->pixel_bytes = 4;
|
break;
|
|
case XCAM_PIX_FMT_RGB48:
|
XCAM_ASSERT (index <= 0);
|
planar_info->pixel_bytes = 3 * 2;
|
break;
|
|
case XCAM_PIX_FMT_RGBA64:
|
planar_info->pixel_bytes = 4 * 2;
|
break;
|
|
case XCAM_PIX_FMT_LAB:
|
planar_info->pixel_bytes = 3;
|
break;
|
|
case XCAM_PIX_FMT_RGB48_planar:
|
case XCAM_PIX_FMT_RGB24_planar:
|
XCAM_ASSERT (index <= 2);
|
break;
|
|
case XCAM_PIX_FMT_SGRBG16_planar:
|
case XCAM_PIX_FMT_SGRBG8_planar:
|
XCAM_ASSERT (index <= 3);
|
break;
|
|
default:
|
XCAM_LOG_WARNING ("VideoBufferInfo get_planar_info failed, unsupported format:%s", xcam_fourcc_to_string (buf_info->format));
|
return XCAM_RETURN_ERROR_PARAM;
|
}
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|