Patch Detail
Show a patch.
GET /api/patches/14419/?format=api
{ "id": 14419, "url": "https://patchwork.libcamera.org/api/patches/14419/?format=api", "web_url": "https://patchwork.libcamera.org/patch/14419/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/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": "<20211029120001.2469018-2-hanlinchen@chromium.org>", "date": "2021-10-29T11:59:57", "name": "[libcamera-devel,v2,2/6] ipu3: Add a class AiqResultsRingBuffer to reserve AiqResults history", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "59d73dbf3b38019338ec06447b5cf3939458f840", "submitter": { "id": 98, "url": "https://patchwork.libcamera.org/api/people/98/?format=api", "name": "Hanlin Chen", "email": "hanlinchen@chromium.org" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/14419/mbox/", "series": [ { "id": 2681, "url": "https://patchwork.libcamera.org/api/series/2681/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2681", "date": "2021-10-29T11:59:56", "name": "[libcamera-devel,v2,1/6] ipu3: Use ia_aiq_frame_use_preview as default mode for AIQ", "version": 2, "mbox": "https://patchwork.libcamera.org/series/2681/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/14419/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/14419/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 71DDBC324E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 29 Oct 2021 12:00:11 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0DCC9600BC;\n\tFri, 29 Oct 2021 14:00:11 +0200 (CEST)", "from mail-pf1-x442.google.com (mail-pf1-x442.google.com\n\t[IPv6:2607:f8b0:4864:20::442])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CCBBB600B8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 29 Oct 2021 14:00:09 +0200 (CEST)", "by mail-pf1-x442.google.com with SMTP id m14so9010430pfc.9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 29 Oct 2021 05:00:09 -0700 (PDT)", "from localhost ([2401:fa00:1:10:35fe:d53b:684:b538])\n\tby smtp.gmail.com with UTF8SMTPSA id\n\tl14sm10590902pjq.13.2021.10.29.05.00.06\n\t(version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n\tFri, 29 Oct 2021 05:00:06 -0700 (PDT)" ], "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=chromium.org header.i=@chromium.org\n\theader.b=\"WD/YeaBq\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org;\n\ts=google; \n\th=from:to:cc:subject:date:message-id:in-reply-to:references\n\t:mime-version:content-transfer-encoding;\n\tbh=9JZPwUj7sK91HcP0MWC8uO8gM6PfU3AIrpnW7+5lbN0=;\n\tb=WD/YeaBqq8W1MN86NegkqHkgFhayZ5BcjfNZMeL9UuQASLBFBXa3SIIl79PaMfTipk\n\t1OtKr8NpZSlAQdcUOKDe7llthva/6+Hx8ElZ7r4y2zhfMzB7W4laBQDzUBTL4pi/m1jY\n\tFuZv/eNISkQR75VELBdhXjdiylCK02deATHd8=", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references:mime-version:content-transfer-encoding;\n\tbh=9JZPwUj7sK91HcP0MWC8uO8gM6PfU3AIrpnW7+5lbN0=;\n\tb=DZ1UMlFgkMgKm3EAB7zWlRD/ELtalv/Y+9wDRg8BzWZ91v8bTFzg1iWUgDjCkAc6d0\n\tOxxu9sT6f6NDESKUKO9z5D5YVqM1shtSXLqIPA+jSuCAteuCYjvc1ZymqkY4Ha/OVERr\n\tURKJm6XWLKPvDmjYl5sVRc/mDZQ+ZmMOw+RR1icz2OJrWDoL53kFROFMmIcyk4MOGKYq\n\tn3Pibmd5Ee5ZlrLvptifYUIJ5tsvITBQqwC8afKbz2Kq3JMEUWK6P/FJez2c2R7g5KzL\n\tn8VpIpDk5pqvZh3wzYsm/rD34V0kmv/vjqPcCTEOvYKMSAx0OkpUShp3WcsKirUkcpAN\n\tRGAA==", "X-Gm-Message-State": "AOAM532D5YoJPqGi9idQxKojjQTO8Mn5yMuQIewEMwO7fykFP9Oap7xK\n\t6/6lDguxHs9KYxtjApm1YhA/PRG82805S5BT", "X-Google-Smtp-Source": "ABdhPJy6Q6BUQxSlOwXjB1dfQ85vbH16ATrBS59weJ7QgnqSpSRBNNWMMUKHxy80WRXPkyiAYdaXdA==", "X-Received": "by 2002:a05:6a00:1906:b0:44c:b35d:71a8 with SMTP id\n\ty6-20020a056a00190600b0044cb35d71a8mr10586116pfi.51.1635508807145; \n\tFri, 29 Oct 2021 05:00:07 -0700 (PDT)", "From": "Han-Lin Chen <hanlinchen@chromium.org>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Fri, 29 Oct 2021 19:59:57 +0800", "Message-Id": "<20211029120001.2469018-2-hanlinchen@chromium.org>", "X-Mailer": "git-send-email 2.33.1.1089.g2158813163f-goog", "In-Reply-To": "<20211029120001.2469018-1-hanlinchen@chromium.org>", "References": "<20211029120001.2469018-1-hanlinchen@chromium.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v2 2/6] ipu3: Add a class\n\tAiqResultsRingBuffer to reserve AiqResults history", "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": "The AIQ algorithm expects the statstistics comes with the effective AiqResults\napplied on the sensor, which may not always be the latest AiqResults,\nsince pipeline handler may delay setting the controls based on SOF.\nAdd a class to reserve the history of the AiqResults generated for previous\nframes, so IPA can have a chance to look for the suitable one backwards.\n\nSigned-off-by: Han-Lin Chen <hanlinchen@chromium.org>\n---\n aiq/aiq_results.cpp | 85 ++++++++++++++++++++++++++++++++++++++++-----\n aiq/aiq_results.h | 38 +++++++++++++++-----\n 2 files changed, 107 insertions(+), 16 deletions(-)", "diff": "diff --git a/aiq/aiq_results.cpp b/aiq/aiq_results.cpp\nindex f727f36..deda4be 100644\n--- a/aiq/aiq_results.cpp\n+++ b/aiq/aiq_results.cpp\n@@ -63,7 +63,34 @@ AiqResults::AiqResults()\n \tsa_.channel_b = channelB_.data();\n }\n \n-void AiqResults::setAe(ia_aiq_ae_results *ae)\n+AiqResults::AiqResults(const AiqResults &other)\n+\t:AiqResults()\n+{\n+\tsetAe(&other.ae_);\n+\tsetAf(&other.af_);\n+\tsetAfBracket(&other.afBracket_);\n+\tsetAwb(&other.awb_);\n+\tsetGbce(&other.gbce_);\n+\tsetDetectedSceneMode(other.detectedSceneMode_);\n+\tsetPa(&other.pa_);\n+\tsetSa(&other.sa_);\n+}\n+\n+AiqResults& AiqResults::operator=(const AiqResults &other)\n+{\n+\tsetAe(&other.ae_);\n+\tsetAf(&other.af_);\n+\tsetAfBracket(&other.afBracket_);\n+\tsetAwb(&other.awb_);\n+\tsetGbce(&other.gbce_);\n+\tsetDetectedSceneMode(other.detectedSceneMode_);\n+\tsetPa(&other.pa_);\n+\tsetSa(&other.sa_);\n+\n+\treturn *this;\n+}\n+\n+void AiqResults::setAe(const ia_aiq_ae_results *ae)\n {\n \t/* Todo: Potentially Requires copying\n \t * ia_aiq_aperture_control *aperture_control;\n@@ -121,7 +148,7 @@ void AiqResults::setAe(ia_aiq_ae_results *ae)\n \t}\n }\n \n-void AiqResults::setAf(ia_aiq_af_results *af)\n+void AiqResults::setAf(const ia_aiq_af_results *af)\n {\n \tASSERT(af);\n \n@@ -133,7 +160,7 @@ void AiqResults::setAf(ia_aiq_af_results *af)\n \taf_.final_lens_position_reached = af->final_lens_position_reached;\n }\n \n-void AiqResults::setAfBracket(ia_aiq_af_bracket_results *afBracket)\n+void AiqResults::setAfBracket(const ia_aiq_af_bracket_results *afBracket)\n {\n \tASSERT(afBracket);\n \n@@ -145,7 +172,7 @@ void AiqResults::setAfBracket(ia_aiq_af_bracket_results *afBracket)\n \tafBracket_.lens_positions_bracketing = afBracket->lens_positions_bracketing;\n }\n \n-void AiqResults::setAwb(ia_aiq_awb_results *awb)\n+void AiqResults::setAwb(const ia_aiq_awb_results *awb)\n {\n \tASSERT(awb);\n \n@@ -157,7 +184,7 @@ void AiqResults::setAwb(ia_aiq_awb_results *awb)\n \tawb_.distance_from_convergence = awb->distance_from_convergence;\n }\n \n-void AiqResults::setGbce(ia_aiq_gbce_results *gbce)\n+void AiqResults::setGbce(const ia_aiq_gbce_results *gbce)\n {\n \tASSERT(gbce);\n \n@@ -181,12 +208,12 @@ void AiqResults::setGbce(ia_aiq_gbce_results *gbce)\n \t}\n }\n \n-void AiqResults::setDetectedSceneMode(ia_aiq_scene_mode dsm)\n+void AiqResults::setDetectedSceneMode(const ia_aiq_scene_mode dsm)\n {\n \tdetectedSceneMode_ = dsm;\n }\n \n-void AiqResults::setPa(ia_aiq_pa_results *pa)\n+void AiqResults::setPa(const ia_aiq_pa_results *pa)\n {\n \tASSERT(pa);\n \n@@ -234,7 +261,7 @@ void AiqResults::setPa(ia_aiq_pa_results *pa)\n \tpa_.brightness_level = pa->brightness_level;\n }\n \n-void AiqResults::setSa(ia_aiq_sa_results *sa)\n+void AiqResults::setSa(const ia_aiq_sa_results *sa)\n {\n \tASSERT(sa && sa->channel_r && sa->channel_gr &&\n \t sa->channel_gb && sa->channel_b);\n@@ -275,6 +302,48 @@ void AiqResults::setSa(ia_aiq_sa_results *sa)\n \tsa_.frame_params = sa->frame_params;\n }\n \n+AiqResults& AiqResultsRingBuffer::operator[](unsigned int index)\n+{\n+\treturn std::array<AiqResults, bufferSize>::operator[](index % bufferSize);\n+}\n+\n+const AiqResults& AiqResultsRingBuffer::operator[](unsigned int index) const\n+{\n+\treturn std::array<AiqResults, bufferSize>::operator[](index % bufferSize);\n+}\n+\n+void AiqResultsRingBuffer::Reset()\n+{\n+\tstart_ = end_ = size_ = 0;\n+}\n+\n+void AiqResultsRingBuffer::Push(const AiqResults& result)\n+{\n+\toperator[](end_) = result;\n+\tend_ = (end_ + 1) % bufferSize;\n+\tsize_ = std::min(size_ + 1, bufferSize);\n+\tif (size_ == bufferSize) {\n+\t\tstart_ = end_;\n+\t}\n+}\n+\n+AiqResults& AiqResultsRingBuffer::searchBackward(\n+\t\tconst std::function<bool(AiqResults&)> pred, AiqResults& def)\n+{\n+\tif (size_ == 0)\n+\t\treturn def;\n+\n+\tunsigned int i = (end_ - 1) % bufferSize;\n+\twhile (i != start_) {\n+\t\tif (pred(operator[](i))) {\n+\t\t\treturn operator[](i);\n+\t\t}\n+\t\ti = --i % bufferSize;\n+\t}\n+\n+\treturn def;\n+}\n+\n } /* namespace ipa::ipu3::aiq */\n \n } /* namespace libcamera */\ndiff --git a/aiq/aiq_results.h b/aiq/aiq_results.h\nindex ae19a6c..7005a47 100644\n--- a/aiq/aiq_results.h\n+++ b/aiq/aiq_results.h\n@@ -8,6 +8,8 @@\n * of the aiq result structures.\n */\n \n+#include <array>\n+#include <functional>\n #include <vector>\n \n #include <ia_imaging/ia_aiq.h>\n@@ -37,6 +39,8 @@ class AiqResults\n {\n public:\n \tAiqResults();\n+\tAiqResults(const AiqResults &other);\n+\tAiqResults &operator=(const AiqResults &other);\n \n \tconst ia_aiq_ae_results *ae() { return &ae_; }\n \tia_aiq_af_results *af() { return &af_; }\n@@ -46,14 +50,14 @@ public:\n \tconst ia_aiq_pa_results *pa() { return &pa_; }\n \tconst ia_aiq_sa_results *sa() { return &sa_; }\n \n-\tvoid setAe(ia_aiq_ae_results *ae);\n-\tvoid setAf(ia_aiq_af_results *af);\n-\tvoid setAfBracket(ia_aiq_af_bracket_results *afBracket);\n-\tvoid setAwb(ia_aiq_awb_results *awb);\n-\tvoid setGbce(ia_aiq_gbce_results *gbce);\n-\tvoid setDetectedSceneMode(ia_aiq_scene_mode dsm);\n-\tvoid setPa(ia_aiq_pa_results *pa);\n-\tvoid setSa(ia_aiq_sa_results *sa);\n+\tvoid setAe(const ia_aiq_ae_results *ae);\n+\tvoid setAf(const ia_aiq_af_results *af);\n+\tvoid setAfBracket(const ia_aiq_af_bracket_results *afBracket);\n+\tvoid setAwb(const ia_aiq_awb_results *awb);\n+\tvoid setGbce(const ia_aiq_gbce_results *gbce);\n+\tvoid setDetectedSceneMode(const ia_aiq_scene_mode dsm);\n+\tvoid setPa(const ia_aiq_pa_results *pa);\n+\tvoid setSa(const ia_aiq_sa_results *sa);\n \n private:\n \tia_aiq_ae_results ae_;\n@@ -109,6 +113,24 @@ private:\n \tstd::vector<float> channelGb_;\n };\n \n+static constexpr unsigned int bufferSize = 16;\n+class AiqResultsRingBuffer: public std::array<AiqResults, bufferSize>\n+{\n+public:\n+\tAiqResults &operator[](unsigned int index);\n+\tconst AiqResults &operator[](unsigned int index) const;\n+\tvoid Reset();\n+\tvoid Push(const AiqResults& result);\n+\tunsigned int size() { return size_; }\n+\tAiqResults& searchBackward(const std::function<bool(AiqResults&)> pred,\n+\t\t\t\t\t\t\t\t\t\t\t\t\t\t AiqResults& def);\n+\n+private:\n+\tunsigned int start_ = 0;\n+\tunsigned int end_ = 0;\n+\tunsigned int size_ = 0;\n+};\n+\n } /* namespace libcamera::ipa::ipu3::aiq */\n \n #endif /* IPA_IPU3_AIQ_RESULTS_H */\n", "prefixes": [ "libcamera-devel", "v2", "2/6" ] }