[{"id":33247,"web_url":"https://patchwork.libcamera.org/comment/33247/","msgid":"<20250203004050.GK12673@pendragon.ideasonboard.com>","date":"2025-02-03T00:40:50","subject":"Re: [PATCH v5 02/10] libcamera: software_isp: Use RGB type to\n\trepresent gains","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Milan,\n\nThank you for the patch.\n\nOn Thu, Jan 30, 2025 at 07:14:39PM +0100, Milan Zamazal wrote:\n> Rather than using a custom struct to represent RGB values, let's use the\n> corresponding type.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  src/ipa/simple/algorithms/awb.cpp | 14 ++++++++------\n>  src/ipa/simple/algorithms/lut.cpp |  6 +++---\n>  src/ipa/simple/ipa_context.h      |  7 ++-----\n>  3 files changed, 13 insertions(+), 14 deletions(-)\n> \n> diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp\n> index 1efc7090..9c85b3f8 100644\n> --- a/src/ipa/simple/algorithms/awb.cpp\n> +++ b/src/ipa/simple/algorithms/awb.cpp\n> @@ -25,7 +25,7 @@ int Awb::configure(IPAContext &context,\n>  \t\t   [[maybe_unused]] const IPAConfigInfo &configInfo)\n>  {\n>  \tauto &gains = context.activeState.awb.gains;\n> -\tgains.red = gains.green = gains.blue = 1.0;\n> +\tgains = { { 1.0, 1.0, 1.0 } };\n>  \n>  \treturn 0;\n>  }\n> @@ -56,15 +56,17 @@ void Awb::process(IPAContext &context,\n>  \t * Clamp max gain at 4.0, this also avoids 0 division.\n>  \t */\n>  \tauto &gains = context.activeState.awb.gains;\n> -\tgains.red = sumR <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumR;\n> -\tgains.blue = sumB <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumB;\n> -\t/* Green gain is fixed to 1.0 */\n> +\tgains = { {\n> +\t\tsumR <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumR,\n> +\t\t1.0,\n> +\t\tsumB <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumB,\n> +\t} };\n>  \n> -\tRGB<double> rgbGains{ { 1 / gains.red, 1 / gains.green, 1 / gains.blue } };\n> +\tRGB<double> rgbGains{ { 1 / gains.r(), 1 / gains.g(), 1 / gains.b() } };\n>  \tcontext.activeState.awb.temperatureK = estimateCCT(rgbGains);\n\nI've sent \"[PATCH] ipa: libipa: vector: Add element-wise division\noperator\" (https://patchwork.libcamera.org/patch/22721/). If it gets\nmerged first, I'll replace this with \n\n\tcontext.activeState.awb.temperatureK = estimateCCT(1.0 / gains);\n\nwhen merging your series. Otherwise I'll update the patch with this\nchange.\n\n>  \n>  \tLOG(IPASoftAwb, Debug)\n> -\t\t<< \"gain R/B: \" << gains.red << \"/\" << gains.blue\n> +\t\t<< \"gain R/B: \" << gains.r() << \"/\" << gains.b()\n>  \t\t<< \"; temperature: \" << context.activeState.awb.temperatureK;\n\nYou can simplify this to\n\n \tLOG(IPASoftAwb, Debug)\n\t\t<< \"gains: \" << gains << \"; temperature: \"\n\t\t<< context.activeState.awb.temperatureK;\n\n>  }\n>  \n> diff --git a/src/ipa/simple/algorithms/lut.cpp b/src/ipa/simple/algorithms/lut.cpp\n> index d75ff710..bd37a955 100644\n> --- a/src/ipa/simple/algorithms/lut.cpp\n> +++ b/src/ipa/simple/algorithms/lut.cpp\n> @@ -104,13 +104,13 @@ void Lut::prepare(IPAContext &context,\n>  \t\t\t\t   gammaTableSize;\n>  \t\t/* Apply gamma after gain! */\n>  \t\tunsigned int idx;\n> -\t\tidx = std::min({ static_cast<unsigned int>(i * gains.red / div),\n> +\t\tidx = std::min({ static_cast<unsigned int>(i * gains.r() / div),\n>  \t\t\t\t gammaTableSize - 1 });\n>  \t\tparams->red[i] = gammaTable[idx];\n> -\t\tidx = std::min({ static_cast<unsigned int>(i * gains.green / div),\n> +\t\tidx = std::min({ static_cast<unsigned int>(i * gains.g() / div),\n>  \t\t\t\t gammaTableSize - 1 });\n>  \t\tparams->green[i] = gammaTable[idx];\n> -\t\tidx = std::min({ static_cast<unsigned int>(i * gains.blue / div),\n> +\t\tidx = std::min({ static_cast<unsigned int>(i * gains.b() / div),\n>  \t\t\t\t gammaTableSize - 1 });\n>  \t\tparams->blue[i] = gammaTable[idx];\n\nThis could be written\n\n\t\tconst RGB<double> lutGains = (gains * i / div).min(gammaTableSize - 1);\n\t\tparams->red[i] = gammaTable[static_cast<unsigned int>(lutGains.r())];\n\t\tparams->green[i] = gammaTable[static_cast<unsigned int>(lutGains.g())];\n\t\tparams->blue[i] = gammaTable[static_cast<unsigned int>(lutGains.b())];\n\nI wonder, should we add a Vector::cast<T> operator ? Then we could write\n\n\t\tconst RGB<unsigned int> lutGains =\n\t\t\t(gains * i / div).cast<unsigned int>().min(gammaTableSize - 1);\n\t\tparams->red[i] = gammaTable[lutGains.r())];\n\t\tparams->green[i] = gammaTable[lutGains.g()];\n\t\tparams->blue[i] = gammaTable[lutGains.b())];\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n>  \t}\n> diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h\n> index 607af45a..df0552db 100644\n> --- a/src/ipa/simple/ipa_context.h\n> +++ b/src/ipa/simple/ipa_context.h\n> @@ -14,6 +14,7 @@\n>  #include <libcamera/controls.h>\n>  \n>  #include <libipa/fc_queue.h>\n> +#include <libipa/vector.h>\n>  \n>  namespace libcamera {\n>  \n> @@ -36,11 +37,7 @@ struct IPAActiveState {\n>  \t} blc;\n>  \n>  \tstruct {\n> -\t\tstruct {\n> -\t\t\tdouble red;\n> -\t\t\tdouble green;\n> -\t\t\tdouble blue;\n> -\t\t} gains;\n> +\t\tRGB<double> gains;\n>  \t\tunsigned int temperatureK;\n>  \t} awb;\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 A30E2C0F1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  3 Feb 2025 00:40:56 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A96C768576;\n\tMon,  3 Feb 2025 01:40:55 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 052E561876\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  3 Feb 2025 01:40:54 +0100 (CET)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A8558497;\n\tMon,  3 Feb 2025 01:39:42 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"iXeFJ7Eg\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1738543182;\n\tbh=9umosoPHOHZTLBSU++0rpjKVLeK9Z0WDxL7WaiVcUTg=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=iXeFJ7EgZ5g/7EclBP7CfussnE4M3B3kRH48XxGSEgx81ah6UURGHZrdr2JX0UiQA\n\tyyxP0lwCZEKxWBopWQijkBk15zDlU6H4sDmTTk7aWjY/gy+nMSgWIImLz6SwNv6AvU\n\tlz4bVdpFulsoJUaNbSC+f+ibj/GeuwLdq4R2ztQg=","Date":"Mon, 3 Feb 2025 02:40:50 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Milan Zamazal <mzamazal@redhat.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tRobert Mader <robert.mader@collabora.com>,\n\tHans de Goede <hdegoede@redhat.com>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>","Subject":"Re: [PATCH v5 02/10] libcamera: software_isp: Use RGB type to\n\trepresent gains","Message-ID":"<20250203004050.GK12673@pendragon.ideasonboard.com>","References":"<20250130181449.130492-1-mzamazal@redhat.com>\n\t<20250130181449.130492-3-mzamazal@redhat.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20250130181449.130492-3-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":33287,"web_url":"https://patchwork.libcamera.org/comment/33287/","msgid":"<85wme569r4.fsf@mzamazal-thinkpadp1gen3.tpbc.csb>","date":"2025-02-04T14:54:23","subject":"Re: [PATCH v5 02/10] libcamera: software_isp: Use RGB type to\n\trepresent gains","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Laurent,\n\nthank you for review.\n\nLaurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n\n> Hi Milan,\n>\n> Thank you for the patch.\n>\n> On Thu, Jan 30, 2025 at 07:14:39PM +0100, Milan Zamazal wrote:\n>> Rather than using a custom struct to represent RGB values, let's use the\n>> corresponding type.\n>> \n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>  src/ipa/simple/algorithms/awb.cpp | 14 ++++++++------\n>>  src/ipa/simple/algorithms/lut.cpp |  6 +++---\n>>  src/ipa/simple/ipa_context.h      |  7 ++-----\n>>  3 files changed, 13 insertions(+), 14 deletions(-)\n>> \n>> diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp\n>> index 1efc7090..9c85b3f8 100644\n>> --- a/src/ipa/simple/algorithms/awb.cpp\n>> +++ b/src/ipa/simple/algorithms/awb.cpp\n>> @@ -25,7 +25,7 @@ int Awb::configure(IPAContext &context,\n>>  \t\t   [[maybe_unused]] const IPAConfigInfo &configInfo)\n>>  {\n>>  \tauto &gains = context.activeState.awb.gains;\n>> -\tgains.red = gains.green = gains.blue = 1.0;\n>> +\tgains = { { 1.0, 1.0, 1.0 } };\n>>  \n>>  \treturn 0;\n>>  }\n>> @@ -56,15 +56,17 @@ void Awb::process(IPAContext &context,\n>>  \t * Clamp max gain at 4.0, this also avoids 0 division.\n>>  \t */\n>>  \tauto &gains = context.activeState.awb.gains;\n>> -\tgains.red = sumR <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumR;\n>> -\tgains.blue = sumB <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumB;\n>> -\t/* Green gain is fixed to 1.0 */\n>> +\tgains = { {\n>> +\t\tsumR <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumR,\n>> +\t\t1.0,\n>> +\t\tsumB <= sumG / 4 ? 4.0 : static_cast<double>(sumG) / sumB,\n>> +\t} };\n>>  \n>> -\tRGB<double> rgbGains{ { 1 / gains.red, 1 / gains.green, 1 / gains.blue } };\n>> +\tRGB<double> rgbGains{ { 1 / gains.r(), 1 / gains.g(), 1 / gains.b() } };\n>>  \tcontext.activeState.awb.temperatureK = estimateCCT(rgbGains);\n>\n> I've sent \"[PATCH] ipa: libipa: vector: Add element-wise division\n> operator\" (https://patchwork.libcamera.org/patch/22721/). If it gets\n> merged first, I'll replace this with \n>\n> \tcontext.activeState.awb.temperatureK = estimateCCT(1.0 / gains);\n>\n> when merging your series. Otherwise I'll update the patch with this\n> change.\n\nOK.\n\n>>  \tLOG(IPASoftAwb, Debug)\n>> -\t\t<< \"gain R/B: \" << gains.red << \"/\" << gains.blue\n>> +\t\t<< \"gain R/B: \" << gains.r() << \"/\" << gains.b()\n>>  \t\t<< \"; temperature: \" << context.activeState.awb.temperatureK;\n>\n> You can simplify this to\n>\n>  \tLOG(IPASoftAwb, Debug)\n> \t\t<< \"gains: \" << gains << \"; temperature: \"\n> \t\t<< context.activeState.awb.temperatureK;\n>\n\nOK.\n\n>>  }\n>>  \n>> diff --git a/src/ipa/simple/algorithms/lut.cpp b/src/ipa/simple/algorithms/lut.cpp\n>> index d75ff710..bd37a955 100644\n>> --- a/src/ipa/simple/algorithms/lut.cpp\n>> +++ b/src/ipa/simple/algorithms/lut.cpp\n>> @@ -104,13 +104,13 @@ void Lut::prepare(IPAContext &context,\n>>  \t\t\t\t   gammaTableSize;\n>>  \t\t/* Apply gamma after gain! */\n>>  \t\tunsigned int idx;\n>> -\t\tidx = std::min({ static_cast<unsigned int>(i * gains.red / div),\n>> +\t\tidx = std::min({ static_cast<unsigned int>(i * gains.r() / div),\n>>  \t\t\t\t gammaTableSize - 1 });\n>>  \t\tparams->red[i] = gammaTable[idx];\n>> -\t\tidx = std::min({ static_cast<unsigned int>(i * gains.green / div),\n>> +\t\tidx = std::min({ static_cast<unsigned int>(i * gains.g() / div),\n>>  \t\t\t\t gammaTableSize - 1 });\n>>  \t\tparams->green[i] = gammaTable[idx];\n>> -\t\tidx = std::min({ static_cast<unsigned int>(i * gains.blue / div),\n>> +\t\tidx = std::min({ static_cast<unsigned int>(i * gains.b() / div),\n>>  \t\t\t\t gammaTableSize - 1 });\n>>  \t\tparams->blue[i] = gammaTable[idx];\n>\n> This could be written\n>\n> \t\tconst RGB<double> lutGains = (gains * i / div).min(gammaTableSize - 1);\n> \t\tparams->red[i] = gammaTable[static_cast<unsigned int>(lutGains.r())];\n> \t\tparams->green[i] = gammaTable[static_cast<unsigned int>(lutGains.g())];\n> \t\tparams->blue[i] = gammaTable[static_cast<unsigned int>(lutGains.b())];\n\nIndeed, nicer.\n\n> I wonder, should we add a Vector::cast<T> operator ? Then we could write\n>\n> \t\tconst RGB<unsigned int> lutGains =\n> \t\t\t(gains * i / div).cast<unsigned int>().min(gammaTableSize - 1);\n> \t\tparams->red[i] = gammaTable[lutGains.r())];\n> \t\tparams->green[i] = gammaTable[lutGains.g()];\n> \t\tparams->blue[i] = gammaTable[lutGains.b())];\n\nMaybe yes if it was a repeating pattern but not worth at the moment.\n\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n>\n>>  \t}\n>> diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h\n>> index 607af45a..df0552db 100644\n>> --- a/src/ipa/simple/ipa_context.h\n>> +++ b/src/ipa/simple/ipa_context.h\n>> @@ -14,6 +14,7 @@\n>>  #include <libcamera/controls.h>\n>>  \n>>  #include <libipa/fc_queue.h>\n>> +#include <libipa/vector.h>\n>>  \n>>  namespace libcamera {\n>>  \n>> @@ -36,11 +37,7 @@ struct IPAActiveState {\n>>  \t} blc;\n>>  \n>>  \tstruct {\n>> -\t\tstruct {\n>> -\t\t\tdouble red;\n>> -\t\t\tdouble green;\n>> -\t\t\tdouble blue;\n>> -\t\t} gains;\n>> +\t\tRGB<double> gains;\n>>  \t\tunsigned int temperatureK;\n>>  \t} awb;\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 E077FC32F1\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  4 Feb 2025 14:54:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C686D685B6;\n\tTue,  4 Feb 2025 15:54:31 +0100 (CET)","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 8FC1B685A7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  4 Feb 2025 15:54:29 +0100 (CET)","from mail-ej1-f71.google.com (mail-ej1-f71.google.com\n\t[209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-262-lB9o5y8cP86dJoGWnn8Ihg-1; Tue, 04 Feb 2025 09:54:27 -0500","by mail-ej1-f71.google.com with SMTP id\n\ta640c23a62f3a-aaf901a0ef9so500349966b.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 04 Feb 2025 06:54:26 -0800 (PST)","from mzamazal-thinkpadp1gen3.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\ta640c23a62f3a-ab6e49ff98bsm943125266b.101.2025.02.04.06.54.24\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 04 Feb 2025 06:54:24 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"XANGlr4l\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1738680868;\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=Sf1iCJ3y6CBYSsh8BU1fohUW8M78rlLzf8dKKq53SlU=;\n\tb=XANGlr4lgOIiMVYgvh72zyjgT9nxKHSUB+hdJNjqFxdZ3jbzQBh7jg7+NWbT6H2R65oBzp\n\tBmeua3HjenkJCBfax2PjTT9QOIaEfDiCgpaHCBB3x1AnmpsSEDtqt9SabiRXJ+YLXFU38r\n\tFtfpKuAkkP9zBYeTGsMdt7zT+E7PtkI=","X-MC-Unique":"lB9o5y8cP86dJoGWnn8Ihg-1","X-Mimecast-MFC-AGG-ID":"lB9o5y8cP86dJoGWnn8Ihg","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1738680866; x=1739285666;\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=Sf1iCJ3y6CBYSsh8BU1fohUW8M78rlLzf8dKKq53SlU=;\n\tb=mUGyELLpV7p/T6jhvbnVM+7e1o/BB1CdWgGEzh9B5BRR7aXC1KZytBC5CTi0hNxztU\n\t4yAc6h2tveZ+EiKeEQ5KFKYsPLIPBp2aITBcNhzj3wnLxVjMOIpI5Y+dJUZYTwaZCftA\n\txRNm9wRygVtYOhBNCT/f5b1eN6GLJKna7cgjPd9h0vM9g+N89cATalZcCtbIhtZHhIkT\n\tTqBcRqTrWu5/68oc1Nki/0bv5sZtZ0DFoqsaZKQh+m1V1N3racIaV+Pgxf+z/4TSjewl\n\t/rl+v43bCx7+iMby/YFogJIo29/7nrxixgIpCxLAIrXHlaF8KRfEIIlce5MB68P6r/Ef\n\tyRZg==","X-Gm-Message-State":"AOJu0YwnlOI8WxrfR89zfv2UhFVFk3djni4RFwMP9N3bQChTLVSDwb2T\n\t3pivV4ogU6dZuLA8qYpbfTCV5/d1rcI4MWwvsSavjsDA9K9UtRHLnURS+QnvO3P5qs4+x/Z/Zj1\n\tXP+JFxV83CPrGnnP+zNyPDZ8gDX7BGL01OchmovSvSTDiDSxovWgphqsaUXOJSL2O5b6XdJQ=","X-Gm-Gg":"ASbGncu5VSu+CAvbw3pwrbX4ZbdMxbQorJEkND2AkvkCUPP95nK+4BjC7KpdG+vlrc7\n\tBN7a5Wv+6xioNMGZzjaozaPmMwvVx+L/53RbEHGolxzKbgFqInMp4uCnyB6K8l5+dLT6XyaL5dF\n\t925J6LD1r75FhF/G7iqwWDTenrPLaScxYa8fTS54OEhKhjq+g+NucUggUYYJqSI26yygXvdxpLv\n\tdiYXZ1D/72TWPWPD/IkR7a9HV2z++Vc43D0nL+GqAkhdFcK22cCTlnM5HWQstbVpyDk3Z8ebPXm\n\tgnqksZ6dCiK44/4AxIlsjGPdFNpqT5/4kT0wSNE54KHeUD8WhzCNxiqjbw==","X-Received":["by 2002:a17:907:7f8d:b0:aac:622:8f6 with SMTP id\n\ta640c23a62f3a-ab6cfcdf570mr2648168166b.17.1738680865640; \n\tTue, 04 Feb 2025 06:54:25 -0800 (PST)","by 2002:a17:907:7f8d:b0:aac:622:8f6 with SMTP id\n\ta640c23a62f3a-ab6cfcdf570mr2648164866b.17.1738680865217; \n\tTue, 04 Feb 2025 06:54:25 -0800 (PST)"],"X-Google-Smtp-Source":"AGHT+IFRVUxN8aK+86bgQKf0RxSvo+9i0P65mJC+Rfnhb1riCQadfUnvNZs2MiALl2KjL1uZe0jeaA==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,  Robert Mader\n\t<robert.mader@collabora.com>,  Hans de Goede <hdegoede@redhat.com>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>","Subject":"Re: [PATCH v5 02/10] libcamera: software_isp: Use RGB type to\n\trepresent gains","In-Reply-To":"<20250203004050.GK12673@pendragon.ideasonboard.com> (Laurent\n\tPinchart's message of \"Mon, 3 Feb 2025 02:40:50 +0200\")","References":"<20250130181449.130492-1-mzamazal@redhat.com>\n\t<20250130181449.130492-3-mzamazal@redhat.com>\n\t<20250203004050.GK12673@pendragon.ideasonboard.com>","Date":"Tue, 04 Feb 2025 15:54:23 +0100","Message-ID":"<85wme569r4.fsf@mzamazal-thinkpadp1gen3.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"6PZbTiAfZjH6qEvuYr6RkhJJE5HBgwLb6dTHg5RuhX4_1738680866","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>"}}]