diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-05-01 04:59:54 +0300 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-05-04 01:06:22 +0300 |
commit | 28382ff2b181441334f2ccbb3ce82ae491dcc771 (patch) | |
tree | f70ae93e130763738cbef48c091076bae256e2c2 /src | |
parent | 977cfbd526f2da1cfce5c5c2b187c83af3d3efdc (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>
Diffstat (limited to 'src')
-rw-r--r-- | src/qcam/format_converter.cpp | 52 | ||||
-rw-r--r-- | src/qcam/format_converter.h | 8 |
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_; }; |