From patchwork Fri Aug 29 15:08:04 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 24269 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 11079BEFBE for ; Fri, 29 Aug 2025 15:08:24 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0E02169321; Fri, 29 Aug 2025 17:08:23 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="KRO3KpWY"; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id DA3DE692E7 for ; Fri, 29 Aug 2025 17:08:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1756480099; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=nraScUyd3ZrVdifCQcCD9xFls/XjT0ffC5QgGuA1bMY=; b=KRO3KpWYflYMVQWN3z56RdMoLavyL3P6sv1Rw/2I3bOSG+LtqqpFNnT8VvNJyOFMfN/D4h 2OdwNAhPh9vSZ5UuOxtW1ePdNkNczkHXNKIYX8vKPiXJLGFgvnJycVDoefHkMCJOzhbRnG Ro3KMGXq+AP4rw3hq+QFZnHoHBMaEtI= Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-186-sYztmv-UP3K9nfBuLhJ81g-1; Fri, 29 Aug 2025 11:08:18 -0400 X-MC-Unique: sYztmv-UP3K9nfBuLhJ81g-1 X-Mimecast-MFC-AGG-ID: sYztmv-UP3K9nfBuLhJ81g_1756480094 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2D91A180895E; Fri, 29 Aug 2025 15:08:11 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.45.224.87]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 73D1018002A0; Fri, 29 Aug 2025 15:08:07 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , "Bryan O'Donoghue" 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-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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" GPU ISP can produce only 32-bit output. Let's add support to the PPM writer for XBGR8888 image format so that we can store GPU ISP output as PPM files. There is no obvious performance penalty in my environment compared to output in the raw format. Signed-off-by: Milan Zamazal Reviewed-by: Paul Elder --- src/apps/common/ppm_writer.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/apps/common/ppm_writer.cpp b/src/apps/common/ppm_writer.cpp index 368de8bf6..6c12b11d7 100644 --- a/src/apps/common/ppm_writer.cpp +++ b/src/apps/common/ppm_writer.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -20,9 +21,11 @@ int PPMWriter::write(const char *filename, const StreamConfiguration &config, const Span &data) { - if (config.pixelFormat != formats::BGR888) { - std::cerr << "Only BGR888 output pixel format is supported (" - << config.pixelFormat << " requested)" << std::endl; + if (config.pixelFormat != formats::BGR888 && + config.pixelFormat != formats::XBGR8888) { + std::cerr + << "Only BGR888 and XBGR8888 output pixel formats are supported (" + << config.pixelFormat << " requested)" << std::endl; return -EINVAL; } @@ -42,8 +45,18 @@ int PPMWriter::write(const char *filename, const unsigned int rowLength = config.size.width * 3; const char *row = reinterpret_cast(data.data()); + const bool transform = config.pixelFormat == formats::XBGR8888; + std::vector transformedRow(transform ? rowLength : 0); + for (unsigned int y = 0; y < config.size.height; y++, row += config.stride) { - output.write(row, rowLength); + if (transform) + for (unsigned int x = 0; x < config.size.width; x++) { + transformedRow[x * 3] = row[x * 4]; + transformedRow[x * 3 + 1] = row[x * 4 + 1]; + transformedRow[x * 3 + 2] = row[x * 4 + 2]; + } + + output.write((transform ? transformedRow.data() : row), rowLength); if (!output) { std::cerr << "Failed to write image data at row " << y << std::endl; return -EIO;