summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-05-01 04:59:54 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-05-04 01:06:22 +0300
commit28382ff2b181441334f2ccbb3ce82ae491dcc771 (patch)
treef70ae93e130763738cbef48c091076bae256e2c2
parent977cfbd526f2da1cfce5c5c2b187c83af3d3efdc (diff)
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>
-rw-r--r--src/qcam/format_converter.cpp52
-rw-r--r--src/qcam/format_converter.h8
2 files changed, 59 insertions, 1 deletions
diff --git a/src/qcam/format_converter.cpp b/src/qcam/format_converter.cpp
index bda9057e..d9088c38 100644
--- a/src/qcam/format_converter.cpp
+++ b/src/qcam/format_converter.cpp
@@ -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)
diff --git a/src/qcam/format_converter.h b/src/qcam/format_converter.h
index 396d0bea..76cd9f1c 100644
--- a/src/qcam/format_converter.h
+++ b/src/qcam/format_converter.h
@@ -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_;
};