[{"id":35634,"web_url":"https://patchwork.libcamera.org/comment/35634/","msgid":"<175652677344.3397211.10882259935909658680@neptunite.rasen.tech>","date":"2025-08-30T04:06:13","subject":"Re: [PATCH] apps: cam: Support PPM output for XBGR8888","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Quoting Milan Zamazal (2025-08-30 00:08:04)\n> GPU ISP can produce only 32-bit output.  Let's add support to the PPM\n> writer for XBGR8888 image format so that we can store GPU ISP output as\n> PPM files.\n> \n> There is no obvious performance penalty in my environment compared to\n> output in the raw format.\n> \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 | 21 +++++++++++++++++----\n>  1 file changed, 17 insertions(+), 4 deletions(-)\n> \n> diff --git a/src/apps/common/ppm_writer.cpp b/src/apps/common/ppm_writer.cpp\n> index 368de8bf6..6c12b11d7 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,11 @@ 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> +       if (config.pixelFormat != formats::BGR888 &&\n> +           config.pixelFormat != formats::XBGR8888) {\n> +               std::cerr\n> +                       << \"Only BGR888 and XBGR8888 output pixel formats are supported (\"\n> +                       << config.pixelFormat << \" requested)\" << std::endl;\n>                 return -EINVAL;\n>         }\n>  \n> @@ -42,8 +45,18 @@ 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::XBGR8888;\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] = row[x * 4];\n> +                               transformedRow[x * 3 + 1] = row[x * 4 + 1];\n> +                               transformedRow[x * 3 + 2] = row[x * 4 + 2];\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 CC3C2BD87C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 30 Aug 2025 04:06:22 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id AE2E369321;\n\tSat, 30 Aug 2025 06:06:21 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 23699613AD\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 30 Aug 2025 06:06:20 +0200 (CEST)","from neptunite.rasen.tech (unknown\n\t[IPv6:2404:7a81:160:2100:675b:5305:1ae:ae0d])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id B37111F16; \n\tSat, 30 Aug 2025 06:05:13 +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=\"Hof3QIRa\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1756526714;\n\tbh=2ZPepqig/gfolCdilLJd8G2yMIGkzC/d7BoacitpOUE=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=Hof3QIRatMbxVr9Nz0TPA6j9VZp8TqzW1gTCerv6P/SlvqNR3aUJd6K5AhgTwH65T\n\tcGrNACE/caJtKgJu+kkaD8g0v+hzOAguysR0izCAfgRHKYomHgdl4eaeU5Yoie+9bK\n\t7UiL2ZIRrallSzV5svifrqF9fVM2HcxRELtT+XU8=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250829150804.53498-1-mzamazal@redhat.com>","References":"<20250829150804.53498-1-mzamazal@redhat.com>","Subject":"Re: [PATCH] apps: cam: Support PPM output for XBGR8888","From":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"Milan Zamazal <mzamazal@redhat.com>,\n\tBryan O'Donoghue <bryan.odonoghue@linaro.org>","To":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","Date":"Sat, 30 Aug 2025 13:06:13 +0900","Message-ID":"<175652677344.3397211.10882259935909658680@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>"}},{"id":35641,"web_url":"https://patchwork.libcamera.org/comment/35641/","msgid":"<175655040341.1721288.4324020449616803893@ping.linuxembedded.co.uk>","date":"2025-08-30T10:40:03","subject":"Re: [PATCH] apps: cam: Support PPM output for XBGR8888","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Milan,\n\nQuoting Milan Zamazal (2025-08-29 16:08:04)\n> GPU ISP can produce only 32-bit output.  Let's add support to the PPM\n> writer for XBGR8888 image format so that we can store GPU ISP output as\n> PPM files.\n> \n> There is no obvious performance penalty in my environment compared to\n> output in the raw format.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  src/apps/common/ppm_writer.cpp | 21 +++++++++++++++++----\n>  1 file changed, 17 insertions(+), 4 deletions(-)\n> \n> diff --git a/src/apps/common/ppm_writer.cpp b/src/apps/common/ppm_writer.cpp\n> index 368de8bf6..6c12b11d7 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,11 @@ 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> +       if (config.pixelFormat != formats::BGR888 &&\n> +           config.pixelFormat != formats::XBGR8888) {\n> +               std::cerr\n> +                       << \"Only BGR888 and XBGR8888 output pixel formats are supported (\"\n> +                       << config.pixelFormat << \" requested)\" << std::endl;\n>                 return -EINVAL;\n>         }\n>  \n> @@ -42,8 +45,18 @@ 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::XBGR8888;\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] = row[x * 4];\n> +                               transformedRow[x * 3 + 1] = row[x * 4 + 1];\n> +                               transformedRow[x * 3 + 2] = row[x * 4 + 2];\n> +                       }\n> +\n\nIf we end up with transformations - perhaps we should support things\ncommonly as Pavel suggested in https://patchwork.libcamera.org/patch/23177/ ?\n\nCould you try that patch please?\n\n--\nKieran\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 1878EBEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 30 Aug 2025 10:40:09 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4603E69322;\n\tSat, 30 Aug 2025 12:40: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 4C6D9613AF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 30 Aug 2025 12:40:06 +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 6653615B2;\n\tSat, 30 Aug 2025 12:39:00 +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=\"J2tPinYu\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1756550340;\n\tbh=nozgmQli2SjFBUQ4bWxO4tG7fkOr4VhIcnaz13GLLi8=;\n\th=In-Reply-To:References:Subject:From:To:Cc:Date:From;\n\tb=J2tPinYuFZHAfnqzkIuDeMvVpR/azG7hVIvSBlcGF8JbRk9BQ6O6gHAiK4pMPINAg\n\t2JXca74Y8Q2qF8fiiu0VljKdDf8LC6z2wTnIrlx6E+IfRu4eLNiFKqWolahjhK7od1\n\tN6DnNTtJz/8pIUYBt85JwIPwk4t8/LlAl+I69p9A=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250829150804.53498-1-mzamazal@redhat.com>","References":"<20250829150804.53498-1-mzamazal@redhat.com>","Subject":"Re: [PATCH] apps: cam: Support PPM output for XBGR8888","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","To":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","Cc":"Milan Zamazal <mzamazal@redhat.com>,\n\t\"Bryan O'Donoghue\" <bryan.odonoghue@linaro.org>,\n\tPavel Machek <pavel@ucw.cz>, ","Date":"Sat, 30 Aug 2025 11:40:03 +0100","Message-ID":"<175655040341.1721288.4324020449616803893@ping.linuxembedded.co.uk>","User-Agent":"alot/0.9.1","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":35642,"web_url":"https://patchwork.libcamera.org/comment/35642/","msgid":"<85zfbgr1yh.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-08-30T20:25:58","subject":"Re: [PATCH] apps: cam: Support PPM output for XBGR8888","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Kieran Bingham <kieran.bingham@ideasonboard.com> writes:\n\n> Hi Milan,\n>\n> Quoting Milan Zamazal (2025-08-29 16:08:04)\n>> GPU ISP can produce only 32-bit output.  Let's add support to the PPM\n>> writer for XBGR8888 image format so that we can store GPU ISP output as\n>> PPM files.\n>> \n>> There is no obvious performance penalty in my environment compared to\n>> output in the raw format.\n>> \n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>  src/apps/common/ppm_writer.cpp | 21 +++++++++++++++++----\n>>  1 file changed, 17 insertions(+), 4 deletions(-)\n>> \n>> diff --git a/src/apps/common/ppm_writer.cpp b/src/apps/common/ppm_writer.cpp\n>> index 368de8bf6..6c12b11d7 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,11 @@ 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>> +       if (config.pixelFormat != formats::BGR888 &&\n>> +           config.pixelFormat != formats::XBGR8888) {\n>> +               std::cerr\n>> +                       << \"Only BGR888 and XBGR8888 output pixel formats are supported (\"\n>> +                       << config.pixelFormat << \" requested)\" << std::endl;\n>>                 return -EINVAL;\n>>         }\n>>  \n>> @@ -42,8 +45,18 @@ 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::XBGR8888;\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] = row[x * 4];\n>> +                               transformedRow[x * 3 + 1] = row[x * 4 + 1];\n>> +                               transformedRow[x * 3 + 2] = row[x * 4 + 2];\n>> +                       }\n>> +\n>\n> If we end up with transformations - perhaps we should support things\n> commonly as Pavel suggested in https://patchwork.libcamera.org/patch/23177/ ?\n\nOh, reinventing a wheel here.  Indeed, now we have a clear use case for\nPavel's patch.\n\n> Could you try that patch please?\n\nWorks for me with GPU ISP.\n\n> --\n> Kieran\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 09C95BD87C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 30 Aug 2025 20:26:10 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1FA0569322;\n\tSat, 30 Aug 2025 22:26:08 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BE899692EF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 30 Aug 2025 22:26:05 +0200 (CEST)","from mail-wr1-f70.google.com (mail-wr1-f70.google.com\n\t[209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-117-BL0-JalMMBCp_QBIZ4_KBw-1; Sat, 30 Aug 2025 16:26:01 -0400","by mail-wr1-f70.google.com with SMTP id\n\tffacd0b85a97d-3cf48eca078so1575302f8f.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 30 Aug 2025 13:26:01 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-3cf270fd01csm8565643f8f.12.2025.08.30.13.25.58\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tSat, 30 Aug 2025 13:25:59 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"cMidQr78\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1756585564;\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=AHNPC0qV61mKKN7Eru5cXWx0JBmvpTW7yXwvouHdOSg=;\n\tb=cMidQr78XwOV48KVXdK33WRoHH9Oai9i8ZmU7jXJR9+ChuOS/KcDEABcygDNScqsNXLS7N\n\tpyDi4whAuv8YwknsrgNzZVcO5q7UcRnTCYoykYY2MFckXd55tbPNKEV8hAPyEOsSNKPFyn\n\tLfOJWp2KZ6Dumuds0VPfGW8xrl6xbdk=","X-MC-Unique":"BL0-JalMMBCp_QBIZ4_KBw-1","X-Mimecast-MFC-AGG-ID":"BL0-JalMMBCp_QBIZ4_KBw_1756585561","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1756585560; x=1757190360;\n\th=mime-version:user-agent:message-id:date:references:in-reply-to\n\t:subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=AHNPC0qV61mKKN7Eru5cXWx0JBmvpTW7yXwvouHdOSg=;\n\tb=oPEe/+LfSQfQKI6GuEeIw/TyhBRjbAMbWU6xyPHbOJuIo0+bduvtEkWdNWTphmLAvi\n\tMo6s3jSVK1VUZC255/tgnVJgiXVynJVjycr9luCfVRGtXg8Z12S3qOJmK7B0344vhW4V\n\tyenzX1P9Sq0HGiWXVdaUxVCsBbjVNmNpAaczZYZb5QYv+84hyDY5qf9sk+F+20TtY+NO\n\tml5v4xXbc56/NyIOXbcgdniNaYBkifxCXDQQw1aSJUizUe1xW0z+IRwCyhtEnsr0MNIg\n\tDQVF+MNXgM9igPgtCX7wXovK2pdBKUM7PLerA8w1EBAbLAYrU4wryaxGKvGsMd52Usnv\n\tBWRw==","X-Gm-Message-State":"AOJu0Yzco5s8IGnmxR1+Og9/Z7hW1KQ56Lw9GzKF5vnRZrUyaCP1zWdR\n\tJdZa9QJPagaRw2oH2r91ULaW/NKmKU2rKgMEky5yqs75rhUznkbgoWhXA6fbsQHRol+wW0U2+Yi\n\tROzPobmTe1B5fjdsoWhKRD38RGpwMWeLfWWIhcssgkirFNlLKkbkYRcpDuSTY7D9nWJR/JyTXjO\n\ts=","X-Gm-Gg":"ASbGncut7cT+fHj316eFNzz3c7zusTDUQ3/gaSrFfPI/BG4hrVGUJ7XLPW2ngF3lUx/\n\tuKI93TkbPjSU01dUx7qZTCMTbauPGx2T1Hb2nGk/8ioiTHxzj1K4ljSaLWHKnROC5sRoHM5uZcS\n\tasovTASeiZECo1W9OW4NLNYCDDbuI0+VyMg3FBb4x/fMaxEknKtnbBO9es9Rm4gnbv90iId7EE3\n\tVgEH84mpTW1hS+1nkZ0V2MdERxQKZ6BNaoxCadEl/mNryrQ00qBmE9gitzVNcHa+pRCRO53OAw7\n\ttPbPQw1blHVzAWlEHCbEgHSlQwlnkrT63GFzRXwHP05wSodt9EUUwU9Z9wxsVl189I5iQ3HxuOc\n\tdZ1OD0u5H+rJcr+s73g==","X-Received":["by 2002:a5d:4609:0:b0:3d2:45f0:4597 with SMTP id\n\tffacd0b85a97d-3d245f049bcmr1068703f8f.7.1756585560551; \n\tSat, 30 Aug 2025 13:26:00 -0700 (PDT)","by 2002:a5d:4609:0:b0:3d2:45f0:4597 with SMTP id\n\tffacd0b85a97d-3d245f049bcmr1068694f8f.7.1756585560101; \n\tSat, 30 Aug 2025 13:26:00 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IFef2RA++DVigdIxUiAOo1XWlG40d6u0y7pCBBSJ8JyrEeFDn9TtwrEP/v5iSmVVJ/DhGSCnQ==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,  \"Bryan O'Donoghue\"\n\t<bryan.odonoghue@linaro.org>,  Pavel Machek <pavel@ucw.cz>","Subject":"Re: [PATCH] apps: cam: Support PPM output for XBGR8888","In-Reply-To":"<175655040341.1721288.4324020449616803893@ping.linuxembedded.co.uk>\n\t(Kieran Bingham's message of \"Sat, 30 Aug 2025 11:40:03 +0100\")","References":"<20250829150804.53498-1-mzamazal@redhat.com>\n\t<175655040341.1721288.4324020449616803893@ping.linuxembedded.co.uk>","Date":"Sat, 30 Aug 2025 22:25:58 +0200","Message-ID":"<85zfbgr1yh.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"4VVrDCR48OWOvLr7BSdS7X76F6NJT4m573T3XWuh6vo_1756585561","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain","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":35651,"web_url":"https://patchwork.libcamera.org/comment/35651/","msgid":"<aLSn+VuDEqwWiriJ@duo.ucw.cz>","date":"2025-08-31T19:52:25","subject":"Re: [PATCH] apps: cam: Support PPM output for XBGR8888","submitter":{"id":49,"url":"https://patchwork.libcamera.org/api/people/49/","name":"Pavel Machek","email":"pavel@ucw.cz"},"content":"On Sat 2025-08-30 22:25:58, Milan Zamazal wrote:\n> Kieran Bingham <kieran.bingham@ideasonboard.com> writes:\n> \n> > Hi Milan,\n> >\n> > Quoting Milan Zamazal (2025-08-29 16:08:04)\n> >> GPU ISP can produce only 32-bit output.  Let's add support to the PPM\n> >> writer for XBGR8888 image format so that we can store GPU ISP output as\n> >> PPM files.\n> >> \n> >> There is no obvious performance penalty in my environment compared to\n> >> output in the raw format.\n> >> \n> >> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> >> ---\n> >>  src/apps/common/ppm_writer.cpp | 21 +++++++++++++++++----\n> >>  1 file changed, 17 insertions(+), 4 deletions(-)\n> >> \n> >> diff --git a/src/apps/common/ppm_writer.cpp b/src/apps/common/ppm_writer.cpp\n> >> index 368de8bf6..6c12b11d7 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,11 @@ 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> >> +       if (config.pixelFormat != formats::BGR888 &&\n> >> +           config.pixelFormat != formats::XBGR8888) {\n> >> +               std::cerr\n> >> +                       << \"Only BGR888 and XBGR8888 output pixel formats are supported (\"\n> >> +                       << config.pixelFormat << \" requested)\" << std::endl;\n> >>                 return -EINVAL;\n> >>         }\n> >>  \n> >> @@ -42,8 +45,18 @@ 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::XBGR8888;\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] = row[x * 4];\n> >> +                               transformedRow[x * 3 + 1] = row[x * 4 + 1];\n> >> +                               transformedRow[x * 3 + 2] = row[x * 4 + 2];\n> >> +                       }\n> >> +\n> >\n> > If we end up with transformations - perhaps we should support things\n> > commonly as Pavel suggested in https://patchwork.libcamera.org/patch/23177/ ?\n> \n> Oh, reinventing a wheel here.  Indeed, now we have a clear use case for\n> Pavel's patch.\n> \n> > Could you try that patch please?\n> \n> Works for me with GPU ISP.\n\nI'm currently hacking on clicks machine; I'll be happy if someone\npicks this up.\n\nBest regards,\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 29D29BEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 31 Aug 2025 19:52:29 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4FB58613AF;\n\tSun, 31 Aug 2025 21:52:28 +0200 (CEST)","from jabberwock.ucw.cz (jabberwock.ucw.cz [46.255.230.98])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 540C4613AD\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 31 Aug 2025 21:52:26 +0200 (CEST)","by jabberwock.ucw.cz (Postfix, from userid 1017)\n\tid D57821C01BD; Sun, 31 Aug 2025 21:52:25 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ucw.cz header.i=@ucw.cz header.b=\"fhns5FxN\";\n\tdkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=ucw.cz; s=gen1;\n\tt=1756669945;\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=P1CDcojVtzlgRRNwL7L4IkKv58wZWfwraMmgaGxdlwg=;\n\tb=fhns5FxNKt9vNxrOB4yE1IKHYYC40QFv3FfxL82/6Hwtu3or0z6GQCktEAQEE+xlHd+mUR\n\t7YpLWPKapyYm2qB0oBMr5C3DRQPyjyOIE8G/lkraz+F+eLpyiqjmQZPn9TAkyEMmWl/rb/\n\tItAsh+hiniNx/3Rn+nb6+AOTNcVxpmg=","Date":"Sun, 31 Aug 2025 21:52:25 +0200","From":"Pavel Machek <pavel@ucw.cz>","To":"Milan Zamazal <mzamazal@redhat.com>","Cc":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org,\n\tBryan O'Donoghue <bryan.odonoghue@linaro.org>","Subject":"Re: [PATCH] apps: cam: Support PPM output for XBGR8888","Message-ID":"<aLSn+VuDEqwWiriJ@duo.ucw.cz>","References":"<20250829150804.53498-1-mzamazal@redhat.com>\n\t<175655040341.1721288.4324020449616803893@ping.linuxembedded.co.uk>\n\t<85zfbgr1yh.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha1;\n\tprotocol=\"application/pgp-signature\"; boundary=\"j9weLVbezXADLn9M\"","Content-Disposition":"inline","In-Reply-To":"<85zfbgr1yh.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","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":35669,"web_url":"https://patchwork.libcamera.org/comment/35669/","msgid":"<85frd62uwb.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-09-01T12:56:52","subject":"Re: [PATCH] apps: cam: Support PPM output for XBGR8888","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Pavel Machek <pavel@ucw.cz> writes:\n\n> On Sat 2025-08-30 22:25:58, Milan Zamazal wrote:\n>> Kieran Bingham <kieran.bingham@ideasonboard.com> writes:\n>> \n>\n>> > Hi Milan,\n>> >\n>> > Quoting Milan Zamazal (2025-08-29 16:08:04)\n>> >> GPU ISP can produce only 32-bit output.  Let's add support to the PPM\n>> >> writer for XBGR8888 image format so that we can store GPU ISP output as\n>> >> PPM files.\n>> >> \n>> >> There is no obvious performance penalty in my environment compared to\n>> >> output in the raw format.\n>> >> \n>> >> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> >> ---\n>> >>  src/apps/common/ppm_writer.cpp | 21 +++++++++++++++++----\n>> >>  1 file changed, 17 insertions(+), 4 deletions(-)\n>> >> \n>> >> diff --git a/src/apps/common/ppm_writer.cpp b/src/apps/common/ppm_writer.cpp\n>> >> index 368de8bf6..6c12b11d7 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,11 @@ 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>> >> +       if (config.pixelFormat != formats::BGR888 &&\n>> >> +           config.pixelFormat != formats::XBGR8888) {\n>> >> +               std::cerr\n>> >> +                       << \"Only BGR888 and XBGR8888 output pixel formats are supported (\"\n>> >> +                       << config.pixelFormat << \" requested)\" << std::endl;\n>> >>                 return -EINVAL;\n>> >>         }\n>> >>  \n>> >> @@ -42,8 +45,18 @@ 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::XBGR8888;\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] = row[x * 4];\n>> >> +                               transformedRow[x * 3 + 1] = row[x * 4 + 1];\n>> >> +                               transformedRow[x * 3 + 2] = row[x * 4 + 2];\n>> >> +                       }\n>> >> +\n>> >\n>> > If we end up with transformations - perhaps we should support things\n>> > commonly as Pavel suggested in https://patchwork.libcamera.org/patch/23177/ ?\n>> \n>> Oh, reinventing a wheel here.  Indeed, now we have a clear use case for\n>> Pavel's patch.\n>> \n>> > Could you try that patch please?\n>> \n>> Works for me with GPU ISP.\n>\n> I'm currently hacking on clicks machine; I'll be happy if someone\n> picks this up.\n\nLooking closer, I think I can simply go on with my patch by\nincorporating the \"conversion table\" from your patch.  In any way, I'll\ntake care of this matter, thanks for your contribution and good luck\nwith clicks machine :-).\n\n> Best regards,\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 04176BEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  1 Sep 2025 12:57:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D0E3A69332;\n\tMon,  1 Sep 2025 14:56:59 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2C31969323\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  1 Sep 2025 14:56:58 +0200 (CEST)","from mail-wr1-f69.google.com (mail-wr1-f69.google.com\n\t[209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-267-5_b7KJqrN6q6VUVGyZRkdw-1; Mon, 01 Sep 2025 08:56:55 -0400","by mail-wr1-f69.google.com with SMTP id\n\tffacd0b85a97d-3d160b611fdso1372331f8f.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 01 Sep 2025 05:56:55 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-45b7e68c83asm165386405e9.20.2025.09.01.05.56.53\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 01 Sep 2025 05:56:53 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"Y2JXuHKp\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1756731417;\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=ohCYsRMKqcpi5GlkoLe87rBYMn7Z0Cs7ZhRWZcZ8z5U=;\n\tb=Y2JXuHKpUR3ImfGj2KXcMreE4ORTD4T0Dr1PXIJxZWJB1PUeEclcRuOEOgu/9CP87Oynge\n\tRSQMY3/EXtgjirx36bp9qA5riS1dAgiZHStn3xNxLodmmtcxy+AQNl8AHd8Ao9RqtXJsr0\n\tpUH7fSaL99rgxHcisl5pELi5CPVPZMM=","X-MC-Unique":"5_b7KJqrN6q6VUVGyZRkdw-1","X-Mimecast-MFC-AGG-ID":"5_b7KJqrN6q6VUVGyZRkdw_1756731415","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1756731414; x=1757336214;\n\th=mime-version:user-agent:message-id:date:references:in-reply-to\n\t:subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=ohCYsRMKqcpi5GlkoLe87rBYMn7Z0Cs7ZhRWZcZ8z5U=;\n\tb=dUa4Mc/rzh9BN+mcZedquTwk5eyfN8Mex6nv9mnsJHc6asRhRuyD1mSgm4OhkELOJA\n\tDIcln97C3zpikCPDLV3k+FxnNo9uO34TpnKJr1LPXz/NasoXrEatHWexIOdOwzJdhKg9\n\tSPipZXU31bNQPmB7lWtlSsAgJfOAkvnbd93jQMakM5pQRAKg/94ffzs6YnORF28jI7lX\n\tig48MIoqblQGM2U7hRxXXaaACBtBnYWZ5DZjyfiNJK/Ie+8QqiWhoxCCF5wvHkYemk9c\n\tBnQ6mdy+afrjAfRKNx5xF5N9FtzpxswV2Mnj9xllEiMMoDAPiVnEs3Nt94ckJ3ez+0GU\n\teQCQ==","X-Forwarded-Encrypted":"i=1;\n\tAJvYcCVwh+hZ+FFpO6Dr8kgl2mI0PEF2vh92N+xGhb1CVAk3hI2Sgx8fLLUO7TZ2aCdxb4QGhOFPSgPVDHIFCT27+IU=@lists.libcamera.org","X-Gm-Message-State":"AOJu0YyCByFYdWD75/4DqFaNhZHGVHItQASFRw1BL3q3nNHyAVJyF2Zo\n\ts6H78vqlIoQFr5aR+3u8hp4RjNVN8pW0YZR3H5ux4C1a7tLvDP8Dp9/8F79HUYJayft5bukVAd8\n\tQUKE7ShffyKroJb8lUV1Ro+XehPd1cnJhMuqDElaDDe722ts8VZ0SEQzYNkq8y4Rw/+wFmaIptH\n\tg=","X-Gm-Gg":"ASbGncvSs27JhgrjO3nGrpoyh88WFRikxU1YE4fvFZDd2mB3OjNdURqwBT+NMXHa8cx\n\twAA1EUw1dBY4byyB1DPTTbEKpa14FSUqIPj5AXC5uvRacTwP+dNI1jmNDw4X2eTeWfsuUwyBXVo\n\t5tQZ5N271DIpFuOuZmLNgXtnZLwjsRgqLcImEI0FXnL0hXfVTIwiMgqglFTOB32BgEaIibc8MA4\n\tcIUCRzJPGqDcZMCBp9TRTyF5Oosib87ZcdHLRDy06rx1HotqXLIlF0T1N2husDqzUv7vjuKul9G\n\tViE+8+kbMDCWvTx0fHA6Xh65cqajLJnKzup3APdGBBPWdevOlj8pDgoQBc9+pSHlBEM/nW+BE3I\n\tBFTg+P2dNKtyH6QWWoQ==","X-Received":["by 2002:a05:6000:420e:b0:3b7:dd87:d730 with SMTP id\n\tffacd0b85a97d-3d1e04bdd51mr6298839f8f.52.1756731414601; \n\tMon, 01 Sep 2025 05:56:54 -0700 (PDT)","by 2002:a05:6000:420e:b0:3b7:dd87:d730 with SMTP id\n\tffacd0b85a97d-3d1e04bdd51mr6298812f8f.52.1756731414118; \n\tMon, 01 Sep 2025 05:56:54 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IFFgC/4W2QHPDv7BRti2fU55Lr92qplYLSKM1nUhwU+uKcI176rpH3bQgEuvdv8m443vvWrhQ==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Pavel Machek <pavel@ucw.cz>","Cc":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org,  Bryan O'Donoghue\n\t<bryan.odonoghue@linaro.org>","Subject":"Re: [PATCH] apps: cam: Support PPM output for XBGR8888","In-Reply-To":"<aLSn+VuDEqwWiriJ@duo.ucw.cz> (Pavel Machek's message of \"Sun,\n\t31 Aug 2025 21:52:25 +0200\")","References":"<20250829150804.53498-1-mzamazal@redhat.com>\n\t<175655040341.1721288.4324020449616803893@ping.linuxembedded.co.uk>\n\t<85zfbgr1yh.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>\n\t<aLSn+VuDEqwWiriJ@duo.ucw.cz>","Date":"Mon, 01 Sep 2025 14:56:52 +0200","Message-ID":"<85frd62uwb.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"oI1RYMQqiYSUG-Y2MnXf6HkkRa1dOApeDIwReTwWFcs_1756731415","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain","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>"}}]