Patch Detail
Show a patch.
GET /api/1.1/patches/19928/?format=api
{ "id": 19928, "url": "https://patchwork.libcamera.org/api/1.1/patches/19928/?format=api", "web_url": "https://patchwork.libcamera.org/patch/19928/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20240423103034.364150-14-mzamazal@redhat.com>", "date": "2024-04-23T10:30:28", "name": "[v2,13/13] libcamera: software_isp: Make measurement configurable", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "be3532dbbadf260223e474ef0bf8b2812c144fd0", "submitter": { "id": 177, "url": "https://patchwork.libcamera.org/api/1.1/people/177/?format=api", "name": "Milan Zamazal", "email": "mzamazal@redhat.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/19928/mbox/", "series": [ { "id": 4267, "url": "https://patchwork.libcamera.org/api/1.1/series/4267/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=4267", "date": "2024-04-23T10:30:15", "name": "Add global configuration file", "version": 2, "mbox": "https://patchwork.libcamera.org/series/4267/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/19928/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/19928/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 CC92AC328D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 23 Apr 2024 10:31:44 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 216B463432;\n\tTue, 23 Apr 2024 12:31:44 +0200 (CEST)", "from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AA3FF6340B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 23 Apr 2024 12:31:35 +0200 (CEST)", "from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com\n\t[66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-503-JktzjzXJNfiIPpi8r8rS8A-1; Tue, 23 Apr 2024 06:31:32 -0400", "from smtp.corp.redhat.com\n\t(int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7])\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 mimecast-mx02.redhat.com (Postfix) with ESMTPS id 2A7FE811000;\n\tTue, 23 Apr 2024 10:31:32 +0000 (UTC)", "from nuthatch.redhat.com (unknown [10.45.225.63])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 20B0E1C060D0;\n\tTue, 23 Apr 2024 10:31:30 +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=\"EG9GmfUm\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1713868294;\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\tin-reply-to:in-reply-to:references:references;\n\tbh=AuYGz76flo40VEPf686NvBJ9TEmU4ZMqBZOdIV/Z8UE=;\n\tb=EG9GmfUmHSddNXIC99b/Tk4EukJCUW+9EpUfrya7O+HeIoEg6GIJRHlZ4rozMqQoSvxLOy\n\tWJ4+7H8cAqsBq9P3olWZ1C1b3+fGjYYcm4d2oR4NWxhXDbV7Pmat12cPa53ImigXPyTthB\n\tNqcEYQ2IeTSnnWfAJvFW6PdDI3kPm+Q=", "X-MC-Unique": "JktzjzXJNfiIPpi8r8rS8A-1", "From": "Milan Zamazal <mzamazal@redhat.com>", "To": "libcamera-devel@lists.libcamera.org", "Cc": "Milan Zamazal <mzamazal@redhat.com>,\n\tNaushir Patuck <naush@raspberrypi.com>", "Subject": "[PATCH v2 13/13] libcamera: software_isp: Make measurement\n\tconfigurable", "Date": "Tue, 23 Apr 2024 12:30:28 +0200", "Message-ID": "<20240423103034.364150-14-mzamazal@redhat.com>", "In-Reply-To": "<20240423103034.364150-1-mzamazal@redhat.com>", "References": "<20240423103034.364150-1-mzamazal@redhat.com>", "MIME-Version": "1.0", "X-Scanned-By": "MIMEDefang 3.4.1 on 10.11.54.7", "X-Mimecast-Spam-Score": "0", "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": "Software ISP performs performance measurement on certain part of initial\nframes. Let's make this range configurable.\n\nFor this purpose, this patch introduces new configuration options\npipelines.simple.measure.skip and pipelines.simple.measure.number.\nSetting the latter one to 0 disables the measurement.\n\nInstead of the last frame, the class member and its configuration\nspecify the number of frames to measure. This is easier to use for\nusers and doesn't require to adjust two configuration parameters when\nthe number of the initially skipped frames is changed.\n\nThe patch also changes the names of the class members to make them more\naccurate.\n\nCompletes software ISP TODO #7.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n Documentation/runtime_configuration.rst | 6 ++++++\n src/libcamera/software_isp/TODO | 25 ----------------------\n src/libcamera/software_isp/debayer_cpu.cpp | 25 ++++++++++++++--------\n src/libcamera/software_isp/debayer_cpu.h | 7 +++---\n 4 files changed, 25 insertions(+), 38 deletions(-)", "diff": "diff --git a/Documentation/runtime_configuration.rst b/Documentation/runtime_configuration.rst\nindex ed6370bb..582e388f 100644\n--- a/Documentation/runtime_configuration.rst\n+++ b/Documentation/runtime_configuration.rst\n@@ -49,6 +49,9 @@ file structure:\n tuning_file: # full path\n simple:\n copy_input_buffer: # true/false\n+ measure:\n+ skip: # non-negative integer, frames to skip initially\n+ number: # non-negative integer, frames to measure\n supported_devices:\n - driver: # driver name, e.g. `mxc-isi`\n software_isp: # true/false\n@@ -76,6 +79,9 @@ Configuration file example\n config_file: /usr/local/share/libcamera/pipeline/rpi/vc4/minimal_mem.yaml\n simple:\n copy_input_buffer: false\n+ measure:\n+ skip: 50\n+ number: 30\n supported_devices:\n - driver: mxc-isi\n software_isp: true\ndiff --git a/src/libcamera/software_isp/TODO b/src/libcamera/software_isp/TODO\nindex 15396322..ca305a63 100644\n--- a/src/libcamera/software_isp/TODO\n+++ b/src/libcamera/software_isp/TODO\n@@ -103,31 +103,6 @@ per-frame buffers like we do for hardware ISPs.\n \n ---\n \n-7. Performance measurement configuration\n-\n-> void DebayerCpu::process(FrameBuffer *input, FrameBuffer *output, DebayerParams params)\n-> /* Measure before emitting signals */\n-> if (measuredFrames_ < DebayerCpu::kLastFrameToMeasure &&\n-> ++measuredFrames_ > DebayerCpu::kFramesToSkip) {\n-> \ttimespec frameEndTime = {};\n-> \tclock_gettime(CLOCK_MONOTONIC_RAW, &frameEndTime);\n-> \tframeProcessTime_ += timeDiff(frameEndTime, frameStartTime);\n-> \tif (measuredFrames_ == DebayerCpu::kLastFrameToMeasure) {\n-> \t\tconst unsigned int measuredFrames = DebayerCpu::kLastFrameToMeasure -\n-> \t\t\t\t\t\t DebayerCpu::kFramesToSkip;\n-> \t\tLOG(Debayer, Info)\n-> \t\t\t<< \"Processed \" << measuredFrames\n-> \t\t\t<< \" frames in \" << frameProcessTime_ / 1000 << \"us, \"\n-> \t\t\t<< frameProcessTime_ / (1000 * measuredFrames)\n-> \t\t\t<< \" us/frame\";\n-> \t}\n-> }\n-\n-I wonder if there would be a way to control at runtime when/how to\n-perform those measurements. Maybe that's a bit overkill.\n-\n----\n-\n 8. DebayerCpu cleanups\n \n > >> class DebayerCpu : public Debayer, public Object\ndiff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp\nindex fa538927..59694ad6 100644\n--- a/src/libcamera/software_isp/debayer_cpu.cpp\n+++ b/src/libcamera/software_isp/debayer_cpu.cpp\n@@ -50,6 +50,13 @@ DebayerCpu::DebayerCpu(std::unique_ptr<SwStatsCpu> stats)\n \t\t\t\t \"pipelines.simple.copy_input_buffer\")\n \t\t\t\t .value_or(true);\n \n+\tskipBeforeMeasure_ = GlobalConfiguration::option<unsigned int>(\n+\t\t\t\t \"pipelines.simple.measure.skip\")\n+\t\t\t\t .value_or(skipBeforeMeasure_);\n+\tframesToMeasure_ = GlobalConfiguration::option<unsigned int>(\n+\t\t\t\t \"pipelines.simple.measure.number\")\n+\t\t\t\t .value_or(framesToMeasure_);\n+\n \t/* Initialize gamma to 1.0 curve */\n \tfor (unsigned int i = 0; i < kGammaLookupSize; i++)\n \t\tgamma_[i] = i / (kGammaLookupSize / kRGBLookupSize);\n@@ -496,7 +503,7 @@ int DebayerCpu::configure(const StreamConfiguration &inputCfg,\n \t\t\treturn -ENOMEM;\n \t}\n \n-\tmeasuredFrames_ = 0;\n+\tencounteredFrames_ = 0;\n \tframeProcessTime_ = 0;\n \n \treturn 0;\n@@ -696,7 +703,10 @@ void DebayerCpu::process(FrameBuffer *input, FrameBuffer *output, DebayerParams\n {\n \ttimespec frameStartTime;\n \n-\tif (measuredFrames_ < DebayerCpu::kLastFrameToMeasure) {\n+\tbool measure = framesToMeasure_ > 0 &&\n+\t\t encounteredFrames_ < skipBeforeMeasure_ + framesToMeasure_ &&\n+\t\t ++encounteredFrames_ > skipBeforeMeasure_;\n+\tif (measure) {\n \t\tframeStartTime = {};\n \t\tclock_gettime(CLOCK_MONOTONIC_RAW, &frameStartTime);\n \t}\n@@ -757,18 +767,15 @@ void DebayerCpu::process(FrameBuffer *input, FrameBuffer *output, DebayerParams\n \tmetadata.planes()[0].bytesused = out.planes()[0].size();\n \n \t/* Measure before emitting signals */\n-\tif (measuredFrames_ < DebayerCpu::kLastFrameToMeasure &&\n-\t ++measuredFrames_ > DebayerCpu::kFramesToSkip) {\n+\tif (measure) {\n \t\ttimespec frameEndTime = {};\n \t\tclock_gettime(CLOCK_MONOTONIC_RAW, &frameEndTime);\n \t\tframeProcessTime_ += timeDiff(frameEndTime, frameStartTime);\n-\t\tif (measuredFrames_ == DebayerCpu::kLastFrameToMeasure) {\n-\t\t\tconst unsigned int measuredFrames = DebayerCpu::kLastFrameToMeasure -\n-\t\t\t\t\t\t\t DebayerCpu::kFramesToSkip;\n+\t\tif (encounteredFrames_ == skipBeforeMeasure_ + framesToMeasure_) {\n \t\t\tLOG(Debayer, Info)\n-\t\t\t\t<< \"Processed \" << measuredFrames\n+\t\t\t\t<< \"Processed \" << framesToMeasure_\n \t\t\t\t<< \" frames in \" << frameProcessTime_ / 1000 << \"us, \"\n-\t\t\t\t<< frameProcessTime_ / (1000 * measuredFrames)\n+\t\t\t\t<< frameProcessTime_ / (1000 * framesToMeasure_)\n \t\t\t\t<< \" us/frame\";\n \t\t}\n \t}\ndiff --git a/src/libcamera/software_isp/debayer_cpu.h b/src/libcamera/software_isp/debayer_cpu.h\nindex 689c1075..1306ef6f 100644\n--- a/src/libcamera/software_isp/debayer_cpu.h\n+++ b/src/libcamera/software_isp/debayer_cpu.h\n@@ -148,11 +148,10 @@ private:\n \tbool swapRedBlueGains_;\n \tfloat gammaCorrection_;\n \tunsigned int blackLevel_;\n-\tunsigned int measuredFrames_;\n+\tunsigned int encounteredFrames_;\n \tint64_t frameProcessTime_;\n-\t/* Skip 30 frames for things to stabilize then measure 30 frames */\n-\tstatic constexpr unsigned int kFramesToSkip = 30;\n-\tstatic constexpr unsigned int kLastFrameToMeasure = 60;\n+\tunsigned int skipBeforeMeasure_ = 30;\n+\tunsigned int framesToMeasure_ = 30;\n };\n \n } /* namespace libcamera */\n", "prefixes": [ "v2", "13/13" ] }