blob: 0b18cec5bebac03a62e2a4ecbdd98c8a08f7018d [file] [log] [blame]
/*
* Copyright (C) 2016-2017 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.
*/
#define LOG_TAG "V4l2Format"
#include <string>
#include <sstream>
#include "LogHelper.h"
#include "Camera3V4l2Format.h"
namespace cros {
namespace intel {
const struct CameraFormatBridge sV4L2PixelFormatBridge[] = {
{
.pixelformat = V4L2_PIX_FMT_NV12,
.depth = 12,
.planar = true,
.bayer = false
}, {
.pixelformat = V4L2_PIX_FMT_YUV420,
.depth = 12,
.planar = true,
.bayer = false
}, {
.pixelformat = V4L2_PIX_FMT_YVU420,
.depth = 12,
.planar = true,
.bayer = false
}, {
.pixelformat = V4L2_PIX_FMT_YUV422P,
.depth = 16,
.planar = true,
.bayer = false
}, {
.pixelformat = V4L2_PIX_FMT_YUV444,
.depth = 24,
.planar = false,
.bayer = false
#ifdef V4L2_PIX_FMT_YUYV420_V32
}, {
.pixelformat = V4L2_PIX_FMT_YUYV420_V32,
.depth = 24,
.planar = true,
.bayer = false
#endif
}, {
.pixelformat = V4L2_PIX_FMT_NV21,
.depth = 12,
.planar = true,
.bayer = false
}, {
.pixelformat = V4L2_PIX_FMT_NV16,
.depth = 16,
.planar = true,
.bayer = false
}, {
.pixelformat = V4L2_PIX_FMT_YUYV,
.depth = 16,
.planar = false,
.bayer = false
}, {
.pixelformat = V4L2_PIX_FMT_UYVY,
.depth = 16,
.planar = false,
.bayer = false
}, { /* This one is for parallel sensors! DO NOT USE! */
.pixelformat = V4L2_PIX_FMT_UYVY,
.depth = 16,
.planar = false,
.bayer = false
}, {
.pixelformat = V4L2_PIX_FMT_SBGGR16,
.depth = 16,
.planar = false,
.bayer = true
}, {
.pixelformat = V4L2_PIX_FMT_SBGGR8,
.depth = 8,
.planar = false,
.bayer = true
}, {
.pixelformat = V4L2_PIX_FMT_SGBRG8,
.depth = 8,
.planar = false,
.bayer = true
}, {
.pixelformat = V4L2_PIX_FMT_SGRBG8,
.depth = 8,
.planar = false,
.bayer = true
}, {
.pixelformat = V4L2_PIX_FMT_SRGGB8,
.depth = 8,
.planar = false,
.bayer = true
}, {
.pixelformat = V4L2_PIX_FMT_SBGGR10,
.depth = 16,
.planar = false,
.bayer = true
}, {
.pixelformat = V4L2_PIX_FMT_SGBRG10,
.depth = 16,
.planar = false,
.bayer = true
}, {
.pixelformat = V4L2_PIX_FMT_SGRBG10,
.depth = 16,
.planar = false,
.bayer = true
}, {
.pixelformat = V4L2_PIX_FMT_SRGGB10,
.depth = 16,
.planar = false,
.bayer = true
#ifdef V4L2_PIX_FMT_SBGGR10P
}, {
.pixelformat = V4L2_PIX_FMT_SBGGR10P,
.depth = 12,
.planar = false,
.bayer = true
#endif
#ifdef V4L2_PIX_FMT_SGBRG10P
}, {
.pixelformat = V4L2_PIX_FMT_SGBRG10P,
.depth = 12,
.planar = false,
.bayer = true
#endif
#ifdef V4L2_PIX_FMT_SGRBG10P
}, {
.pixelformat = V4L2_PIX_FMT_SGRBG10P,
.depth = 12,
.planar = false,
.bayer = true
#endif
#ifdef V4L2_PIX_FMT_SRGGB10P
}, {
.pixelformat = V4L2_PIX_FMT_SRGGB10P,
.depth = 12,
.planar = false,
.bayer = true
#endif
#ifdef V4L2_PIX_FMT_CIO2_SRGGB10
}, {
.pixelformat = V4L2_PIX_FMT_CIO2_SRGGB10,
.depth = 12,
.planar = false,
.bayer = true
#endif
}, {
.pixelformat = V4L2_PIX_FMT_SBGGR12,
.depth = 16,
.planar = false,
.bayer = true
}, {
.pixelformat = V4L2_PIX_FMT_SGBRG12,
.depth = 16,
.planar = false,
.bayer = true
}, {
.pixelformat = V4L2_PIX_FMT_SGRBG12,
.depth = 16,
.planar = false,
.bayer = true
}, {
.pixelformat = V4L2_PIX_FMT_SRGGB12,
.depth = 16,
.planar = false,
.bayer = true
#ifdef V4L2_PIX_FMT_SGRBG12V32
}, {
.pixelformat = V4L2_PIX_FMT_SGRBG12V32,
.depth = 16,
.planar = false,
.bayer = true
#endif
}, {
.pixelformat = V4L2_PIX_FMT_RGB32,
.depth = 32,
.planar = false,
.bayer = true
}, {
.pixelformat = V4L2_PIX_FMT_RGB565,
.depth = 16,
.planar = false,
.bayer = true
}, {
.pixelformat = V4L2_PIX_FMT_JPEG,
.depth = 8,
.planar = false,
.bayer = false
},{
.pixelformat = V4L2_PIX_FMT_MJPEG,
.depth = 8,
.planar = false,
.bayer = false
},
};
/**
* returns sCameraFormatBrige* for given V4L2 pixelformat (fourcc)
*/
const struct CameraFormatBridge* getCameraFormatBridge(unsigned int fourcc)
{
unsigned int i;
for (i = 0;i < sizeof(sV4L2PixelFormatBridge)/sizeof(CameraFormatBridge);i++) {
if (fourcc == sV4L2PixelFormatBridge[i].pixelformat)
return &sV4L2PixelFormatBridge[i];
}
LOG1("Unkown pixel format %d being used, use NV12 as default", fourcc);
return &sV4L2PixelFormatBridge[0];
}
bool isBayerFormat(int fourcc)
{
const CameraFormatBridge* afb = getCameraFormatBridge(fourcc);
return afb->bayer;
}
int pixelsToBytes(int fourcc, int pixels)
{
const CameraFormatBridge* afb = getCameraFormatBridge(fourcc);
if (afb->planar) {
// All our planar YUV formats are with depth 8 luma
// and here byte means one pixel. Chroma planes are
// to be handled according to fourcc respectively
return pixels;
}
return ALIGN8(afb->depth * pixels) / 8;
}
int bytesToPixels(int fourcc, int bytes)
{
const CameraFormatBridge* afb = getCameraFormatBridge(fourcc);
if (afb->planar) {
// All our planar YUV formats are with depth 8 luma
// and here byte means one pixel. Chroma planes are
// to be handled according to fourcc respectively
return bytes;
}
return (bytes * 8) / afb->depth;
}
int frameSize(int fourcc, int width, int height)
{
// JPEG buffers are generated from HAL_PIXEL_FORMAT_BLOB, where
// the "stride" (width here)is the full size of the buffer in bytes, so use it
// as the buffer size.
if (fourcc == V4L2_PIX_FMT_JPEG)
return width;
const CameraFormatBridge* afb = getCameraFormatBridge(fourcc);
return height * ALIGN8(afb->depth * width) / 8;
}
const char* v4l2Fmt2Str(int format)
{
static char fourccBuf[5];
CLEAR(fourccBuf);
char *fourccPtr = (char*) &format;
std::ostringstream stringStream;
stringStream << *fourccPtr << *(fourccPtr+1) << *(fourccPtr+2) << *(fourccPtr+3);
std::string str = stringStream.str();
const char *tmp = str.c_str();
MEMCPY_S(fourccBuf, sizeof(fourccBuf), tmp, str.length());
fourccBuf[4] = '\0';
return fourccBuf;
}
} /* namespace intel */
} /* namespace cros */