| /* |
| * video_buffer.cpp - video buffer base |
| * |
| * Copyright (c) 2014-2015 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 "video_buffer.h" |
| #include <linux/videodev2.h> |
| |
| namespace XCam { |
| |
| VideoBufferInfo::VideoBufferInfo () |
| : format (0) |
| , color_bits (8) |
| , width (0) |
| , height (0) |
| , aligned_width (0) |
| , aligned_height (0) |
| , size (0) |
| , components (0) |
| { |
| xcam_mem_clear (strides); |
| xcam_mem_clear (offsets); |
| } |
| |
| bool |
| VideoBufferInfo::init ( |
| uint32_t format, |
| uint32_t width, uint32_t height, |
| uint32_t alignment_w, uint32_t alignment_h) |
| { |
| XCAM_ASSERT ((alignment_w & (alignment_w - 1)) == 0 && alignment_w != 0); |
| XCAM_ASSERT ((alignment_h & (alignment_h - 1)) == 0 && alignment_h != 0); |
| |
| uint32_t final_width = XCAM_ALIGN_UP (width, alignment_w); |
| uint32_t final_height = XCAM_ALIGN_UP (height, alignment_h); |
| |
| this->format = format; |
| this->width = width; |
| this->height = height; |
| this->aligned_width = final_width; |
| this->aligned_height = final_height; |
| |
| switch (format) { |
| case V4L2_PIX_FMT_NV12: |
| this->color_bits = 8; |
| this->components = 2; |
| this->strides [0] = final_width; |
| this->strides [1] = this->strides [0]; |
| this->offsets [0] = 0; |
| this->offsets [1] = this->offsets [0] + this->strides [0] * final_height; |
| this->size = this->strides [0] * final_height + this->strides [1] * final_height / 2; |
| break; |
| case V4L2_PIX_FMT_YUYV: |
| this->color_bits = 8; |
| this->components = 1; |
| this->strides [0] = final_width * 2; |
| this->offsets [0] = 0; |
| this->size = this->strides [0] * final_height; |
| break; |
| case V4L2_PIX_FMT_RGB565: |
| this->color_bits = 16; |
| this->components = 1; |
| this->strides [0] = final_width * 2; |
| this->offsets [0] = 0; |
| this->size = this->strides [0] * final_height; |
| break; |
| case V4L2_PIX_FMT_RGB24: |
| this->color_bits = 8; |
| this->components = 1; |
| this->strides [0] = final_width * 3; |
| this->offsets [0] = 0; |
| this->size = this->strides [0] * final_height; |
| break; |
| // memory order: BGRA |
| case V4L2_PIX_FMT_XBGR32: |
| case V4L2_PIX_FMT_ABGR32: |
| case V4L2_PIX_FMT_BGR32: |
| // memory order: ARGB |
| case V4L2_PIX_FMT_RGB32: |
| case V4L2_PIX_FMT_ARGB32: |
| case V4L2_PIX_FMT_XRGB32: |
| this->color_bits = 8; |
| this->components = 1; |
| this->strides [0] = final_width * 4; |
| this->offsets [0] = 0; |
| this->size = this->strides [0] * final_height; |
| break; |
| case XCAM_PIX_FMT_RGB48: |
| this->color_bits = 16; |
| this->components = 1; |
| this->strides [0] = final_width * 3 * 2; |
| this->offsets [0] = 0; |
| this->size = this->strides [0] * final_height; |
| break; |
| case XCAM_PIX_FMT_RGBA64: |
| this->color_bits = 16; |
| this->components = 1; |
| this->strides [0] = final_width * 4 * 2; |
| this->offsets [0] = 0; |
| this->size = this->strides [0] * final_height; |
| break; |
| |
| case V4L2_PIX_FMT_SBGGR8: |
| case V4L2_PIX_FMT_SGBRG8: |
| case V4L2_PIX_FMT_SGRBG8: |
| case V4L2_PIX_FMT_SRGGB8: |
| this->color_bits = 8; |
| this->components = 1; |
| this->strides [0] = final_width; |
| this->offsets [0] = 0; |
| this->size = this->strides [0] * final_height; |
| break; |
| |
| case V4L2_PIX_FMT_SBGGR10: |
| case V4L2_PIX_FMT_SGBRG10: |
| case V4L2_PIX_FMT_SGRBG10: |
| case V4L2_PIX_FMT_SRGGB10: |
| this->color_bits = 10; |
| this->components = 1; |
| this->strides [0] = final_width * 2; |
| this->offsets [0] = 0; |
| this->size = this->strides [0] * final_height; |
| break; |
| |
| case V4L2_PIX_FMT_SBGGR12: |
| case V4L2_PIX_FMT_SGBRG12: |
| case V4L2_PIX_FMT_SGRBG12: |
| case V4L2_PIX_FMT_SRGGB12: |
| this->color_bits = 12; |
| this->components = 1; |
| this->strides [0] = final_width * 2; |
| this->offsets [0] = 0; |
| this->size = this->strides [0] * final_height; |
| break; |
| |
| case V4L2_PIX_FMT_SBGGR16: |
| case XCAM_PIX_FMT_SGRBG16: |
| this->color_bits = 16; |
| this->components = 1; |
| this->strides [0] = final_width * 2; |
| this->offsets [0] = 0; |
| this->size = this->strides [0] * final_height; |
| break; |
| |
| case XCAM_PIX_FMT_LAB: |
| this->color_bits = 32; |
| this->components = 1; |
| this->strides [0] = final_width * 3 * 4; |
| this->offsets [0] = 0; |
| this->size = this->strides [0] * final_height; |
| break; |
| default: |
| XCAM_LOG_WARNING ("VideoBufferInfo init failed, unsupported format:%s", xcam_fourcc_to_string (format)); |
| return false; |
| } |
| |
| return true; |
| } |
| |
| }; |