qcam: format_converter: Add RGB formats support
Add support for the RGB format supported by VIMC (V4L2_PIX_FMT_BGR24, V4L2_PIX_FMT_RGB24 and V4L2_PIX_FMT_ARGB32). Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
This commit is contained in:
@@ -31,23 +31,49 @@ int FormatConverter::configure(unsigned int format, unsigned int width,
|
||||
unsigned int height)
|
||||
{
|
||||
switch (format) {
|
||||
case V4L2_PIX_FMT_BGR24:
|
||||
yuv_ = false;
|
||||
r_pos_ = 2;
|
||||
g_pos_ = 1;
|
||||
b_pos_ = 0;
|
||||
bpp_ = 3;
|
||||
break;
|
||||
case V4L2_PIX_FMT_RGB24:
|
||||
yuv_ = false;
|
||||
r_pos_ = 0;
|
||||
g_pos_ = 1;
|
||||
b_pos_ = 2;
|
||||
bpp_ = 3;
|
||||
break;
|
||||
case V4L2_PIX_FMT_ARGB32:
|
||||
yuv_ = false;
|
||||
r_pos_ = 1;
|
||||
g_pos_ = 2;
|
||||
b_pos_ = 3;
|
||||
bpp_ = 4;
|
||||
break;
|
||||
case V4L2_PIX_FMT_VYUY:
|
||||
yuv_ = true;
|
||||
y_pos_ = 1;
|
||||
cb_pos_ = 2;
|
||||
break;
|
||||
case V4L2_PIX_FMT_YVYU:
|
||||
yuv_ = true;
|
||||
y_pos_ = 0;
|
||||
cb_pos_ = 3;
|
||||
break;
|
||||
case V4L2_PIX_FMT_UYVY:
|
||||
yuv_ = true;
|
||||
y_pos_ = 1;
|
||||
cb_pos_ = 0;
|
||||
break;
|
||||
case V4L2_PIX_FMT_YUYV:
|
||||
yuv_ = true;
|
||||
y_pos_ = 0;
|
||||
cb_pos_ = 1;
|
||||
break;
|
||||
case V4L2_PIX_FMT_MJPEG:
|
||||
yuv_ = false;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@@ -65,8 +91,32 @@ void FormatConverter::convert(const unsigned char *src, size_t size,
|
||||
{
|
||||
if (format_ == V4L2_PIX_FMT_MJPEG)
|
||||
dst->loadFromData(src, size, "JPEG");
|
||||
else
|
||||
else if (yuv_)
|
||||
convertYUV(src, dst->bits());
|
||||
else
|
||||
convertRGB(src, dst->bits());
|
||||
}
|
||||
|
||||
void FormatConverter::convertRGB(const unsigned char *src, unsigned char *dst)
|
||||
{
|
||||
unsigned int x, y;
|
||||
int r, g, b;
|
||||
|
||||
for (y = 0; y < height_; y++) {
|
||||
for (x = 0; x < width_; x++) {
|
||||
r = src[bpp_ * x + r_pos_];
|
||||
g = src[bpp_ * x + g_pos_];
|
||||
b = src[bpp_ * x + b_pos_];
|
||||
|
||||
dst[4 * x + 0] = b;
|
||||
dst[4 * x + 1] = g;
|
||||
dst[4 * x + 2] = r;
|
||||
dst[4 * x + 3] = 0xff;
|
||||
}
|
||||
|
||||
src += width_ * bpp_;
|
||||
dst += width_ * 4;
|
||||
}
|
||||
}
|
||||
|
||||
static void yuv_to_rgb(int y, int u, int v, int *r, int *g, int *b)
|
||||
|
||||
@@ -20,11 +20,19 @@ public:
|
||||
void convert(const unsigned char *src, size_t size, QImage *dst);
|
||||
|
||||
private:
|
||||
void convertRGB(const unsigned char *src, unsigned char *dst);
|
||||
void convertYUV(const unsigned char *src, unsigned char *dst);
|
||||
|
||||
unsigned int format_;
|
||||
unsigned int width_;
|
||||
unsigned int height_;
|
||||
|
||||
unsigned int bpp_;
|
||||
unsigned int r_pos_;
|
||||
unsigned int g_pos_;
|
||||
unsigned int b_pos_;
|
||||
|
||||
bool yuv_;
|
||||
unsigned int y_pos_;
|
||||
unsigned int cb_pos_;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user