From patchwork Thu Jul 2 09:57:35 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 27155 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 E7461C3302 for ; Thu, 2 Jul 2026 09:59:08 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0DF0D65FB6; Thu, 2 Jul 2026 11:59:08 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="CJKq00ch"; dkim-atps=neutral Received: from mail-wr1-x429.google.com (mail-wr1-x429.google.com [IPv6:2a00:1450:4864:20::429]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E5323656DE for ; Thu, 2 Jul 2026 11:59:05 +0200 (CEST) Received: by mail-wr1-x429.google.com with SMTP id ffacd0b85a97d-475881b9a4bso1644121f8f.3 for ; Thu, 02 Jul 2026 02:59:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1782986345; x=1783591145; darn=lists.libcamera.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=LE+NzfGoGt9Hwzeu6FwUq+Tz6ZZOTWRrQoy37bAYpbA=; b=CJKq00chHDXn4qZsVYLU/Hrx8YOKIo9KLeKdezzDAonXiyDuP2T8UjGX9A5md4J5bj FVCZE5G1tnWzUk2vh5yR5PdyNajmwZQFNtb9vmDRc1OCy4IwNRFvXv6qi54wVD4nRIMp /2IcaqhmVa1heqFMsBThPrFbvdKpB0VjO8XFgG2WI8Lc/9A3ORHS4LHAic8BMP11lMqH sK0LH9zgbfNDsd4zq8b6O9DFDKV1ZmgWXpiEDkaP+A1EMfUs8lx/k8VzAFNnnXvquw14 tUc/lLt8YKR2wOdy1fw6z8OK79wCiWYUFLHzeHumkG2PGtMFiz5nsadEs1w0jK2gYcVL cerA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782986345; x=1783591145; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=LE+NzfGoGt9Hwzeu6FwUq+Tz6ZZOTWRrQoy37bAYpbA=; b=g20NWUFqcZCI4V97DOfAv02VQRlZ9lHfxE5OuoAYfaZiFKaal4nHLSFau1E5e1Irqc 7/ogabgFFHmRBo/pSfxOGhZc7imY7jhpfBelfVAeCvxyaTdzFM/MJJ7Vqm1dzY+kEUE/ McdIBoMKiDMwgbnwglxz64AsNSBLuNK7kELCWUwGAybaYytdn/vAE4q4rF2Fr3fbrMea 8rGrTKPgk8fMXCbLJabwaekGnDTSrRiEN8byDckWwzSkUs/HSn99vtHrUHhwpK4vST2v UZiuDk1rYDEfzve7u1ckZcB+ZUIdESNOxkrpRIRnhwxhTX/BUvLoFEp67xcnmCTh30Yk hTbg== X-Gm-Message-State: AOJu0Yxt3BmYC8T1xtJVgs1Jgc7U2/9GlJabpJQuTh6ilvy+2mYRDkt1 YjJqQuQ/i5LS8ZGh1vVwJRa+LBbWSZPBcTYdx+4Ebz1A5SepP80fnRU9nN9MmGQ/Qu2CDLlFbGA VsMOPpgk= X-Gm-Gg: AfdE7cmc10CNEucM34i9pWZFi+7R9x/VTxHH+f6KI6Y2VqJJYeneECaYL475QS5IlZw CRfXA3PcrzED2D9n3h7WsF5vMdDrnNg2EfvhVGS13ppzZExFEOPMPIxdRz5qU/5mJh7A2JwXPyT QWdloZxQb2BwFsXp0vNiOTvBtBMsBYst3ToLZ27myTEqbkLrblpjmvsAY/QFA1X9l0wzfTJhSeu jcB+/6TZuhX2R850q1PwpbAiIpNWyiXA/QuvYjGLGgEmNfSnENriwx6cjdzUDwqGJcHu2dAD4dZ 1Bb8lJ21cova0YnVoT1QRevcEdRPzVKck6G7X3CRLu3DZ9jwnQLn51VgA8tiqhipP248R1J0vXn faj+T0G0iojlNgtVTwu9UG+5PQkFOtmdpVVjwv4kz005EmMIoqTAN90RPinvzl82aJEnHZ8cFKt kn+bXjsYeHk6Zk+tFETSJjNmm3bJYj1gXZId1RyG6fJaJkEpzlcqbvPdSUqUklz8/oqOWuUI6wM Qjv37A5UtXbEC8HvpNl4h23+DKZ6kwY X-Received: by 2002:a05:6000:41e4:b0:473:1706:7efe with SMTP id ffacd0b85a97d-477b398440emr6423535f8f.24.1782986345166; Thu, 02 Jul 2026 02:59:05 -0700 (PDT) Received: from davidp-pi5.pitowers.org ([2a00:1098:3142:1f:4706:89ee:c47e:1087]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-477ddf0f433sm8345917f8f.32.2026.07.02.02.59.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Jul 2026 02:59:04 -0700 (PDT) From: David Plowman To: libcamera-devel@lists.libcamera.org Cc: David Plowman Subject: [PATCH] pipeline: rpi: pisp: Fix colours for NV21 and NV61 pixel formats Date: Thu, 2 Jul 2026 10:57:35 +0100 Message-ID: <20260702095903.79640-1-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.47.3 MIME-Version: 1.0 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" Code was previously passing the "ORDER_SWAPPED" flag to swap the U and V components, but our hardware doesn't actually support this for semi-planar formats. Instead swap over the 2nd and 3rd rows of the output colour conversion matrices to achieve the same effect. Signed-off-by: David Plowman Reviewed-by: Naushir Patuck --- src/libcamera/pipeline/rpi/pisp/pisp.cpp | 27 ++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/libcamera/pipeline/rpi/pisp/pisp.cpp b/src/libcamera/pipeline/rpi/pisp/pisp.cpp index 23f4c14d..5ea57399 100644 --- a/src/libcamera/pipeline/rpi/pisp/pisp.cpp +++ b/src/libcamera/pipeline/rpi/pisp/pisp.cpp @@ -172,11 +172,14 @@ pisp_image_format_config toPiSPImageFormat(V4L2DeviceFormat &format) image.stride2 = image.stride; break; case formats::NV21: + /* + * ORDER_SWAPPED does not work with semi-planar formats, so + * we going to have swap rows in the output CSC matrix. + */ image.format = PISP_IMAGE_FORMAT_THREE_CHANNEL + PISP_IMAGE_FORMAT_BPS_8 + PISP_IMAGE_FORMAT_SAMPLING_420 + - PISP_IMAGE_FORMAT_PLANARITY_SEMI_PLANAR + - PISP_IMAGE_FORMAT_ORDER_SWAPPED; + PISP_IMAGE_FORMAT_PLANARITY_SEMI_PLANAR; image.stride2 = image.stride; break; case formats::YUYV: @@ -200,11 +203,14 @@ pisp_image_format_config toPiSPImageFormat(V4L2DeviceFormat &format) image.stride2 = image.stride; break; case formats::NV61: + /* + * ORDER_SWAPPED does not work with semi-planar formats, so + * we going to have swap rows in the output CSC matrix. + */ image.format = PISP_IMAGE_FORMAT_THREE_CHANNEL + PISP_IMAGE_FORMAT_BPS_8 + PISP_IMAGE_FORMAT_SAMPLING_422 + - PISP_IMAGE_FORMAT_PLANARITY_SEMI_PLANAR + - PISP_IMAGE_FORMAT_ORDER_SWAPPED; + PISP_IMAGE_FORMAT_PLANARITY_SEMI_PLANAR; image.stride2 = image.stride; break; case formats::RGB888: @@ -1964,6 +1970,19 @@ bool PiSPCameraData::calculateCscConfiguration(const V4L2DeviceFormat &v4l2Forma << ", defaulting to sYCC"; be_->InitialiseYcbcr(csc, "jpeg"); } + + if (pixFormat == formats::NV21 || pixFormat == formats::NV61) { + /* + * The ORDER_SWAPPED flag doesn't work with semi-planar formats, + * so instead we have to swap 2 matrix rows. + */ + pisp_be_ccm_config copy = csc; + memcpy(&csc.coeffs[3], ©.coeffs[6], 3 * sizeof(csc.coeffs[0])); + memcpy(&csc.coeffs[6], ©.coeffs[3], 3 * sizeof(csc.coeffs[0])); + csc.offsets[1] = copy.offsets[2]; + csc.offsets[2] = copy.offsets[1]; + } + return true; } /* There will be more formats to check for in due course. */