{"id":24269,"url":"https://patchwork.libcamera.org/api/patches/24269/?format=json","web_url":"https://patchwork.libcamera.org/patch/24269/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20250829150804.53498-1-mzamazal@redhat.com>","date":"2025-08-29T15:08:04","name":"apps: cam: Support PPM output for XBGR8888","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"0aa4016fd8ccd6325ea8ef680c458ea6d934dadc","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/?format=json","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/24269/mbox/","series":[{"id":5414,"url":"https://patchwork.libcamera.org/api/series/5414/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5414","date":"2025-08-29T15:08:04","name":"apps: cam: Support PPM output for XBGR8888","version":1,"mbox":"https://patchwork.libcamera.org/series/5414/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/24269/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/24269/checks/","tags":{},"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 11079BEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 29 Aug 2025 15:08:24 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0E02169321;\n\tFri, 29 Aug 2025 17:08:23 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id DA3DE692E7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 29 Aug 2025 17:08:20 +0200 (CEST)","from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-186-sYztmv-UP3K9nfBuLhJ81g-1;\n\tFri, 29 Aug 2025 11:08:18 -0400","from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.93])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange X25519 server-signature RSA-PSS (2048 bits)\n\tserver-digest SHA256) (No client certificate requested)\n\tby mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS id 2D91A180895E; Fri, 29 Aug 2025 15:08:11 +0000 (UTC)","from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.45.224.87])\n\tby mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id 73D1018002A0; Fri, 29 Aug 2025 15:08:07 +0000 (UTC)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"KRO3KpWY\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1756480099;\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\tcontent-transfer-encoding:content-transfer-encoding;\n\tbh=nraScUyd3ZrVdifCQcCD9xFls/XjT0ffC5QgGuA1bMY=;\n\tb=KRO3KpWYflYMVQWN3z56RdMoLavyL3P6sv1Rw/2I3bOSG+LtqqpFNnT8VvNJyOFMfN/D4h\n\t2OdwNAhPh9vSZ5UuOxtW1ePdNkNczkHXNKIYX8vKPiXJLGFgvnJycVDoefHkMCJOzhbRnG\n\tRo3KMGXq+AP4rw3hq+QFZnHoHBMaEtI=","X-MC-Unique":"sYztmv-UP3K9nfBuLhJ81g-1","X-Mimecast-MFC-AGG-ID":"sYztmv-UP3K9nfBuLhJ81g_1756480094","From":"Milan Zamazal <mzamazal@redhat.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"Milan Zamazal <mzamazal@redhat.com>,\n\t\"Bryan O'Donoghue\" <bryan.odonoghue@linaro.org>","Subject":"[PATCH] apps: cam: Support PPM output for XBGR8888","Date":"Fri, 29 Aug 2025 17:08:04 +0200","Message-ID":"<20250829150804.53498-1-mzamazal@redhat.com>","MIME-Version":"1.0","X-Scanned-By":"MIMEDefang 3.4.1 on 10.30.177.93","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"k31_zxiw80CO8GJLhuu1Rs06ftqewazM39_BsXNUTeM_1756480094","X-Mimecast-Originator":"redhat.com","Content-Transfer-Encoding":"8bit","content-type":"text/plain; charset=\"US-ASCII\"; x-default=true","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>"},"content":"GPU ISP can produce only 32-bit output.  Let's add support to the PPM\nwriter for XBGR8888 image format so that we can store GPU ISP output as\nPPM files.\n\nThere is no obvious performance penalty in my environment compared to\noutput in the raw format.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n src/apps/common/ppm_writer.cpp | 21 +++++++++++++++++----\n 1 file changed, 17 insertions(+), 4 deletions(-)","diff":"diff --git a/src/apps/common/ppm_writer.cpp b/src/apps/common/ppm_writer.cpp\nindex 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 \t\t     const StreamConfiguration &config,\n \t\t     const Span<uint8_t> &data)\n {\n-\tif (config.pixelFormat != formats::BGR888) {\n-\t\tstd::cerr << \"Only BGR888 output pixel format is supported (\"\n-\t\t\t  << config.pixelFormat << \" requested)\" << std::endl;\n+\tif (config.pixelFormat != formats::BGR888 &&\n+\t    config.pixelFormat != formats::XBGR8888) {\n+\t\tstd::cerr\n+\t\t\t<< \"Only BGR888 and XBGR8888 output pixel formats are supported (\"\n+\t\t\t<< config.pixelFormat << \" requested)\" << std::endl;\n \t\treturn -EINVAL;\n \t}\n \n@@ -42,8 +45,18 @@ int PPMWriter::write(const char *filename,\n \n \tconst unsigned int rowLength = config.size.width * 3;\n \tconst char *row = reinterpret_cast<const char *>(data.data());\n+\tconst bool transform = config.pixelFormat == formats::XBGR8888;\n+\tstd::vector<char> transformedRow(transform ? rowLength : 0);\n+\n \tfor (unsigned int y = 0; y < config.size.height; y++, row += config.stride) {\n-\t\toutput.write(row, rowLength);\n+\t\tif (transform)\n+\t\t\tfor (unsigned int x = 0; x < config.size.width; x++) {\n+\t\t\t\ttransformedRow[x * 3] = row[x * 4];\n+\t\t\t\ttransformedRow[x * 3 + 1] = row[x * 4 + 1];\n+\t\t\t\ttransformedRow[x * 3 + 2] = row[x * 4 + 2];\n+\t\t\t}\n+\n+\t\toutput.write((transform ? transformedRow.data() : row), rowLength);\n \t\tif (!output) {\n \t\t\tstd::cerr << \"Failed to write image data at row \" << y << std::endl;\n \t\t\treturn -EIO;\n","prefixes":[]}