[{"id":35685,"web_url":"https://patchwork.libcamera.org/comment/35685/","msgid":"<aLXRCl8IzKvfmqiN@duo.ucw.cz>","date":"2025-09-01T16:59:54","subject":"Re: [PATCH v3 1/1] apps: cam: Support PPM output for other RGB\n\tformats","submitter":{"id":49,"url":"https://patchwork.libcamera.org/api/people/49/","name":"Pavel Machek","email":"pavel@ucw.cz"},"content":"On Mon 2025-09-01 18:25:15, Milan Zamazal wrote:\n> GPU ISP can produce only 32-bit output.  Let's add support to the PPM\n> writer for all the common RGB image formats so that we can store GPU ISP\n> output as PPM files.  Contingent alpha values are ignored as there is no\n> support for the alpha channel in PPM.\n> \n> There is no obvious performance penalty in my environment compared to\n> output in the raw format.\n> \n\nReviewed-by: Pavel Machek <pavel@ucw.cz>\n\nThank you,\n\t\t\t\t\t\t\t\tPavel","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 C2E59BDB13\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  1 Sep 2025 16:59:58 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id AEC3369323;\n\tMon,  1 Sep 2025 18:59:57 +0200 (CEST)","from jabberwock.ucw.cz (jabberwock.ucw.cz [46.255.230.98])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9376E69323\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  1 Sep 2025 18:59:55 +0200 (CEST)","by jabberwock.ucw.cz (Postfix, from userid 1017)\n\tid D947D1C01C0; Mon,  1 Sep 2025 18:59:54 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ucw.cz header.i=@ucw.cz header.b=\"qkB2Bk7J\";\n\tdkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=ucw.cz; s=gen1;\n\tt=1756745994;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=nQAXm8FstLMerZIV789/zPkcIcnTmoTDSXNJbjlOKN0=;\n\tb=qkB2Bk7J8vosqrm/9CFy/AhYTnIabYQ4AkiiyiISfhEtwTvUUVda1Q59skTPcjl4WJWAKX\n\tvYcDnfRfvtnGP2Sj8/O9lzh4MLy9QWx+Nc7LIEeEA02hwZAc+uu4+h93nZQhGlBxYJAp/t\n\tZTWpFDkYKggx8tki3CbvLE6oRjytUo8=","Date":"Mon, 1 Sep 2025 18:59:54 +0200","From":"Pavel Machek <pavel@ucw.cz>","To":"Milan Zamazal <mzamazal@redhat.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tBryan O'Donoghue <bryan.odonoghue@linaro.org>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","Subject":"Re: [PATCH v3 1/1] apps: cam: Support PPM output for other RGB\n\tformats","Message-ID":"<aLXRCl8IzKvfmqiN@duo.ucw.cz>","References":"<20250901162606.44139-1-mzamazal@redhat.com>\n\t<20250901162606.44139-2-mzamazal@redhat.com>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha1;\n\tprotocol=\"application/pgp-signature\"; boundary=\"d8eJOVwhFsiKZ38Z\"","Content-Disposition":"inline","In-Reply-To":"<20250901162606.44139-2-mzamazal@redhat.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>"}},{"id":35695,"web_url":"https://patchwork.libcamera.org/comment/35695/","msgid":"<175696826984.1787083.2252699398783485028@neptunite.rasen.tech>","date":"2025-09-04T06:44:29","subject":"Re: [PATCH v3 1/1] apps: cam: Support PPM output for other RGB\n\tformats","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Quoting Milan Zamazal (2025-09-02 01:25:15)\n> GPU ISP can produce only 32-bit output.  Let's add support to the PPM\n> writer for all the common RGB image formats so that we can store GPU ISP\n> output as PPM files.  Contingent alpha values are ignored as there is no\n> support for the alpha channel in PPM.\n> \n> There is no obvious performance penalty in my environment compared to\n> output in the raw format.\n> \n> Signed-off-by: Pavel Machek <pavel@ucw.cz>\n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n\nLooks good to me.\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> ---\n>  src/apps/common/ppm_writer.cpp | 48 +++++++++++++++++++++++++++++++---\n>  1 file changed, 44 insertions(+), 4 deletions(-)\n> \n> diff --git a/src/apps/common/ppm_writer.cpp b/src/apps/common/ppm_writer.cpp\n> index 368de8bf6..6f0bbbe9e 100644\n> --- a/src/apps/common/ppm_writer.cpp\n> +++ b/src/apps/common/ppm_writer.cpp\n> @@ -10,6 +10,7 @@\n>  #include <errno.h>\n>  #include <fstream>\n>  #include <iostream>\n> +#include <vector>\n>  \n>  #include <libcamera/formats.h>\n>  #include <libcamera/pixel_format.h>\n> @@ -20,9 +21,34 @@ int PPMWriter::write(const char *filename,\n>                      const StreamConfiguration &config,\n>                      const Span<uint8_t> &data)\n>  {\n> -       if (config.pixelFormat != formats::BGR888) {\n> -               std::cerr << \"Only BGR888 output pixel format is supported (\"\n> -                         << config.pixelFormat << \" requested)\" << std::endl;\n> +       struct FormatTransformation {\n> +               unsigned int rPos;\n> +               unsigned int gPos;\n> +               unsigned int bPos;\n> +               unsigned int bytesPerPixel;\n> +       };\n> +\n> +       static const std::map<libcamera::PixelFormat, FormatTransformation> transforms = {\n> +               { libcamera::formats::R8, { 0, 0, 0, 1 } },\n> +               { libcamera::formats::RGB888, { 2, 1, 0, 3 } },\n> +               { libcamera::formats::BGR888, { 0, 1, 2, 3 } },\n> +               { libcamera::formats::ARGB8888, { 2, 1, 0, 4 } },\n> +               { libcamera::formats::XRGB8888, { 2, 1, 0, 4 } },\n> +               { libcamera::formats::ABGR8888, { 0, 1, 2, 4 } },\n> +               { libcamera::formats::XBGR8888, { 0, 1, 2, 4 } },\n> +               { libcamera::formats::RGBA8888, { 3, 2, 1, 4 } },\n> +               { libcamera::formats::RGBX8888, { 3, 2, 1, 4 } },\n> +               { libcamera::formats::BGRA8888, { 1, 2, 3, 4 } },\n> +               { libcamera::formats::BGRX8888, { 1, 2, 3, 4 } },\n> +       };\n> +\n> +       FormatTransformation transformation;\n> +       if (auto search = transforms.find(config.pixelFormat); search != transforms.end()) {\n> +               transformation = search->second;\n> +       } else {\n> +               std::cerr\n> +                       << \"Only RGB output pixel formats are supported (\"\n> +                       << config.pixelFormat << \" requested)\" << std::endl;\n>                 return -EINVAL;\n>         }\n>  \n> @@ -42,8 +68,22 @@ int PPMWriter::write(const char *filename,\n>  \n>         const unsigned int rowLength = config.size.width * 3;\n>         const char *row = reinterpret_cast<const char *>(data.data());\n> +       const bool transform = config.pixelFormat != formats::BGR888;\n> +       std::vector<char> transformedRow(transform ? rowLength : 0);\n> +\n>         for (unsigned int y = 0; y < config.size.height; y++, row += config.stride) {\n> -               output.write(row, rowLength);\n> +               if (transform) {\n> +                       for (unsigned int x = 0; x < config.size.width; x++) {\n> +                               transformedRow[x * 3] =\n> +                                       row[x * transformation.bytesPerPixel + transformation.rPos];\n> +                               transformedRow[x * 3 + 1] =\n> +                                       row[x * transformation.bytesPerPixel + transformation.gPos];\n> +                               transformedRow[x * 3 + 2] =\n> +                                       row[x * transformation.bytesPerPixel + transformation.bPos];\n> +                       }\n> +               }\n> +\n> +               output.write(transform ? transformedRow.data() : row, rowLength);\n>                 if (!output) {\n>                         std::cerr << \"Failed to write image data at row \" << y << std::endl;\n>                         return -EIO;\n> -- \n> 2.51.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 A0083BDB13\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  4 Sep 2025 06:44:41 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7B83F69334;\n\tThu,  4 Sep 2025 08:44:40 +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 BAF72613A8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  4 Sep 2025 08:44:37 +0200 (CEST)","from neptunite.rasen.tech (unknown\n\t[IPv6:2404:7a81:160:2100:ec60:75bd:5403:dfac])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id A155D842;\n\tThu,  4 Sep 2025 08:43:27 +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=\"kGIHvMzt\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1756968208;\n\tbh=Unmp8QvDNpATLGPDTlGOhwRI3L8I8prAXcddOWOU02A=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=kGIHvMztoJD0Rm1hq+e8I8mdzJonK8F6idvQj03Vg12qhP1D+B/ql2CHaOue+jfwK\n\tmZOInsNSnJAHdQvaPhT1CcJtAe0nlPILFpU2WsddR23GjRJaUXTqkRO2nmKSxyebvE\n\tttZsVkxItj14K3aI9Dy7ZsST12TGC9nkq3orZGMo=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250901162606.44139-2-mzamazal@redhat.com>","References":"<20250901162606.44139-1-mzamazal@redhat.com>\n\t<20250901162606.44139-2-mzamazal@redhat.com>","Subject":"Re: [PATCH v3 1/1] apps: cam: Support PPM output for other RGB\n\tformats","From":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"Milan Zamazal <mzamazal@redhat.com>,\n\tBryan O'Donoghue <bryan.odonoghue@linaro.org>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>,\n\tPavel Machek <pavel@ucw.cz>, \n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","Date":"Thu, 04 Sep 2025 15:44:29 +0900","Message-ID":"<175696826984.1787083.2252699398783485028@neptunite.rasen.tech>","User-Agent":"alot/0.0.0","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>"}}]