[libcamera-devel] [PATCH] qcam: format_converter: Add RGB formats support
Paul Elder
paul.elder at ideasonboard.com
Sat May 4 00:05:29 CEST 2019
Hi Laurent,
Thank you for the patch.
On Thu, May 02, 2019 at 07:27:23PM +0300, Laurent Pinchart wrote:
> 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 at ideasonboard.com>
Looks good to me.
Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>
> ---
> src/qcam/format_converter.cpp | 52 ++++++++++++++++++++++++++++++++++-
> src/qcam/format_converter.h | 8 ++++++
> 2 files changed, 59 insertions(+), 1 deletion(-)
>
> diff --git a/src/qcam/format_converter.cpp b/src/qcam/format_converter.cpp
> index bda9057e17b6..d9088c38f0d4 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 396d0bea116a..76cd9f1cab56 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_;
> };
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
More information about the libcamera-devel
mailing list