[{"id":30120,"web_url":"https://patchwork.libcamera.org/comment/30120/","msgid":"<171957170829.392292.4370631091323523098@ping.linuxembedded.co.uk>","date":"2024-06-28T10:48:28","subject":"Re: [PATCH v2 3/3] apps: common: dng_writer: Support RAW10 and RAW12\n\tformat","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Stefan Klug (2024-06-28 11:01:45)\n> Add support for RAW10 and RAW12 to the dng_writer. This is needed on\n> imx8mp to produce tuning images.  Both formats were tested on a debix\n> som with a imx335.\n> \n> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> ---\n>  src/apps/common/dng_writer.cpp | 76 ++++++++++++++++++++++++++++++++++\n>  1 file changed, 76 insertions(+)\n> \n> diff --git a/src/apps/common/dng_writer.cpp b/src/apps/common/dng_writer.cpp\n> index 474aa72beb92..f61930b68b2b 100644\n> --- a/src/apps/common/dng_writer.cpp\n> +++ b/src/apps/common/dng_writer.cpp\n> @@ -136,6 +136,34 @@ void packScanlineRaw8(void *output, const void *input, unsigned int width)\n>         std::copy(in, in + width, out);\n>  }\n>  \n> +void packScanlineRaw10(void *output, const void *input, unsigned int width)\n> +{\n> +       const uint16_t *in = static_cast<const uint16_t *>(input);\n> +       uint8_t *out = static_cast<uint8_t *>(output);\n> +\n> +       for (unsigned int i = 0; i < width; i += 4) {\n> +               *out++ = (in[0] & 0x3fc) >> 2;\n> +               *out++ = (in[0] & 0x003) << 6 | (in[1] & 0x3f0) >> 4;\n> +               *out++ = (in[1] & 0x00f) << 4 | (in[2] & 0x3c0) >> 6;\n> +               *out++ = (in[2] & 0x03f) << 2 | (in[3] & 0x300) >> 8;\n> +               *out++ = (in[3] & 0x0ff);\n> +               in += 4;\n> +       }\n> +}\n> +\n> +void packScanlineRaw12(void *output, const void *input, unsigned int width)\n> +{\n> +       const uint16_t *in = static_cast<const uint16_t *>(input);\n> +       uint8_t *out = static_cast<uint8_t *>(output);\n> +\n> +       for (unsigned int i = 0; i < width; i += 2) {\n> +               *out++ = (in[0] & 0xff0) >> 4;\n> +               *out++ = (in[0] & 0x00f) << 4 | (in[1] & 0xf00) >> 8;\n> +               *out++ = (in[1] & 0x0ff);\n> +               in += 2;\n> +       }\n> +}\n> +\n>  void packScanlineRaw16(void *output, const void *input, unsigned int width)\n>  {\n>         const uint16_t *in = static_cast<const uint16_t *>(input);\n> @@ -341,6 +369,54 @@ const std::map<PixelFormat, FormatInfo> formatInfo = {\n>                 .packScanline = packScanlineRaw8,\n>                 .thumbScanline = thumbScanlineRaw_CSI2P,\n>         } },\n> +       { formats::SBGGR10, {\n> +               .bitsPerSample = 10,\n> +               .pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },\n> +               .packScanline = packScanlineRaw10,\n> +               .thumbScanline = thumbScanlineRaw,\n> +       } },\n> +       { formats::SGBRG10, {\n> +               .bitsPerSample = 10,\n> +               .pattern = { CFAPatternGreen, CFAPatternBlue, CFAPatternRed, CFAPatternGreen },\n> +               .packScanline = packScanlineRaw10,\n> +               .thumbScanline = thumbScanlineRaw,\n> +       } },\n> +       { formats::SGRBG10, {\n> +               .bitsPerSample = 10,\n> +               .pattern = { CFAPatternGreen, CFAPatternRed, CFAPatternBlue, CFAPatternGreen },\n> +               .packScanline = packScanlineRaw10,\n> +               .thumbScanline = thumbScanlineRaw,\n> +       } },\n> +       { formats::SRGGB10, {\n> +               .bitsPerSample = 10,\n> +               .pattern = { CFAPatternRed, CFAPatternGreen, CFAPatternGreen, CFAPatternBlue },\n> +               .packScanline = packScanlineRaw10,\n> +               .thumbScanline = thumbScanlineRaw,\n> +       } },\n> +       { formats::SBGGR12, {\n> +               .bitsPerSample = 12,\n> +               .pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },\n> +               .packScanline = packScanlineRaw12,\n> +               .thumbScanline = thumbScanlineRaw,\n> +       } },\n> +       { formats::SGBRG12, {\n> +               .bitsPerSample = 12,\n> +               .pattern = { CFAPatternGreen, CFAPatternBlue, CFAPatternRed, CFAPatternGreen },\n> +               .packScanline = packScanlineRaw12,\n> +               .thumbScanline = thumbScanlineRaw,\n> +       } },\n> +       { formats::SGRBG12, {\n> +               .bitsPerSample = 12,\n> +               .pattern = { CFAPatternGreen, CFAPatternRed, CFAPatternBlue, CFAPatternGreen },\n> +               .packScanline = packScanlineRaw12,\n> +               .thumbScanline = thumbScanlineRaw,\n> +       } },\n> +       { formats::SRGGB12, {\n> +               .bitsPerSample = 12,\n> +               .pattern = { CFAPatternRed, CFAPatternGreen, CFAPatternGreen, CFAPatternBlue },\n> +               .packScanline = packScanlineRaw12,\n> +               .thumbScanline = thumbScanlineRaw,\n> +       } },\n>         { formats::SBGGR16, {\n>                 .bitsPerSample = 16,\n>                 .pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },\n> -- \n> 2.43.0\n>","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 D76F9BD87C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 28 Jun 2024 10:48:33 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 034D062C99;\n\tFri, 28 Jun 2024 12:48:33 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B5239619E5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 28 Jun 2024 12:48:31 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 0523D735;\n\tFri, 28 Jun 2024 12:48:06 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"EmFuItaJ\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1719571687;\n\tbh=7wqUfvqFv82Dhj72amISpSjPWAWSdyEpDz7V2kBA2Vw=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=EmFuItaJ0fan58DJ+03F3kAJqYCe1EgYrV407KBaOZ0SuyOyOJdxaD9X/G/lLv686\n\tfxcOswMkg5CvuCYvak0gsh+J+TPvmpzEw0IhbCOh8/47cu/YmGtztY5Xxs2egaFBdt\n\tc1RzA6t4NU7qnPVhVF7AfGjGOlEWHsmFwhJeZwNA=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20240628100227.2910842-4-stefan.klug@ideasonboard.com>","References":"<20240628100227.2910842-1-stefan.klug@ideasonboard.com>\n\t<20240628100227.2910842-4-stefan.klug@ideasonboard.com>","Subject":"Re: [PATCH v2 3/3] apps: common: dng_writer: Support RAW10 and RAW12\n\tformat","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Stefan Klug <stefan.klug@ideasonboard.com>","To":"Stefan Klug <stefan.klug@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Fri, 28 Jun 2024 11:48:28 +0100","Message-ID":"<171957170829.392292.4370631091323523098@ping.linuxembedded.co.uk>","User-Agent":"alot/0.10","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":30125,"web_url":"https://patchwork.libcamera.org/comment/30125/","msgid":"<3e605062-ebc2-4183-bae1-a139897ecaa9@ideasonboard.com>","date":"2024-06-28T15:19:15","subject":"Re: [PATCH v2 3/3] apps: common: dng_writer: Support RAW10 and RAW12\n\tformat","submitter":{"id":156,"url":"https://patchwork.libcamera.org/api/people/156/","name":"Dan Scally","email":"dan.scally@ideasonboard.com"},"content":"Hi Stefan, thanks for the patch\n\nOn 28/06/2024 11:01, Stefan Klug wrote:\n> Add support for RAW10 and RAW12 to the dng_writer. This is needed on\n> imx8mp to produce tuning images.  Both formats were tested on a debix\n> som with a imx335.\n>\n> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n> ---\n>   src/apps/common/dng_writer.cpp | 76 ++++++++++++++++++++++++++++++++++\n>   1 file changed, 76 insertions(+)\n>\n> diff --git a/src/apps/common/dng_writer.cpp b/src/apps/common/dng_writer.cpp\n> index 474aa72beb92..f61930b68b2b 100644\n> --- a/src/apps/common/dng_writer.cpp\n> +++ b/src/apps/common/dng_writer.cpp\n> @@ -136,6 +136,34 @@ void packScanlineRaw8(void *output, const void *input, unsigned int width)\n>   \tstd::copy(in, in + width, out);\n>   }\n>   \n> +void packScanlineRaw10(void *output, const void *input, unsigned int width)\n> +{\n> +\tconst uint16_t *in = static_cast<const uint16_t *>(input);\n> +\tuint8_t *out = static_cast<uint8_t *>(output);\n> +\n> +\tfor (unsigned int i = 0; i < width; i += 4) {\n> +\t\t*out++ = (in[0] & 0x3fc) >> 2;\n> +\t\t*out++ = (in[0] & 0x003) << 6 | (in[1] & 0x3f0) >> 4;\n> +\t\t*out++ = (in[1] & 0x00f) << 4 | (in[2] & 0x3c0) >> 6;\n> +\t\t*out++ = (in[2] & 0x03f) << 2 | (in[3] & 0x300) >> 8;\n> +\t\t*out++ = (in[3] & 0x0ff);\n> +\t\tin += 4;\n> +\t}\n> +}\n> +\n> +void packScanlineRaw12(void *output, const void *input, unsigned int width)\n> +{\n> +\tconst uint16_t *in = static_cast<const uint16_t *>(input);\n> +\tuint8_t *out = static_cast<uint8_t *>(output);\n> +\n> +\tfor (unsigned int i = 0; i < width; i += 2) {\n> +\t\t*out++ = (in[0] & 0xff0) >> 4;\n> +\t\t*out++ = (in[0] & 0x00f) << 4 | (in[1] & 0xf00) >> 8;\n> +\t\t*out++ = (in[1] & 0x0ff);\n> +\t\tin += 2;\n> +\t}\n> +}\n\n\nThese always take me an annoying amount of time to follow through:\n\n\nReviewed-by: Daniel Scally <dan.scally@ideasonboard.com>\n\n> +\n>   void packScanlineRaw16(void *output, const void *input, unsigned int width)\n>   {\n>   \tconst uint16_t *in = static_cast<const uint16_t *>(input);\n> @@ -341,6 +369,54 @@ const std::map<PixelFormat, FormatInfo> formatInfo = {\n>   \t\t.packScanline = packScanlineRaw8,\n>   \t\t.thumbScanline = thumbScanlineRaw_CSI2P,\n>   \t} },\n> +\t{ formats::SBGGR10, {\n> +\t\t.bitsPerSample = 10,\n> +\t\t.pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },\n> +\t\t.packScanline = packScanlineRaw10,\n> +\t\t.thumbScanline = thumbScanlineRaw,\n> +\t} },\n> +\t{ formats::SGBRG10, {\n> +\t\t.bitsPerSample = 10,\n> +\t\t.pattern = { CFAPatternGreen, CFAPatternBlue, CFAPatternRed, CFAPatternGreen },\n> +\t\t.packScanline = packScanlineRaw10,\n> +\t\t.thumbScanline = thumbScanlineRaw,\n> +\t} },\n> +\t{ formats::SGRBG10, {\n> +\t\t.bitsPerSample = 10,\n> +\t\t.pattern = { CFAPatternGreen, CFAPatternRed, CFAPatternBlue, CFAPatternGreen },\n> +\t\t.packScanline = packScanlineRaw10,\n> +\t\t.thumbScanline = thumbScanlineRaw,\n> +\t} },\n> +\t{ formats::SRGGB10, {\n> +\t\t.bitsPerSample = 10,\n> +\t\t.pattern = { CFAPatternRed, CFAPatternGreen, CFAPatternGreen, CFAPatternBlue },\n> +\t\t.packScanline = packScanlineRaw10,\n> +\t\t.thumbScanline = thumbScanlineRaw,\n> +\t} },\n> +\t{ formats::SBGGR12, {\n> +\t\t.bitsPerSample = 12,\n> +\t\t.pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },\n> +\t\t.packScanline = packScanlineRaw12,\n> +\t\t.thumbScanline = thumbScanlineRaw,\n> +\t} },\n> +\t{ formats::SGBRG12, {\n> +\t\t.bitsPerSample = 12,\n> +\t\t.pattern = { CFAPatternGreen, CFAPatternBlue, CFAPatternRed, CFAPatternGreen },\n> +\t\t.packScanline = packScanlineRaw12,\n> +\t\t.thumbScanline = thumbScanlineRaw,\n> +\t} },\n> +\t{ formats::SGRBG12, {\n> +\t\t.bitsPerSample = 12,\n> +\t\t.pattern = { CFAPatternGreen, CFAPatternRed, CFAPatternBlue, CFAPatternGreen },\n> +\t\t.packScanline = packScanlineRaw12,\n> +\t\t.thumbScanline = thumbScanlineRaw,\n> +\t} },\n> +\t{ formats::SRGGB12, {\n> +\t\t.bitsPerSample = 12,\n> +\t\t.pattern = { CFAPatternRed, CFAPatternGreen, CFAPatternGreen, CFAPatternBlue },\n> +\t\t.packScanline = packScanlineRaw12,\n> +\t\t.thumbScanline = thumbScanlineRaw,\n> +\t} },\n>   \t{ formats::SBGGR16, {\n>   \t\t.bitsPerSample = 16,\n>   \t\t.pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },","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 1A937BDB1D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 28 Jun 2024 15:19:22 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id AD94F62C99;\n\tFri, 28 Jun 2024 17:19:20 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A4D42619E5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 28 Jun 2024 17:19:18 +0200 (CEST)","from [192.168.0.43]\n\t(cpc141996-chfd3-2-0-cust928.12-3.cable.virginm.net [86.13.91.161])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D19CA4B0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 28 Jun 2024 17:18:53 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"biMsdwZ2\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1719587933;\n\tbh=bMOY4Zc4oTr9j2zss14fl/8keLNMj/rBptCqfwz0ubI=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=biMsdwZ2rp9NtEkJCquOz5Vzn9NB1uZT8rWRSWtYBhH0FK1Op1ZR49+gHmN1pNpBy\n\t4mtxxwCbFmoAlNqcAIbp5euEFspjPNiNPcTsk5UaOaVrVGGoO/xIfuK5r6o+H39TVi\n\t3YA2I6RCLREysFA+ZQEfCgNOQ8TpdwAx8slAXEqI=","Message-ID":"<3e605062-ebc2-4183-bae1-a139897ecaa9@ideasonboard.com>","Date":"Fri, 28 Jun 2024 16:19:15 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v2 3/3] apps: common: dng_writer: Support RAW10 and RAW12\n\tformat","To":"libcamera-devel@lists.libcamera.org","References":"<20240628100227.2910842-1-stefan.klug@ideasonboard.com>\n\t<20240628100227.2910842-4-stefan.klug@ideasonboard.com>","Content-Language":"en-US","From":"Dan Scally <dan.scally@ideasonboard.com>","Autocrypt":"addr=dan.scally@ideasonboard.com; keydata=\n\t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","In-Reply-To":"<20240628100227.2910842-4-stefan.klug@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":30126,"web_url":"https://patchwork.libcamera.org/comment/30126/","msgid":"<20240628152545.GF15017@pendragon.ideasonboard.com>","date":"2024-06-28T15:25:45","subject":"Re: [PATCH v2 3/3] apps: common: dng_writer: Support RAW10 and RAW12\n\tformat","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Fri, Jun 28, 2024 at 11:48:28AM +0100, Kieran Bingham wrote:\n> Quoting Stefan Klug (2024-06-28 11:01:45)\n> > Add support for RAW10 and RAW12 to the dng_writer. This is needed on\n> > imx8mp to produce tuning images.  Both formats were tested on a debix\n> > som with a imx335.\n> > \n> > Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n> \n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> \n> > ---\n> >  src/apps/common/dng_writer.cpp | 76 ++++++++++++++++++++++++++++++++++\n> >  1 file changed, 76 insertions(+)\n> > \n> > diff --git a/src/apps/common/dng_writer.cpp b/src/apps/common/dng_writer.cpp\n> > index 474aa72beb92..f61930b68b2b 100644\n> > --- a/src/apps/common/dng_writer.cpp\n> > +++ b/src/apps/common/dng_writer.cpp\n> > @@ -136,6 +136,34 @@ void packScanlineRaw8(void *output, const void *input, unsigned int width)\n> >         std::copy(in, in + width, out);\n> >  }\n> >  \n> > +void packScanlineRaw10(void *output, const void *input, unsigned int width)\n> > +{\n> > +       const uint16_t *in = static_cast<const uint16_t *>(input);\n> > +       uint8_t *out = static_cast<uint8_t *>(output);\n> > +\n> > +       for (unsigned int i = 0; i < width; i += 4) {\n> > +               *out++ = (in[0] & 0x3fc) >> 2;\n> > +               *out++ = (in[0] & 0x003) << 6 | (in[1] & 0x3f0) >> 4;\n> > +               *out++ = (in[1] & 0x00f) << 4 | (in[2] & 0x3c0) >> 6;\n> > +               *out++ = (in[2] & 0x03f) << 2 | (in[3] & 0x300) >> 8;\n> > +               *out++ = (in[3] & 0x0ff);\n> > +               in += 4;\n> > +       }\n\nThis will only work on little-endian machines. The following would work\nregardless of endianness.\n\n       const uint8_t *in = static_cast<const uint8_t *>(input);\n       uint8_t *out = static_cast<uint8_t *>(output);\n\n       for (unsigned int i = 0; i < width; i += 4) {\n               *out++ = in[1] << 6 | in[0] >> 2;\n               *out++ = in[0] << 6 | (in[3] & 0x03) << 4 | in[2] >> 4;\n               *out++ = in[2] << 4 | (in[5] & 0x03) << 2 | in[4] >> 6;\n               *out++ = in[4] << 2 | (in[7] & 0x03) << 0;\n               *out++ = in[6];\n               in += 8;\n       }\n\n> > +}\n> > +\n> > +void packScanlineRaw12(void *output, const void *input, unsigned int width)\n> > +{\n> > +       const uint16_t *in = static_cast<const uint16_t *>(input);\n> > +       uint8_t *out = static_cast<uint8_t *>(output);\n> > +\n> > +       for (unsigned int i = 0; i < width; i += 2) {\n> > +               *out++ = (in[0] & 0xff0) >> 4;\n> > +               *out++ = (in[0] & 0x00f) << 4 | (in[1] & 0xf00) >> 8;\n> > +               *out++ = (in[1] & 0x0ff);\n> > +               in += 2;\n> > +       }\n\nAnd here\n\n\tconst uint8_t *in = static_cast<const uint8_t *>(input);\n\tuint8_t *out = static_cast<uint8_t *>(output);\n\n\tfor (unsigned int i = 0; i < width; i += 2) {\n\t\t*out++ = in[1] << 4 | in[0] >> 4;\n\t\t*out++ = in[0] << 4 | (in[3] & 0x0f);\n\t\t*out++ = in[2];\n\t\tin += 4;\n\t}\n\nWith that (assuming it works),\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> > +}\n> > +\n> >  void packScanlineRaw16(void *output, const void *input, unsigned int width)\n> >  {\n> >         const uint16_t *in = static_cast<const uint16_t *>(input);\n> > @@ -341,6 +369,54 @@ const std::map<PixelFormat, FormatInfo> formatInfo = {\n> >                 .packScanline = packScanlineRaw8,\n> >                 .thumbScanline = thumbScanlineRaw_CSI2P,\n> >         } },\n> > +       { formats::SBGGR10, {\n> > +               .bitsPerSample = 10,\n> > +               .pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },\n> > +               .packScanline = packScanlineRaw10,\n> > +               .thumbScanline = thumbScanlineRaw,\n> > +       } },\n> > +       { formats::SGBRG10, {\n> > +               .bitsPerSample = 10,\n> > +               .pattern = { CFAPatternGreen, CFAPatternBlue, CFAPatternRed, CFAPatternGreen },\n> > +               .packScanline = packScanlineRaw10,\n> > +               .thumbScanline = thumbScanlineRaw,\n> > +       } },\n> > +       { formats::SGRBG10, {\n> > +               .bitsPerSample = 10,\n> > +               .pattern = { CFAPatternGreen, CFAPatternRed, CFAPatternBlue, CFAPatternGreen },\n> > +               .packScanline = packScanlineRaw10,\n> > +               .thumbScanline = thumbScanlineRaw,\n> > +       } },\n> > +       { formats::SRGGB10, {\n> > +               .bitsPerSample = 10,\n> > +               .pattern = { CFAPatternRed, CFAPatternGreen, CFAPatternGreen, CFAPatternBlue },\n> > +               .packScanline = packScanlineRaw10,\n> > +               .thumbScanline = thumbScanlineRaw,\n> > +       } },\n> > +       { formats::SBGGR12, {\n> > +               .bitsPerSample = 12,\n> > +               .pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },\n> > +               .packScanline = packScanlineRaw12,\n> > +               .thumbScanline = thumbScanlineRaw,\n> > +       } },\n> > +       { formats::SGBRG12, {\n> > +               .bitsPerSample = 12,\n> > +               .pattern = { CFAPatternGreen, CFAPatternBlue, CFAPatternRed, CFAPatternGreen },\n> > +               .packScanline = packScanlineRaw12,\n> > +               .thumbScanline = thumbScanlineRaw,\n> > +       } },\n> > +       { formats::SGRBG12, {\n> > +               .bitsPerSample = 12,\n> > +               .pattern = { CFAPatternGreen, CFAPatternRed, CFAPatternBlue, CFAPatternGreen },\n> > +               .packScanline = packScanlineRaw12,\n> > +               .thumbScanline = thumbScanlineRaw,\n> > +       } },\n> > +       { formats::SRGGB12, {\n> > +               .bitsPerSample = 12,\n> > +               .pattern = { CFAPatternRed, CFAPatternGreen, CFAPatternGreen, CFAPatternBlue },\n> > +               .packScanline = packScanlineRaw12,\n> > +               .thumbScanline = thumbScanlineRaw,\n> > +       } },\n> >         { formats::SBGGR16, {\n> >                 .bitsPerSample = 16,\n> >                 .pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },","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 318D5BD87C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 28 Jun 2024 15:26:09 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 48E5A62C99;\n\tFri, 28 Jun 2024 17:26:08 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7E30F619E5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 28 Jun 2024 17:26:06 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7D3AE2C5;\n\tFri, 28 Jun 2024 17:25:41 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Gs3OWxGJ\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1719588341;\n\tbh=FTv53+iXyL6IDARDEJum1BI2X3mRGozqEFKCopNHSZQ=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Gs3OWxGJuUgLSxQDiucrzCy8z4VnJFMHkeoTQ95U6dpZVK7f4B8IeA97KJjEQjLaS\n\tXnbyS8DELzfQHJwm0/YTmX1hluTRNxMtwF9MiY1KiVqpLlMYiU2VDzfvYfxC7h5n6Q\n\t60mN7TiuuO4V+5QXWNKawX+B724PldkjjOuObwXE=","Date":"Fri, 28 Jun 2024 18:25:45 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Stefan Klug <stefan.klug@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2 3/3] apps: common: dng_writer: Support RAW10 and RAW12\n\tformat","Message-ID":"<20240628152545.GF15017@pendragon.ideasonboard.com>","References":"<20240628100227.2910842-1-stefan.klug@ideasonboard.com>\n\t<20240628100227.2910842-4-stefan.klug@ideasonboard.com>\n\t<171957170829.392292.4370631091323523098@ping.linuxembedded.co.uk>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<171957170829.392292.4370631091323523098@ping.linuxembedded.co.uk>","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":30127,"web_url":"https://patchwork.libcamera.org/comment/30127/","msgid":"<20240628201303.GA21388@pendragon.ideasonboard.com>","date":"2024-06-28T20:13:03","subject":"Re: [PATCH v2 3/3] apps: common: dng_writer: Support RAW10 and RAW12\n\tformat","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Fri, Jun 28, 2024 at 06:25:45PM +0300, Laurent Pinchart wrote:\n> On Fri, Jun 28, 2024 at 11:48:28AM +0100, Kieran Bingham wrote:\n> > Quoting Stefan Klug (2024-06-28 11:01:45)\n> > > Add support for RAW10 and RAW12 to the dng_writer. This is needed on\n> > > imx8mp to produce tuning images.  Both formats were tested on a debix\n> > > som with a imx335.\n> > > \n> > > Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n> > \n> > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> > \n> > > ---\n> > >  src/apps/common/dng_writer.cpp | 76 ++++++++++++++++++++++++++++++++++\n> > >  1 file changed, 76 insertions(+)\n> > > \n> > > diff --git a/src/apps/common/dng_writer.cpp b/src/apps/common/dng_writer.cpp\n> > > index 474aa72beb92..f61930b68b2b 100644\n> > > --- a/src/apps/common/dng_writer.cpp\n> > > +++ b/src/apps/common/dng_writer.cpp\n> > > @@ -136,6 +136,34 @@ void packScanlineRaw8(void *output, const void *input, unsigned int width)\n> > >         std::copy(in, in + width, out);\n> > >  }\n> > >  \n> > > +void packScanlineRaw10(void *output, const void *input, unsigned int width)\n> > > +{\n> > > +       const uint16_t *in = static_cast<const uint16_t *>(input);\n> > > +       uint8_t *out = static_cast<uint8_t *>(output);\n> > > +\n> > > +       for (unsigned int i = 0; i < width; i += 4) {\n> > > +               *out++ = (in[0] & 0x3fc) >> 2;\n> > > +               *out++ = (in[0] & 0x003) << 6 | (in[1] & 0x3f0) >> 4;\n> > > +               *out++ = (in[1] & 0x00f) << 4 | (in[2] & 0x3c0) >> 6;\n> > > +               *out++ = (in[2] & 0x03f) << 2 | (in[3] & 0x300) >> 8;\n> > > +               *out++ = (in[3] & 0x0ff);\n> > > +               in += 4;\n> > > +       }\n> \n> This will only work on little-endian machines. The following would work\n> regardless of endianness.\n> \n>        const uint8_t *in = static_cast<const uint8_t *>(input);\n>        uint8_t *out = static_cast<uint8_t *>(output);\n> \n>        for (unsigned int i = 0; i < width; i += 4) {\n>                *out++ = in[1] << 6 | in[0] >> 2;\n>                *out++ = in[0] << 6 | (in[3] & 0x03) << 4 | in[2] >> 4;\n>                *out++ = in[2] << 4 | (in[5] & 0x03) << 2 | in[4] >> 6;\n>                *out++ = in[4] << 2 | (in[7] & 0x03) << 0;\n>                *out++ = in[6];\n>                in += 8;\n>        }\n> \n> > > +}\n> > > +\n> > > +void packScanlineRaw12(void *output, const void *input, unsigned int width)\n> > > +{\n> > > +       const uint16_t *in = static_cast<const uint16_t *>(input);\n> > > +       uint8_t *out = static_cast<uint8_t *>(output);\n> > > +\n> > > +       for (unsigned int i = 0; i < width; i += 2) {\n> > > +               *out++ = (in[0] & 0xff0) >> 4;\n> > > +               *out++ = (in[0] & 0x00f) << 4 | (in[1] & 0xf00) >> 8;\n> > > +               *out++ = (in[1] & 0x0ff);\n> > > +               in += 2;\n> > > +       }\n> \n> And here\n> \n> \tconst uint8_t *in = static_cast<const uint8_t *>(input);\n> \tuint8_t *out = static_cast<uint8_t *>(output);\n> \n> \tfor (unsigned int i = 0; i < width; i += 2) {\n> \t\t*out++ = in[1] << 4 | in[0] >> 4;\n> \t\t*out++ = in[0] << 4 | (in[3] & 0x0f);\n> \t\t*out++ = in[2];\n> \t\tin += 4;\n> \t}\n> \n> With that (assuming it works),\n\nLet's fix this on top. I'll send a patch.\n\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> > > +}\n> > > +\n> > >  void packScanlineRaw16(void *output, const void *input, unsigned int width)\n> > >  {\n> > >         const uint16_t *in = static_cast<const uint16_t *>(input);\n> > > @@ -341,6 +369,54 @@ const std::map<PixelFormat, FormatInfo> formatInfo = {\n> > >                 .packScanline = packScanlineRaw8,\n> > >                 .thumbScanline = thumbScanlineRaw_CSI2P,\n> > >         } },\n> > > +       { formats::SBGGR10, {\n> > > +               .bitsPerSample = 10,\n> > > +               .pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },\n> > > +               .packScanline = packScanlineRaw10,\n> > > +               .thumbScanline = thumbScanlineRaw,\n> > > +       } },\n> > > +       { formats::SGBRG10, {\n> > > +               .bitsPerSample = 10,\n> > > +               .pattern = { CFAPatternGreen, CFAPatternBlue, CFAPatternRed, CFAPatternGreen },\n> > > +               .packScanline = packScanlineRaw10,\n> > > +               .thumbScanline = thumbScanlineRaw,\n> > > +       } },\n> > > +       { formats::SGRBG10, {\n> > > +               .bitsPerSample = 10,\n> > > +               .pattern = { CFAPatternGreen, CFAPatternRed, CFAPatternBlue, CFAPatternGreen },\n> > > +               .packScanline = packScanlineRaw10,\n> > > +               .thumbScanline = thumbScanlineRaw,\n> > > +       } },\n> > > +       { formats::SRGGB10, {\n> > > +               .bitsPerSample = 10,\n> > > +               .pattern = { CFAPatternRed, CFAPatternGreen, CFAPatternGreen, CFAPatternBlue },\n> > > +               .packScanline = packScanlineRaw10,\n> > > +               .thumbScanline = thumbScanlineRaw,\n> > > +       } },\n> > > +       { formats::SBGGR12, {\n> > > +               .bitsPerSample = 12,\n> > > +               .pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },\n> > > +               .packScanline = packScanlineRaw12,\n> > > +               .thumbScanline = thumbScanlineRaw,\n> > > +       } },\n> > > +       { formats::SGBRG12, {\n> > > +               .bitsPerSample = 12,\n> > > +               .pattern = { CFAPatternGreen, CFAPatternBlue, CFAPatternRed, CFAPatternGreen },\n> > > +               .packScanline = packScanlineRaw12,\n> > > +               .thumbScanline = thumbScanlineRaw,\n> > > +       } },\n> > > +       { formats::SGRBG12, {\n> > > +               .bitsPerSample = 12,\n> > > +               .pattern = { CFAPatternGreen, CFAPatternRed, CFAPatternBlue, CFAPatternGreen },\n> > > +               .packScanline = packScanlineRaw12,\n> > > +               .thumbScanline = thumbScanlineRaw,\n> > > +       } },\n> > > +       { formats::SRGGB12, {\n> > > +               .bitsPerSample = 12,\n> > > +               .pattern = { CFAPatternRed, CFAPatternGreen, CFAPatternGreen, CFAPatternBlue },\n> > > +               .packScanline = packScanlineRaw12,\n> > > +               .thumbScanline = thumbScanlineRaw,\n> > > +       } },\n> > >         { formats::SBGGR16, {\n> > >                 .bitsPerSample = 16,\n> > >                 .pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },","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 1D1E2BDB1D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 28 Jun 2024 20:13:28 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C479C62C99;\n\tFri, 28 Jun 2024 22:13:26 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AF830619E5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 28 Jun 2024 22:13:24 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 86FC84B0;\n\tFri, 28 Jun 2024 22:12:59 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"erjojPDj\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1719605579;\n\tbh=PVHvl/8ur0Ui7NUUQJOLVdcf5HF5nbJXYmRvI8TbUOw=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=erjojPDj2s/JA1UJL8GE7x4wli1e9CBDf7tlaELQ7yZHGHnSliH4Xw8lq3s132Af2\n\tk2M1t6VJ3yuSgbdl//bsJy9yPH8jfSRSRgcYTILzIo4s8f7N5yXfXyDG4oYMrSL8oq\n\t6Y0VDbxhC54DhB7s7pf7BcC6nfu6JYRuFZza5JeU=","Date":"Fri, 28 Jun 2024 23:13:03 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Stefan Klug <stefan.klug@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2 3/3] apps: common: dng_writer: Support RAW10 and RAW12\n\tformat","Message-ID":"<20240628201303.GA21388@pendragon.ideasonboard.com>","References":"<20240628100227.2910842-1-stefan.klug@ideasonboard.com>\n\t<20240628100227.2910842-4-stefan.klug@ideasonboard.com>\n\t<171957170829.392292.4370631091323523098@ping.linuxembedded.co.uk>\n\t<20240628152545.GF15017@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20240628152545.GF15017@pendragon.ideasonboard.com>","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]