[{"id":17539,"web_url":"https://patchwork.libcamera.org/comment/17539/","msgid":"<YMf4z1rGkDOpQURv@pendragon.ideasonboard.com>","date":"2021-06-15T00:48:15","subject":"Re: [libcamera-devel] [PATCH v3 3/4] qcam: viewfinder_gl: Add\n\tsupport for RAW12 packed formats","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Andrey,\n\nThank you for the patch.\n\nOn Fri, Jun 11, 2021 at 07:27:25PM +0300, Andrey Konovalov wrote:\n> All the four Bayer orders are supported.\n> The 4 LS bits of the 12-bit colour values are dropped as the RGBA\n> format we convert into has only 8 bits per colour.\n> \n> Signed-off-by: Andrey Konovalov <andrey.konovalov@linaro.org>\n> ---\n>  src/qcam/assets/shader/bayer_1x_packed.frag | 43 +++++++++++++++---\n>  src/qcam/viewfinder_gl.cpp                  | 48 ++++++++++++++++++---\n>  2 files changed, 80 insertions(+), 11 deletions(-)\n> \n> diff --git a/src/qcam/assets/shader/bayer_1x_packed.frag b/src/qcam/assets/shader/bayer_1x_packed.frag\n> index 0a87c6db..d09c6fce 100644\n> --- a/src/qcam/assets/shader/bayer_1x_packed.frag\n> +++ b/src/qcam/assets/shader/bayer_1x_packed.frag\n> @@ -23,6 +23,40 @@\n>  precision mediump float;\n>  #endif\n>  \n> +/*\n> + * These constants are used to select the bytes containing the HS part of\n> + * the pixel value:\n> + * BPP - bytes per pixel,\n> + * THRESHOLD_L = fract(BPP) * 0.5 + 0.02\n> + * THRESHOLD_H = 1.0 - fract(BPP) * 1.5 + 0.02\n> + * Let X is the x coordinate in the texture measured in bytes (so that the\n> + * range is from 0 to (stride_-1)) aligned on the nearest pixel.\n> + * E.g. for RAW10P:\n> + * -------------+-------------------+-------------------+--\n> + *  pixel No    |  0   1    2   3   |  4   5    6   7   | ...\n> + * -------------+-------------------+-------------------+--\n> + *  byte offset | 0   1   2   3   4 | 5   6   7   8   9 | ...\n> + * -------------+-------------------+-------------------+--\n> + *      X       | 0.0 1.25 2.5 3.75 | 5.0 6.25 7.5 8.75 | ...\n> + * -------------+-------------------+-------------------+--\n> + * If fract(X) < THRESHOLD_L then the previous byte contains the LS\n> + * bits of the pixel values and needs to be skipped.\n> + * If fract(X) > THRESHOLD_H then the next byte contains the LS bits\n> + * of the pixel values and needs to be skipped.\n> + */\n> +#if defined(RAW10P)\n> +#define BPP 1.25\n> +#define THRESHOLD_L 0.14\n> +#define THRESHOLD_H 0.64\n\nWith the values aligned:\n\n#define BPP\t\t1.25\n#define THRESHOLD_L\t0.14\n#define THRESHOLD_H\t0.64\n\n(and same below),\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +#elif defined(RAW12P)\n> +#define BPP 1.5\n> +#define THRESHOLD_L 0.27\n> +#define THRESHOLD_H 0.27\n> +#else\n> +#error Invalid raw format\n> +#endif\n> +\n> +\n>  varying vec2 textureOut;\n>  \n>  /* the texture size: tex_size.xy is in bytes, tex_size.zw is in pixels */\n> @@ -64,10 +98,7 @@ void main(void)\n>  \t * Add a small number (a few mantissa's LSBs) to avoid float\n>  \t * representation issues. Maybe paranoic.\n>  \t */\n> -\tcenter.x = BPP_X * center.z + 0.02;\n> -\n> -\tconst float threshold_l = 0.127 /* fract(BPP_X) * 0.5 + 0.02 */;\n> -\tconst float threshold_h = 0.625 /* 1.0 - fract(BPP_X) * 1.5 */;\n> +\tcenter.x = BPP * center.z + 0.02;\n>  \n>  \tfloat fract_x = fract(center.x);\n>  \t/*\n> @@ -86,13 +117,13 @@ void main(void)\n>           * of the previous group of the pixels, move xcoords[0] one\n>  \t * byte back.\n>  \t */\n> -\txcoords[0] += (fract_x < threshold_l) ? -tex_step.x : 0.0;\n> +\txcoords[0] += (fract_x < THRESHOLD_L) ? -tex_step.x : 0.0;\n>  \t/*\n>  \t * If xcoords[1] points at the byte containing the LS bits\n>           * of the current group of the pixels, move xcoords[1] one\n>  \t * byte forward.\n>  \t */\n> -\txcoords[1] += (fract_x > threshold_h) ? tex_step.x : 0.0;\n> +\txcoords[1] += (fract_x > THRESHOLD_H) ? tex_step.x : 0.0;\n>  \n>  \tvec2 alternate = mod(center.zw + tex_bayer_first_red, 2.0);\n>  \tbool even_col = alternate.x < 1.0;\n> diff --git a/src/qcam/viewfinder_gl.cpp b/src/qcam/viewfinder_gl.cpp\n> index 44e410c9..dcfaf973 100644\n> --- a/src/qcam/viewfinder_gl.cpp\n> +++ b/src/qcam/viewfinder_gl.cpp\n> @@ -41,6 +41,11 @@ static const QList<libcamera::PixelFormat> supportedFormats{\n>  \tlibcamera::formats::SGBRG10_CSI2P,\n>  \tlibcamera::formats::SGRBG10_CSI2P,\n>  \tlibcamera::formats::SRGGB10_CSI2P,\n> +\t/* Raw Bayer 12-bit packed */\n> +\tlibcamera::formats::SBGGR12_CSI2P,\n> +\tlibcamera::formats::SGBRG12_CSI2P,\n> +\tlibcamera::formats::SGRBG12_CSI2P,\n> +\tlibcamera::formats::SRGGB12_CSI2P,\n>  };\n>  \n>  ViewFinderGL::ViewFinderGL(QWidget *parent)\n> @@ -218,28 +223,56 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)\n>  \tcase libcamera::formats::SBGGR10_CSI2P:\n>  \t\tfirstRed_.setX(1.0);\n>  \t\tfirstRed_.setY(1.0);\n> -\t\tfragmentShaderDefines_.append(\"#define BPP_X 1.25\");\n> +\t\tfragmentShaderDefines_.append(\"#define RAW10P\");\n>  \t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tcase libcamera::formats::SGBRG10_CSI2P:\n>  \t\tfirstRed_.setX(0.0);\n>  \t\tfirstRed_.setY(1.0);\n> -\t\tfragmentShaderDefines_.append(\"#define BPP_X 1.25\");\n> +\t\tfragmentShaderDefines_.append(\"#define RAW10P\");\n>  \t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tcase libcamera::formats::SGRBG10_CSI2P:\n>  \t\tfirstRed_.setX(1.0);\n>  \t\tfirstRed_.setY(0.0);\n> -\t\tfragmentShaderDefines_.append(\"#define BPP_X 1.25\");\n> +\t\tfragmentShaderDefines_.append(\"#define RAW10P\");\n>  \t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n>  \tcase libcamera::formats::SRGGB10_CSI2P:\n>  \t\tfirstRed_.setX(0.0);\n>  \t\tfirstRed_.setY(0.0);\n> -\t\tfragmentShaderDefines_.append(\"#define BPP_X 1.25\");\n> +\t\tfragmentShaderDefines_.append(\"#define RAW10P\");\n> +\t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +\t\ttextureMinMagFilters_ = GL_NEAREST;\n> +\t\tbreak;\n> +\tcase libcamera::formats::SBGGR12_CSI2P:\n> +\t\tfirstRed_.setX(1.0);\n> +\t\tfirstRed_.setY(1.0);\n> +\t\tfragmentShaderDefines_.append(\"#define RAW12P\");\n> +\t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +\t\ttextureMinMagFilters_ = GL_NEAREST;\n> +\t\tbreak;\n> +\tcase libcamera::formats::SGBRG12_CSI2P:\n> +\t\tfirstRed_.setX(0.0);\n> +\t\tfirstRed_.setY(1.0);\n> +\t\tfragmentShaderDefines_.append(\"#define RAW12P\");\n> +\t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +\t\ttextureMinMagFilters_ = GL_NEAREST;\n> +\t\tbreak;\n> +\tcase libcamera::formats::SGRBG12_CSI2P:\n> +\t\tfirstRed_.setX(1.0);\n> +\t\tfirstRed_.setY(0.0);\n> +\t\tfragmentShaderDefines_.append(\"#define RAW12P\");\n> +\t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n> +\t\ttextureMinMagFilters_ = GL_NEAREST;\n> +\t\tbreak;\n> +\tcase libcamera::formats::SRGGB12_CSI2P:\n> +\t\tfirstRed_.setX(0.0);\n> +\t\tfirstRed_.setY(0.0);\n> +\t\tfragmentShaderDefines_.append(\"#define RAW12P\");\n>  \t\tfragmentShaderFile_ = \":bayer_1x_packed.frag\";\n>  \t\ttextureMinMagFilters_ = GL_NEAREST;\n>  \t\tbreak;\n> @@ -595,8 +628,13 @@ void ViewFinderGL::doRender()\n>  \tcase libcamera::formats::SGBRG10_CSI2P:\n>  \tcase libcamera::formats::SGRBG10_CSI2P:\n>  \tcase libcamera::formats::SRGGB10_CSI2P:\n> +\tcase libcamera::formats::SBGGR12_CSI2P:\n> +\tcase libcamera::formats::SGBRG12_CSI2P:\n> +\tcase libcamera::formats::SGRBG12_CSI2P:\n> +\tcase libcamera::formats::SRGGB12_CSI2P:\n>  \t\t/*\n> -\t\t * Packed raw Bayer 10-bit formats are stored in GL_RED texture.\n> +\t\t * Packed raw Bayer 10-bit and 12-bit formats are stored in\n> +\t\t * GL_RED texture.\n>  \t\t * The texture width is equal to the stride.\n>  \t\t */\n>  \t\tglActiveTexture(GL_TEXTURE0);","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 3178CBD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 15 Jun 2021 00:48:39 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A25D268934;\n\tTue, 15 Jun 2021 02:48:38 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CEE0F68925\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 15 Jun 2021 02:48:36 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 487334A3;\n\tTue, 15 Jun 2021 02:48:36 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"m7NWjMa7\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1623718116;\n\tbh=lVtvPugENrY95xyL8Q36jcAeTzqGBK7ZvHZyyOVnLbc=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=m7NWjMa7CVk2VRfgy6Aw99slckz4SV74lI+Bubapa1pa9Xj7SQxb5P5UqYaRd2FQg\n\tcLP7jBEQajiZWa9TeB56B24zybJU9FXk1M2IQlXmk8CvjmvGRqbv9W2yp2OR+5wcSV\n\t/f8zbQCH4X60841LknqTd3ucm2sM1Q2m7zVuO5rY=","Date":"Tue, 15 Jun 2021 03:48:15 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Andrey Konovalov <andrey.konovalov@linaro.org>","Message-ID":"<YMf4z1rGkDOpQURv@pendragon.ideasonboard.com>","References":"<20210611162726.824789-1-andrey.konovalov@linaro.org>\n\t<20210611162726.824789-4-andrey.konovalov@linaro.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20210611162726.824789-4-andrey.konovalov@linaro.org>","Subject":"Re: [libcamera-devel] [PATCH v3 3/4] qcam: viewfinder_gl: Add\n\tsupport for RAW12 packed formats","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"morgan@casual-effects.com, libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]