{"id":16307,"url":"https://patchwork.libcamera.org/api/patches/16307/?format=json","web_url":"https://patchwork.libcamera.org/patch/16307/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20220622102047.22492-2-naush@raspberrypi.com>","date":"2022-06-22T10:20:45","name":"[libcamera-devel,v3,1/3] pipeline: ipa: raspberrypi: Move ControlInfoMap to the IPA","commit_ref":"53ada24e63f471e6a4931f769e5c88ea13a432f7","pull_url":null,"state":"accepted","archived":false,"hash":"d8285538d28652f646d6a9f789462a58f63d4072","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/?format=json","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/16307/mbox/","series":[{"id":3202,"url":"https://patchwork.libcamera.org/api/series/3202/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=3202","date":"2022-06-22T10:20:44","name":"Correct ControlInfoMap from the IPA","version":3,"mbox":"https://patchwork.libcamera.org/series/3202/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/16307/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/16307/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 33663BD808\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 22 Jun 2022 10:21:02 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 700E16563A;\n\tWed, 22 Jun 2022 12:21:01 +0200 (CEST)","from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com\n\t[IPv6:2a00:1450:4864:20::42f])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1EC1561FB2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 22 Jun 2022 12:20:58 +0200 (CEST)","by mail-wr1-x42f.google.com with SMTP id g27so16061038wrb.10\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 22 Jun 2022 03:20:58 -0700 (PDT)","from naush-laptop.localdomain ([88.97.76.4])\n\tby smtp.gmail.com with ESMTPSA id\n\th204-20020a1c21d5000000b0039c693a54ecsm26849423wmh.23.2022.06.22.03.20.56\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tWed, 22 Jun 2022 03:20:56 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1655893261;\n\tbh=k3T80DdORNI2PylIheqo2ZV0WyCsLU4hQlEpLXcguDU=;\n\th=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=akeQG0AFFz0W8bcf7Ph+hJQ18+QPhqdvpxx6GvF2Vmqw02bGIQIEKxjRkZTXIgyD1\n\tTC3Qi98xVQDHUIZbyWdHrEm+i0ZWy3zns4h5Qzq98g8W24a8ifYCiLWg63FpnaGjpM\n\t5WRB6q0zCrxv5H9cw1T6icfi5prxic934aAX1/a+i4+Gw8FTXnep8MpSUGO+Qhy4sM\n\t3ieBIBIU1wf0ptoO6NELOt5NW3r24mAaOWbKr7a1J8i3qlQNVOcaX383Y0+pkQ7750\n\tGfHGu/B3Ldkn3VchV8E4hh1GwLkLTg1DQ9Zxm21KVHIjstRrhC0MA76Ij5ks/lu0Ru\n\t9WK2M1yYfAxCQ==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references\n\t:mime-version:content-transfer-encoding;\n\tbh=HlMG9zb1PmYaoA6v2JC3+vcDPjbEt84nv5H1Rmzpq4A=;\n\tb=F06UQsClKXiCKv14uXQf7UFhotTfhuU/DeUAvcSmA9f6V0iyJL2nGtyFVkJ/vHWJms\n\t5QgncYd5xE9nIjrW/VRJH9F50MrSaGsNgsrCBB4yMsvCLl7Awff0cqCMertp0AmE+eeT\n\t7FNiOVxBzUAWcxgHzOBveAzut/CiJQwrwF0nFKBXlnsKPpNF4mWxqp0IKiYRRnDVfBrD\n\tYDB2kxJ31aZ0iCGe6XvMIDL1lIWWBwfrscI4EIsb9sf/Kjq4Ht9/rULK6C4ERJJTdLXA\n\t2zjFaw+0GRaNARamRYOls1nZCcBjx2LciM86105a8pz4gOcurj7EnAbTnHS8GjyJ6qRN\n\tomaw=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"F06UQsCl\"; dkim-atps=neutral","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=HlMG9zb1PmYaoA6v2JC3+vcDPjbEt84nv5H1Rmzpq4A=;\n\tb=NCR3enqBzaoBMu+/duFjD5IlW55hkKog1kZ03tY+iU74eR1AbfvzEr93sfpThvgcRe\n\trna2bhxfxBb/FA7md0e8TtTh6SsnbdXoJ7GozHKiFTSDnuNHiPdIQ+cf9QZzxWOJQqZ5\n\tnEtsvI/tW2jLBWcdzRTO02jW80K7ZMLMuTSQtTtDsUzlSJzkpx0I20ySz+MRLPUR4mTa\n\tEuUQBlrdySJM5uCdm5aBajEHXlZQ2tOJ/f9hFVAertsIN54mCunTUoBKcLhCtzoAt3pf\n\tylqHzao8/5h+AnRRTrSfGTnsogmrkGF6CJ1ae75fd5SaSq08nSxghBSV39H5bWVplVHP\n\tZ+fA==","X-Gm-Message-State":"AJIora/Ef71kHoTnv9djUFuA/33dtPbldsW09scyWqUFbU4rUQAjqolU\n\tRFx5XNuI3wWz1oab7bLHNzhg7WaBjDXl8Y36","X-Google-Smtp-Source":"AGRyM1t9zV3nij/ox7UsMJgBw8bi7FfTzEGTwpXS4tk0Mfm47U2SE5XUs4SuzExZQYVIAx7k5QaH5g==","X-Received":"by 2002:adf:fa8f:0:b0:21b:9811:43e7 with SMTP id\n\th15-20020adffa8f000000b0021b981143e7mr2587819wrr.275.1655893257387; \n\tWed, 22 Jun 2022 03:20:57 -0700 (PDT)","To":"libcamera-devel@lists.libcamera.org","Date":"Wed, 22 Jun 2022 11:20:45 +0100","Message-Id":"<20220622102047.22492-2-naush@raspberrypi.com>","X-Mailer":"git-send-email 2.25.1","In-Reply-To":"<20220622102047.22492-1-naush@raspberrypi.com>","References":"<20220622102047.22492-1-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Subject":"[libcamera-devel] [PATCH v3 1/3] pipeline: ipa: raspberrypi: Move\n\tControlInfoMap to the IPA","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>","From":"Naushir Patuck via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Naushir Patuck <naush@raspberrypi.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"Currently the pipeline handler advertises controls handled by the IPA from a\nstatic ControlInfoMap defined in the raspberrypi.h header. This change removes\nthis header file, and instead the IPA returns the ControlInfoMap to the pipeline\nhandler from the ipa::init() function. This is done to allow the IPA to adjust\nthe limits of the controls based on the sensor mode in a subsequent change.\n\nBug: https://bugs.libcamera.org/show_bug.cgi?id=83\nSigned-off-by: Naushir Patuck <naush@raspberrypi.com>\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n---\n include/libcamera/ipa/raspberrypi.h           | 55 -------------------\n include/libcamera/ipa/raspberrypi.mojom       |  7 ++-\n src/ipa/raspberrypi/raspberrypi.cpp           | 39 ++++++++++---\n .../pipeline/raspberrypi/raspberrypi.cpp      | 30 +++++-----\n .../pipeline/raspberrypi/rpi_stream.h         |  1 -\n 5 files changed, 53 insertions(+), 79 deletions(-)\n delete mode 100644 include/libcamera/ipa/raspberrypi.h","diff":"diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h\ndeleted file mode 100644\nindex 6a56b0083b85..000000000000\n--- a/include/libcamera/ipa/raspberrypi.h\n+++ /dev/null\n@@ -1,55 +0,0 @@\n-/* SPDX-License-Identifier: LGPL-2.1-or-later */\n-/*\n- * Copyright (C) 2019-2020, Raspberry Pi Ltd.\n- *\n- * raspberrypi.h - Image Processing Algorithm interface for Raspberry Pi\n- */\n-\n-#pragma once\n-\n-#include <stdint.h>\n-\n-#include <libcamera/control_ids.h>\n-#include <libcamera/controls.h>\n-\n-#ifndef __DOXYGEN__\n-\n-namespace libcamera {\n-\n-namespace RPi {\n-\n-/*\n- * List of controls handled by the Raspberry Pi IPA\n- *\n- * \\todo This list will need to be built dynamically from the control\n- * algorithms loaded by the json file, once this is supported. At that\n- * point applications should check first whether a control is supported,\n- * and the pipeline handler may be reverted so that it aborts when an\n- * unsupported control is encountered.\n- */\n-static const ControlInfoMap Controls({\n-\t\t{ &controls::AeEnable, ControlInfo(false, true) },\n-\t\t{ &controls::ExposureTime, ControlInfo(0, 999999) },\n-\t\t{ &controls::AnalogueGain, ControlInfo(1.0f, 32.0f) },\n-\t\t{ &controls::AeMeteringMode, ControlInfo(controls::AeMeteringModeValues) },\n-\t\t{ &controls::AeConstraintMode, ControlInfo(controls::AeConstraintModeValues) },\n-\t\t{ &controls::AeExposureMode, ControlInfo(controls::AeExposureModeValues) },\n-\t\t{ &controls::ExposureValue, ControlInfo(-8.0f, 8.0f, 0.0f) },\n-\t\t{ &controls::AwbEnable, ControlInfo(false, true) },\n-\t\t{ &controls::ColourGains, ControlInfo(0.0f, 32.0f) },\n-\t\t{ &controls::AwbMode, ControlInfo(controls::AwbModeValues) },\n-\t\t{ &controls::Brightness, ControlInfo(-1.0f, 1.0f, 0.0f) },\n-\t\t{ &controls::Contrast, ControlInfo(0.0f, 32.0f, 1.0f) },\n-\t\t{ &controls::Saturation, ControlInfo(0.0f, 32.0f, 1.0f) },\n-\t\t{ &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) },\n-\t\t{ &controls::ColourCorrectionMatrix, ControlInfo(-16.0f, 16.0f) },\n-\t\t{ &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },\n-\t\t{ &controls::FrameDurationLimits, ControlInfo(INT64_C(1000), INT64_C(1000000000)) },\n-\t\t{ &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) }\n-\t}, controls::controls);\n-\n-} /* namespace RPi */\n-\n-} /* namespace libcamera */\n-\n-#endif /* __DOXYGEN__ */\ndiff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom\nindex a60c3bb43d3c..77f52c282b0f 100644\n--- a/include/libcamera/ipa/raspberrypi.mojom\n+++ b/include/libcamera/ipa/raspberrypi.mojom\n@@ -26,6 +26,11 @@ struct SensorConfig {\n \tuint32 sensorMetadata;\n };\n \n+struct IPAInitResult {\n+\tSensorConfig sensorConfig;\n+\tlibcamera.ControlInfoMap controlInfo;\n+};\n+\n struct ISPConfig {\n \tuint32 embeddedBufferId;\n \tuint32 bayerBufferId;\n@@ -50,7 +55,7 @@ struct StartConfig {\n \n interface IPARPiInterface {\n \tinit(libcamera.IPASettings settings)\n-\t\t=> (int32 ret, SensorConfig sensorConfig);\n+\t\t=> (int32 ret, IPAInitResult result);\n \tstart(libcamera.ControlList controls) => (StartConfig startConfig);\n \tstop();\n \ndiff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp\nindex 3b126bb5175e..089528f5e126 100644\n--- a/src/ipa/raspberrypi/raspberrypi.cpp\n+++ b/src/ipa/raspberrypi/raspberrypi.cpp\n@@ -24,7 +24,6 @@\n #include <libcamera/framebuffer.h>\n #include <libcamera/ipa/ipa_interface.h>\n #include <libcamera/ipa/ipa_module_info.h>\n-#include <libcamera/ipa/raspberrypi.h>\n #include <libcamera/ipa/raspberrypi_ipa_interface.h>\n #include <libcamera/request.h>\n \n@@ -72,6 +71,28 @@ constexpr Duration defaultMaxFrameDuration = 250.0s;\n  */\n constexpr Duration controllerMinFrameDuration = 1.0s / 30.0;\n \n+/* List of controls handled by the Raspberry Pi IPA */\n+static const ControlInfoMap::Map ipaControls{\n+\t{ &controls::AeEnable, ControlInfo(false, true) },\n+\t{ &controls::ExposureTime, ControlInfo(0, 999999) },\n+\t{ &controls::AnalogueGain, ControlInfo(1.0f, 32.0f) },\n+\t{ &controls::AeMeteringMode, ControlInfo(controls::AeMeteringModeValues) },\n+\t{ &controls::AeConstraintMode, ControlInfo(controls::AeConstraintModeValues) },\n+\t{ &controls::AeExposureMode, ControlInfo(controls::AeExposureModeValues) },\n+\t{ &controls::ExposureValue, ControlInfo(-8.0f, 8.0f, 0.0f) },\n+\t{ &controls::AwbEnable, ControlInfo(false, true) },\n+\t{ &controls::ColourGains, ControlInfo(0.0f, 32.0f) },\n+\t{ &controls::AwbMode, ControlInfo(controls::AwbModeValues) },\n+\t{ &controls::Brightness, ControlInfo(-1.0f, 1.0f, 0.0f) },\n+\t{ &controls::Contrast, ControlInfo(0.0f, 32.0f, 1.0f) },\n+\t{ &controls::Saturation, ControlInfo(0.0f, 32.0f, 1.0f) },\n+\t{ &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) },\n+\t{ &controls::ColourCorrectionMatrix, ControlInfo(-16.0f, 16.0f) },\n+\t{ &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },\n+\t{ &controls::FrameDurationLimits, ControlInfo(INT64_C(1000), INT64_C(1000000000)) },\n+\t{ &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) }\n+};\n+\n LOG_DEFINE_CATEGORY(IPARPI)\n \n namespace ipa::RPi {\n@@ -91,7 +112,7 @@ public:\n \t\t\tmunmap(lsTable_, MaxLsGridSize);\n \t}\n \n-\tint init(const IPASettings &settings, SensorConfig *sensorConfig) override;\n+\tint init(const IPASettings &settings, IPAInitResult *result) override;\n \tvoid start(const ControlList &controls, StartConfig *startConfig) override;\n \tvoid stop() override {}\n \n@@ -180,7 +201,7 @@ private:\n \tuint32_t maxSensorGainCode_;\n };\n \n-int IPARPi::init(const IPASettings &settings, SensorConfig *sensorConfig)\n+int IPARPi::init(const IPASettings &settings, IPAInitResult *result)\n {\n \t/*\n \t * Load the \"helper\" for this sensor. This tells us all the device specific stuff\n@@ -202,15 +223,19 @@ int IPARPi::init(const IPASettings &settings, SensorConfig *sensorConfig)\n \thelper_->GetDelays(exposureDelay, gainDelay, vblankDelay);\n \tsensorMetadata = helper_->SensorEmbeddedDataPresent();\n \n-\tsensorConfig->gainDelay = gainDelay;\n-\tsensorConfig->exposureDelay = exposureDelay;\n-\tsensorConfig->vblankDelay = vblankDelay;\n-\tsensorConfig->sensorMetadata = sensorMetadata;\n+\tresult->sensorConfig.gainDelay = gainDelay;\n+\tresult->sensorConfig.exposureDelay = exposureDelay;\n+\tresult->sensorConfig.vblankDelay = vblankDelay;\n+\tresult->sensorConfig.sensorMetadata = sensorMetadata;\n \n \t/* Load the tuning file for this sensor. */\n \tcontroller_.Read(settings.configurationFile.c_str());\n \tcontroller_.Initialise();\n \n+\t/* Return the controls handled by the IPA */\n+\tControlInfoMap::Map ctrlMap = ipaControls;\n+\tresult->controlInfo = ControlInfoMap(std::move(ctrlMap), controls::controls);\n+\n \treturn 0;\n }\n \ndiff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\nindex adc397e8aabd..d980c1a71dd8 100644\n--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n@@ -20,7 +20,6 @@\n #include <libcamera/camera.h>\n #include <libcamera/control_ids.h>\n #include <libcamera/formats.h>\n-#include <libcamera/ipa/raspberrypi.h>\n #include <libcamera/ipa/raspberrypi_ipa_interface.h>\n #include <libcamera/ipa/raspberrypi_ipa_proxy.h>\n #include <libcamera/logging.h>\n@@ -199,7 +198,7 @@ public:\n \tvoid freeBuffers();\n \tvoid frameStarted(uint32_t sequence);\n \n-\tint loadIPA(ipa::RPi::SensorConfig *sensorConfig);\n+\tint loadIPA(ipa::RPi::IPAInitResult *result);\n \tint configureIPA(const CameraConfiguration *config, ipa::RPi::IPAConfigResult *result);\n \n \tvoid enumerateVideoDevices(MediaLink *link);\n@@ -1231,15 +1230,15 @@ int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp, Me\n \n \tdata->sensorFormats_ = populateSensorFormats(data->sensor_);\n \n-\tipa::RPi::SensorConfig sensorConfig;\n-\tif (data->loadIPA(&sensorConfig)) {\n+\tipa::RPi::IPAInitResult result;\n+\tif (data->loadIPA(&result)) {\n \t\tLOG(RPI, Error) << \"Failed to load a suitable IPA library\";\n \t\treturn -EINVAL;\n \t}\n \n-\tif (sensorConfig.sensorMetadata ^ !!unicamEmbedded) {\n+\tif (result.sensorConfig.sensorMetadata ^ !!unicamEmbedded) {\n \t\tLOG(RPI, Warning) << \"Mismatch between Unicam and CamHelper for embedded data usage!\";\n-\t\tsensorConfig.sensorMetadata = false;\n+\t\tresult.sensorConfig.sensorMetadata = false;\n \t\tif (unicamEmbedded)\n \t\t\tdata->unicam_[Unicam::Embedded].dev()->bufferReady.disconnect();\n \t}\n@@ -1253,7 +1252,7 @@ int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp, Me\n \t * iterate over all streams in one go.\n \t */\n \tdata->streams_.push_back(&data->unicam_[Unicam::Image]);\n-\tif (sensorConfig.sensorMetadata)\n+\tif (result.sensorConfig.sensorMetadata)\n \t\tdata->streams_.push_back(&data->unicam_[Unicam::Embedded]);\n \n \tfor (auto &stream : data->isp_)\n@@ -1275,15 +1274,16 @@ int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp, Me\n \t * gain and exposure delays. Mark VBLANK for priority write.\n \t */\n \tstd::unordered_map<uint32_t, DelayedControls::ControlParams> params = {\n-\t\t{ V4L2_CID_ANALOGUE_GAIN, { sensorConfig.gainDelay, false } },\n-\t\t{ V4L2_CID_EXPOSURE, { sensorConfig.exposureDelay, false } },\n-\t\t{ V4L2_CID_VBLANK, { sensorConfig.vblankDelay, true } }\n+\t\t{ V4L2_CID_ANALOGUE_GAIN, { result.sensorConfig.gainDelay, false } },\n+\t\t{ V4L2_CID_EXPOSURE, { result.sensorConfig.exposureDelay, false } },\n+\t\t{ V4L2_CID_VBLANK, { result.sensorConfig.vblankDelay, true } }\n \t};\n \tdata->delayedCtrls_ = std::make_unique<DelayedControls>(data->sensor_->device(), params);\n-\tdata->sensorMetadata_ = sensorConfig.sensorMetadata;\n+\tdata->sensorMetadata_ = result.sensorConfig.sensorMetadata;\n+\n+\t/* Register initial controls that the Raspberry Pi IPA can handle. */\n+\tdata->controlInfo_ = std::move(result.controlInfo);\n \n-\t/* Register the controls that the Raspberry Pi IPA can handle. */\n-\tdata->controlInfo_ = RPi::Controls;\n \t/* Initialize the camera properties. */\n \tdata->properties_ = data->sensor_->properties();\n \n@@ -1509,7 +1509,7 @@ void RPiCameraData::frameStarted(uint32_t sequence)\n \tdelayedCtrls_->applyControls(sequence);\n }\n \n-int RPiCameraData::loadIPA(ipa::RPi::SensorConfig *sensorConfig)\n+int RPiCameraData::loadIPA(ipa::RPi::IPAInitResult *result)\n {\n \tipa_ = IPAManager::createIPA<ipa::RPi::IPAProxyRPi>(pipe(), 1, 1);\n \n@@ -1535,7 +1535,7 @@ int RPiCameraData::loadIPA(ipa::RPi::SensorConfig *sensorConfig)\n \n \tIPASettings settings(configurationFile, sensor_->model());\n \n-\treturn ipa_->init(settings, sensorConfig);\n+\treturn ipa_->init(settings, result);\n }\n \n int RPiCameraData::configureIPA(const CameraConfiguration *config, ipa::RPi::IPAConfigResult *result)\ndiff --git a/src/libcamera/pipeline/raspberrypi/rpi_stream.h b/src/libcamera/pipeline/raspberrypi/rpi_stream.h\nindex c37f7e82eef6..fe01110019b7 100644\n--- a/src/libcamera/pipeline/raspberrypi/rpi_stream.h\n+++ b/src/libcamera/pipeline/raspberrypi/rpi_stream.h\n@@ -12,7 +12,6 @@\n #include <unordered_map>\n #include <vector>\n \n-#include <libcamera/ipa/raspberrypi.h>\n #include <libcamera/ipa/raspberrypi_ipa_interface.h>\n #include <libcamera/stream.h>\n \n","prefixes":["libcamera-devel","v3","1/3"]}