[{"id":28830,"web_url":"https://patchwork.libcamera.org/comment/28830/","msgid":"<87sf15aorc.fsf@redhat.com>","date":"2024-03-04T17:30:15","subject":"Re: [PATCH v4 13/18] libcamera: swstats_cpu: Add support for 8, 10\n\tand 12 bpp unpacked bayer input","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hans de Goede <hdegoede@redhat.com> writes:\n\n> Add support for 8, 10 and 12 bpp unpacked bayer input for all 4 standard\n> bayer orders.\n>\n> Tested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> # sc8280xp Lenovo x13s\n> Tested-by: Pavel Machek <pavel@ucw.cz>\n> Reviewed-by: Pavel Machek <pavel@ucw.cz>\n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> Signed-off-by: Hans de Goede <hdegoede@redhat.com>\n\nReviewed-by: Milan Zamazal <mzamazal@redhat.com>\n\n> ---\n>  src/libcamera/software_isp/swstats_cpu.cpp | 128 +++++++++++++++++++++\n>  src/libcamera/software_isp/swstats_cpu.h   |   9 ++\n>  2 files changed, 137 insertions(+)\n>\n> diff --git a/src/libcamera/software_isp/swstats_cpu.cpp b/src/libcamera/software_isp/swstats_cpu.cpp\n> index 448d0e4c..be310f56 100644\n> --- a/src/libcamera/software_isp/swstats_cpu.cpp\n> +++ b/src/libcamera/software_isp/swstats_cpu.cpp\n> @@ -71,6 +71,83 @@ static const unsigned int kBlueYMul = 29; /* 0.114 * 256 */\n>  \tstats_.sumG_ += sumG;       \\\n>  \tstats_.sumB_ += sumB;\n>  \n> +void SwStatsCpu::statsBGGR8Line0(const uint8_t *src[])\n> +{\n> +\tconst uint8_t *src0 = src[1] + window_.x;\n> +\tconst uint8_t *src1 = src[2] + window_.x;\n> +\n> +\tSWSTATS_START_LINE_STATS(uint8_t)\n> +\n> +\tif (swapLines_)\n> +\t\tstd::swap(src0, src1);\n> +\n> +\t/* x += 4 sample every other 2x2 block */\n> +\tfor (int x = 0; x < (int)window_.width; x += 4) {\n> +\t\tb = src0[x];\n> +\t\tg = src0[x + 1];\n> +\t\tg2 = src1[x];\n> +\t\tr = src1[x + 1];\n> +\n> +\t\tg = (g + g2) / 2;\n> +\n> +\t\tSWSTATS_ACCUMULATE_LINE_STATS(1)\n> +\t}\n> +\n> +\tSWSTATS_FINISH_LINE_STATS()\n> +}\n> +\n> +void SwStatsCpu::statsBGGR10Line0(const uint8_t *src[])\n> +{\n> +\tconst uint16_t *src0 = (const uint16_t *)src[1] + window_.x;\n> +\tconst uint16_t *src1 = (const uint16_t *)src[2] + window_.x;\n> +\n> +\tSWSTATS_START_LINE_STATS(uint16_t)\n> +\n> +\tif (swapLines_)\n> +\t\tstd::swap(src0, src1);\n> +\n> +\t/* x += 4 sample every other 2x2 block */\n> +\tfor (int x = 0; x < (int)window_.width; x += 4) {\n> +\t\tb = src0[x];\n> +\t\tg = src0[x + 1];\n> +\t\tg2 = src1[x];\n> +\t\tr = src1[x + 1];\n> +\n> +\t\tg = (g + g2) / 2;\n> +\n> +\t\t/* divide Y by 4 for 10 -> 8 bpp value */\n> +\t\tSWSTATS_ACCUMULATE_LINE_STATS(4)\n> +\t}\n> +\n> +\tSWSTATS_FINISH_LINE_STATS()\n> +}\n> +\n> +void SwStatsCpu::statsBGGR12Line0(const uint8_t *src[])\n> +{\n> +\tconst uint16_t *src0 = (const uint16_t *)src[1] + window_.x;\n> +\tconst uint16_t *src1 = (const uint16_t *)src[2] + window_.x;\n> +\n> +\tSWSTATS_START_LINE_STATS(uint16_t)\n> +\n> +\tif (swapLines_)\n> +\t\tstd::swap(src0, src1);\n> +\n> +\t/* x += 4 sample every other 2x2 block */\n> +\tfor (int x = 0; x < (int)window_.width; x += 4) {\n> +\t\tb = src0[x];\n> +\t\tg = src0[x + 1];\n> +\t\tg2 = src1[x];\n> +\t\tr = src1[x + 1];\n> +\n> +\t\tg = (g + g2) / 2;\n> +\n> +\t\t/* divide Y by 16 for 12 -> 8 bpp value */\n> +\t\tSWSTATS_ACCUMULATE_LINE_STATS(16)\n> +\t}\n> +\n> +\tSWSTATS_FINISH_LINE_STATS()\n> +}\n> +\n>  void SwStatsCpu::statsBGGR10PLine0(const uint8_t *src[])\n>  {\n>  \tconst uint8_t *src0 = src[1] + window_.x * 5 / 4;\n> @@ -147,6 +224,42 @@ void SwStatsCpu::finishFrame(void)\n>  \tstatsReady.emit(0);\n>  }\n>  \n> +/**\n> + * \\brief Setup SwStatsCpu object for standard Bayer orders\n> + * \\param[in] order The Bayer order\n> + *\n> + * Check if order is a standard Bayer order and setup xShift_ and swapLines_\n> + * so that a single BGGR stats function can be used for all 4 standard orders.\n> + */\n> +int SwStatsCpu::setupStandardBayerOrder(BayerFormat::Order order)\n> +{\n> +\tswitch (order) {\n> +\tcase BayerFormat::BGGR:\n> +\t\txShift_ = 0;\n> +\t\tswapLines_ = false;\n> +\t\tbreak;\n> +\tcase BayerFormat::GBRG:\n> +\t\txShift_ = 1; /* BGGR -> GBRG */\n> +\t\tswapLines_ = false;\n> +\t\tbreak;\n> +\tcase BayerFormat::GRBG:\n> +\t\txShift_ = 0;\n> +\t\tswapLines_ = true; /* BGGR -> GRBG */\n> +\t\tbreak;\n> +\tcase BayerFormat::RGGB:\n> +\t\txShift_ = 1; /* BGGR -> GBRG */\n> +\t\tswapLines_ = true; /* GBRG -> RGGB */\n> +\t\tbreak;\n> +\tdefault:\n> +\t\treturn -EINVAL;\n> +\t}\n> +\n> +\tpatternSize_.height = 2;\n> +\tpatternSize_.width = 2;\n> +\tySkipMask_ = 0x02; /* Skip every 3th and 4th line */\n> +\treturn 0;\n> +}\n> +\n>  /**\n>   * \\brief Configure the statistics object for the passed in input format.\n>   * \\param[in] inputCfg The input format\n> @@ -158,6 +271,21 @@ int SwStatsCpu::configure(const StreamConfiguration &inputCfg)\n>  \tBayerFormat bayerFormat =\n>  \t\tBayerFormat::fromPixelFormat(inputCfg.pixelFormat);\n>  \n> +\tif (bayerFormat.packing == BayerFormat::Packing::None &&\n> +\t    setupStandardBayerOrder(bayerFormat.order) == 0) {\n> +\t\tswitch (bayerFormat.bitDepth) {\n> +\t\tcase 8:\n> +\t\t\tstats0_ = &SwStatsCpu::statsBGGR8Line0;\n> +\t\t\treturn 0;\n> +\t\tcase 10:\n> +\t\t\tstats0_ = &SwStatsCpu::statsBGGR10Line0;\n> +\t\t\treturn 0;\n> +\t\tcase 12:\n> +\t\t\tstats0_ = &SwStatsCpu::statsBGGR12Line0;\n> +\t\t\treturn 0;\n> +\t\t}\n> +\t}\n> +\n>  \tif (bayerFormat.bitDepth == 10 &&\n>  \t    bayerFormat.packing == BayerFormat::Packing::CSI2) {\n>  \t\tpatternSize_.height = 2;\n> diff --git a/src/libcamera/software_isp/swstats_cpu.h b/src/libcamera/software_isp/swstats_cpu.h\n> index df13263b..d956c15a 100644\n> --- a/src/libcamera/software_isp/swstats_cpu.h\n> +++ b/src/libcamera/software_isp/swstats_cpu.h\n> @@ -17,6 +17,7 @@\n>  \n>  #include <libcamera/geometry.h>\n>  \n> +#include \"libcamera/internal/bayer_format.h\"\n>  #include \"libcamera/internal/shared_mem_object.h\"\n>  #include \"libcamera/internal/software_isp/swisp_stats.h\"\n>  \n> @@ -120,6 +121,14 @@ private:\n>  \t */\n>  \tusing statsProcessFn = void (SwStatsCpu::*)(const uint8_t *src[]);\n>  \n> +\tint setupStandardBayerOrder(BayerFormat::Order order);\n> +\t/* Bayer 8 bpp unpacked */\n> +\tvoid statsBGGR8Line0(const uint8_t *src[]);\n> +\t/* Bayer 10 bpp unpacked */\n> +\tvoid statsBGGR10Line0(const uint8_t *src[]);\n> +\t/* Bayer 12 bpp unpacked */\n> +\tvoid statsBGGR12Line0(const uint8_t *src[]);\n> +\t/* Bayer 10 bpp packed */\n>  \tvoid statsBGGR10PLine0(const uint8_t *src[]);\n>  \tvoid statsGBRG10PLine0(const uint8_t *src[]);","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 CA920C326B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  4 Mar 2024 17:30:22 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 314A96286F;\n\tMon,  4 Mar 2024 18:30:22 +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 16462627FC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  4 Mar 2024 18:30:20 +0100 (CET)","from mail-lj1-f197.google.com (mail-lj1-f197.google.com\n\t[209.85.208.197]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-636-55vKMuHRMQWXjZxSypjVwA-1; Mon, 04 Mar 2024 12:30:18 -0500","by mail-lj1-f197.google.com with SMTP id\n\t38308e7fff4ca-2d298d601adso34717441fa.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 04 Mar 2024 09:30:18 -0800 (PST)","from nuthatch (nat-pool-brq-t.redhat.com. [213.175.37.10])\n\tby smtp.gmail.com with ESMTPSA id\n\tbe15-20020a05600c1e8f00b00412eac005f0sm21783wmb.39.2024.03.04.09.30.15\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 04 Mar 2024 09:30:16 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"OfTygl8F\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1709573420;\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=WtfKTKGeo7S33l9PuOWew8dy0cQu+IJw94psZ/iAOVM=;\n\tb=OfTygl8F1annfGrM4vjx1i+B1/PVIK75bX5bjt0FME55nqs0T6a6ScY6XG/eX1UN9VrnIp\n\tqDwTDa+GeK4w5UIgyBMnfdfyJApGvYy6oiSb26jo2zzqKJJGDcJ/zfXK8hv8gd9Ky6npo1\n\t4UckKa70G18Xq1bXTaI8nNE+p3qY+3U=","X-MC-Unique":"55vKMuHRMQWXjZxSypjVwA-1","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1709573417; x=1710178217;\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=WtfKTKGeo7S33l9PuOWew8dy0cQu+IJw94psZ/iAOVM=;\n\tb=UxOp3d3854ethczBIrsu1frosTxGtjwHcXLS6pGbLgXZ1GNkTwyboJAxyWB2/+dlxU\n\tS0wblbO+B1lGnFpRjj6SSWTfy199CHezzoEFwIfkIKNrTUwHa7EpUb31rl5k9NMLOTio\n\tJPx7HeYRSDMlhG250MV+56yJ3aMHXku1H7nzcLo5GCImG5rHGgv81I5Xk6H4pw4+DWhw\n\t/TO1JzrkUZKKNMYMkslXoN+c+fnhcmZu4wIeGCrFJPghhVxYcb04AQMhDVC6Ojyv6BsH\n\tPPYUwX29TsGXfjVfErXSHYoR2v5FWe4SbTq+Jr6n+c3F8Z8V73AmCSfJLYRG7O8cf0RF\n\t1Bug==","X-Gm-Message-State":"AOJu0YwW4ej4YmHm5SWU0AI9dvyqku32dzVgtbLKEOF0KPKidLalE7+5\n\t4lY7k962VfiNyKOk2MNtAeW0VYOswUHY7tAAeIWCSfo6FcyTtciR3FiKnx3qUAeJO213FRFatmD\n\t0uIrS43txMV6iNCJd0FNPUfWtA8N3kUD8NYyyc7Y4G8jInjRUlyKHnNunlxY4GQkVcEh/GD4=","X-Received":["by 2002:a05:651c:10d4:b0:2d2:d0ba:2586 with SMTP id\n\tl20-20020a05651c10d400b002d2d0ba2586mr6466465ljn.24.1709573417114; \n\tMon, 04 Mar 2024 09:30:17 -0800 (PST)","by 2002:a05:651c:10d4:b0:2d2:d0ba:2586 with SMTP id\n\tl20-20020a05651c10d400b002d2d0ba2586mr6466433ljn.24.1709573416713; \n\tMon, 04 Mar 2024 09:30:16 -0800 (PST)"],"X-Google-Smtp-Source":"AGHT+IEA+rvacd0GljfVZ5NiCzkfWmTHNEPRJWnvRCUxDLBv4vniGMfFHxTJbKBDM3RBSftinEhJMQ==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Hans de Goede <hdegoede@redhat.com>","Subject":"Re: [PATCH v4 13/18] libcamera: swstats_cpu: Add support for 8, 10\n\tand 12 bpp unpacked bayer input","In-Reply-To":"<20240229183654.7206-14-hdegoede@redhat.com> (Hans de Goede's\n\tmessage of \"Thu, 29 Feb 2024 19:36:24 +0100\")","References":"<20240229183654.7206-1-hdegoede@redhat.com>\n\t<20240229183654.7206-14-hdegoede@redhat.com>","Date":"Mon, 04 Mar 2024 18:30:15 +0100","Message-ID":"<87sf15aorc.fsf@redhat.com>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","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>","Cc":"Maxime Ripard <mripard@redhat.com>, libcamera-devel@lists.libcamera.org, \n\tPavel Machek <pavel@ucw.cz>,\n\tBryan O'Donoghue <bryan.odonoghue@linaro.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]