From patchwork Wed May 22 21:02:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 1256 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id BD82860C02 for ; Wed, 22 May 2019 23:02:39 +0200 (CEST) Received: from localhost.localdomain (unknown [96.44.9.117]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1647B52F; Wed, 22 May 2019 23:02:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1558558959; bh=vN8KJVilLEyUj3gFJrwFW6Tl+JunqsuxEp/m5qYq8/Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hZR3rSrx7ZVYJMxhxbs3COC/bNwjW0BjH19gitN0Zm5111/v3XrmOkqbIhr6b6rTm uEXzKioqXyw42fm8es/TgF8VFB3cVuPPctp0PBhbP2kRdB3HwDt1UHyXAs7A2sBy7n Opb7UURID4Oj3zGH9+VPQZRuxe8dyVDqiN6nSTsY= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Wed, 22 May 2019 17:02:16 -0400 Message-Id: <20190522210220.1631-2-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190522210220.1631-1-paul.elder@ideasonboard.com> References: <20190522210220.1631-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 1/5] libcamera: ipa_module_info: update struct to allow IPA matching X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 May 2019 21:02:40 -0000 We need a way to match pipelines with IPA modules, so add fields in IPAModuleInfo to hold the IPA API version number and the pipeline matching string. Also update IPA module tests accordingly. Signed-off-by: Paul Elder --- include/libcamera/ipa/ipa_module_info.h | 8 ++++-- test/ipa/ipa_test.cpp | 37 +++++++++++++++++-------- test/ipa/shared_test.c | 4 ++- test/ipa/shared_test.cpp | 6 ++-- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/include/libcamera/ipa/ipa_module_info.h b/include/libcamera/ipa/ipa_module_info.h index 4e0d668..f3ae97d 100644 --- a/include/libcamera/ipa/ipa_module_info.h +++ b/include/libcamera/ipa/ipa_module_info.h @@ -7,14 +7,18 @@ #ifndef __LIBCAMERA_IPA_MODULE_INFO_H__ #define __LIBCAMERA_IPA_MODULE_INFO_H__ +#include + #ifdef __cplusplus namespace libcamera { #endif struct IPAModuleInfo { + uint32_t ipaAPIVersion; + uint32_t pipelineVersion; + char pipelineName[256]; char name[256]; - unsigned int version; -}; +} __attribute__((packed)); #ifdef __cplusplus extern "C" { diff --git a/test/ipa/ipa_test.cpp b/test/ipa/ipa_test.cpp index 9861ee2..ca15fbd 100644 --- a/test/ipa/ipa_test.cpp +++ b/test/ipa/ipa_test.cpp @@ -33,6 +33,19 @@ protected: const struct IPAModuleInfo &info = ll->info(); + if (info.ipaAPIVersion != testInfo.ipaAPIVersion) { + cerr << "test IPA module has incorrect ipaAPIVersion" << endl; + cerr << "expected \"" << testInfo.ipaAPIVersion << "\", got \"" + << info.ipaAPIVersion << "\"" << endl; + ret = -1; + } + if (info.pipelineVersion != testInfo.pipelineVersion) { + cerr << "test IPA module has incorrect pipelineVersion" << endl; + cerr << "expected \"" << testInfo.pipelineVersion << "\", got \"" + << info.pipelineVersion << "\"" << endl; + ret = -1; + } + if (strcmp(info.name, testInfo.name)) { cerr << "test IPA module has incorrect name" << endl; cerr << "expected \"" << testInfo.name << "\", got \"" @@ -40,13 +53,6 @@ protected: ret = -1; } - if (info.version != testInfo.version) { - cerr << "test IPA module has incorrect version" << endl; - cerr << "expected \"" << testInfo.version << "\", got \"" - << info.version << "\"" << endl; - ret = -1; - } - delete ll; return ret; } @@ -55,14 +61,23 @@ protected: { int count = 0; - const struct IPAModuleInfo testInfo = { - "It's over nine thousand!", + const struct IPAModuleInfo testInfo1 = { + 1, 9001, + "bloop", + "It's over nine thousand!", + }; + + const struct IPAModuleInfo testInfo2 = { + 1, + 8999, + "bleep", + "It's under nine thousand!", }; - count += runTest("test/ipa/ipa-dummy-c.so", testInfo); + count += runTest("test/ipa/ipa-dummy-c.so", testInfo1); - count += runTest("test/ipa/ipa-dummy-cpp.so", testInfo); + count += runTest("test/ipa/ipa-dummy-cpp.so", testInfo2); if (count < 0) return TestFail; diff --git a/test/ipa/shared_test.c b/test/ipa/shared_test.c index 87d182b..0046ace 100644 --- a/test/ipa/shared_test.c +++ b/test/ipa/shared_test.c @@ -1,6 +1,8 @@ #include const struct IPAModuleInfo ipaModuleInfo = { + .ipaAPIVersion = 1, + .pipelineVersion = 9001, + .pipelineName = "bloop", .name = "It's over nine thousand!", - .version = 9001, }; diff --git a/test/ipa/shared_test.cpp b/test/ipa/shared_test.cpp index 4e5c976..78405b1 100644 --- a/test/ipa/shared_test.cpp +++ b/test/ipa/shared_test.cpp @@ -4,8 +4,10 @@ namespace libcamera { extern "C" { const struct libcamera::IPAModuleInfo ipaModuleInfo = { - "It's over nine thousand!", - 9001, + 1, + 8999, + "bleep", + "It's under nine thousand!", }; }; From patchwork Wed May 22 21:02:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 1257 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8655660C1D for ; Wed, 22 May 2019 23:02:40 +0200 (CEST) Received: from localhost.localdomain (unknown [96.44.9.117]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id DC9D3443; Wed, 22 May 2019 23:02:39 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1558558960; bh=taQlwj66wEEKf2K8OTshHMR1u1IONV+5vLaFO3OWXTM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jBGY0JluxIQkkdbRIo2cHmYl8qOkO/f5yAzpgQt642RmLtcG5Gk2rVmLPLXycRR3O HMY9NEcJJGB/DLQhF5Ff3ZCSsbq1wIABzzknVAciyJ9aDKBQOGxijUoX2KR4V3dYh2 84KzBUeo6i8+jo3VzVL2IxMF+UWdWm9i+Osc+kig= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Wed, 22 May 2019 17:02:17 -0400 Message-Id: <20190522210220.1631-3-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190522210220.1631-1-paul.elder@ideasonboard.com> References: <20190522210220.1631-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 2/5] libcamera: ipa_module: add aquired attribute X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 May 2019 21:02:41 -0000 The IPAManager will be designed like an enumerator, and IPA modules cannot be used by multiple pipelines at once. Add an aquired attribute to IPAModule, and corresponding getter and setters. Signed-off-by: Paul Elder --- src/libcamera/include/ipa_module.h | 5 +++++ src/libcamera/ipa_module.cpp | 21 ++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/libcamera/include/ipa_module.h b/src/libcamera/include/ipa_module.h index a4c6dbd..dc26037 100644 --- a/src/libcamera/include/ipa_module.h +++ b/src/libcamera/include/ipa_module.h @@ -22,11 +22,16 @@ public: const struct IPAModuleInfo &info() const; + bool acquired(); + bool acquire(); + void release(); + private: struct IPAModuleInfo info_; std::string libPath_; bool valid_; + bool acquired_; int loadIPAModuleInfo(); }; diff --git a/src/libcamera/ipa_module.cpp b/src/libcamera/ipa_module.cpp index 86cbe71..fb294e6 100644 --- a/src/libcamera/ipa_module.cpp +++ b/src/libcamera/ipa_module.cpp @@ -212,7 +212,7 @@ int elfLoadSymbol(void *dst, size_t size, void *map, size_t soSize, * IPAModule instance to verify the validity of the IPAModule. */ IPAModule::IPAModule(const std::string &libPath) - : libPath_(libPath), valid_(false) + : libPath_(libPath), valid_(false), acquired_(false) { if (loadIPAModuleInfo() < 0) return; @@ -289,4 +289,23 @@ const struct IPAModuleInfo &IPAModule::info() const return info_; } +bool IPAModule::acquired() +{ + return acquired_; +} + +bool IPAModule::acquire() +{ + if (acquired_) + return false; + + acquired_ = true; + return true; +} + +void IPAModule::release() +{ + acquired_ = false; +} + } /* namespace libcamera */ From patchwork Wed May 22 21:02:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 1258 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 5AEFC60E4A for ; Wed, 22 May 2019 23:02:41 +0200 (CEST) Received: from localhost.localdomain (unknown [96.44.9.117]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A6EB1443; Wed, 22 May 2019 23:02:40 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1558558961; bh=G94e9MT1naILw08thfETTIfIasLgC0OOp4cpJL0n4EA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HwQLXZfs4MqY4E1JcjaK+AcIYVnrnRgqRu+FngvqQZcVGRzxaMl0nN6iRRd2aG+/U bwjRtTa1l+ek6bVuDigpwYLyH2Irtf0Ezv8aTb5g7RfOyhqEvAv4BAp9fWxcIFYZKv Rh8qQ8HHo2hcsRRxFIo6LdNygoPjpqfYFxUXEt/c= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Wed, 22 May 2019 17:02:18 -0400 Message-Id: <20190522210220.1631-4-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190522210220.1631-1-paul.elder@ideasonboard.com> References: <20190522210220.1631-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 3/5] libcamera: ipa_manager: implement class for managing IPA modules X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 May 2019 21:02:42 -0000 IPAManager is a class that will search in given directories for IPA modules, and will load them into a list. It also provides an interface for pipelines to aquire an IPA. Signed-off-by: Paul Elder --- src/libcamera/include/ipa_manager.h | 38 +++++++++++ src/libcamera/ipa_manager.cpp | 102 ++++++++++++++++++++++++++++ src/libcamera/meson.build | 2 + 3 files changed, 142 insertions(+) create mode 100644 src/libcamera/include/ipa_manager.h create mode 100644 src/libcamera/ipa_manager.cpp diff --git a/src/libcamera/include/ipa_manager.h b/src/libcamera/include/ipa_manager.h new file mode 100644 index 0000000..9fbd74f --- /dev/null +++ b/src/libcamera/include/ipa_manager.h @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * ipa_manager.h - Image Processing Algorithm module manager + */ +#ifndef __LIBCAMERA_IPA_MANAGER_H__ +#define __LIBCAMERA_IPA_MANAGER_H__ + +#include +#include +#include + +#include "ipa_module.h" +#include "pipeline_handler.h" + +namespace libcamera { + +class IPAManager +{ +public: + static std::unique_ptr create(); + + int addDir(const std::string &libDir); + + const IPAModule *acquireIPA(const struct IPAModuleInfo &info) const; + +private: + std::string libDir_; + + std::list modules_; + + bool match(const IPAModule *ipa, const struct IPAModuleInfo &info) const; +}; + +} /* namespace libcamera */ + +#endif /* __LIBCAMERA_IPA_MANAGER_H__ */ diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp new file mode 100644 index 0000000..430e8a5 --- /dev/null +++ b/src/libcamera/ipa_manager.cpp @@ -0,0 +1,102 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * ipa_manager.cpp - Image Processing Algorithm module manager + */ + +#include "ipa_manager.h" +#include "ipa_module.h" +#include "pipeline_handler.h" +#include "utils.h" + +#include +#include +#include + +#include "log.h" + +/** + * \file ipa_manager.h + * \brief Image Processing Algorithm module manager + */ + +namespace libcamera { + +LOG_DEFINE_CATEGORY(IPAManager) + +/** + * \class IPAManager + * \brief Manager for IPA modules + */ + +std::unique_ptr IPAManager::create() +{ + return utils::make_unique(); +} + +/** + * \brief Load IPA modules from a directory + * \param[in] libDir directory to search for IPA modules + * + * Goes through libDir and tries to create an IPAModule instance for every + * found shared object. Skips invalid IPA modules. + */ +int IPAManager::addDir(const std::string &libDir) +{ + struct dirent *ent; + DIR *dir; + + dir = opendir(libDir.c_str()); + if (!dir) { + int ret = -errno; + LOG(IPAManager, Error) << "Invalid path for IPA modules: " + << strerror(ret); + return ret; + } + + while ((ent = readdir(dir)) != nullptr) { + int offset = strlen(ent->d_name) - 3; + if (strncmp(&ent->d_name[offset], ".so", 3)) + continue; + + IPAModule *ipaModule = new IPAModule(libDir + "/" + ent->d_name); + if (ipaModule->isValid()) + modules_.push_back(ipaModule); + } + + closedir(dir); + return 0; +} + +/** + * \brief Retrieve an IPA module for a given pipeline handler + * + * \return IPAModule + */ +const IPAModule +*IPAManager::acquireIPA(const struct IPAModuleInfo &info) const +{ + IPAModule *m = nullptr; + + for (struct IPAModule *module : modules_) { + if (module->acquired()) + continue; + + if (match(module, info) && module->acquire()) { + m = module; + break; + } + } + + return m; +} + +bool IPAManager::match(const IPAModule *ipa, const struct IPAModuleInfo &info) const +{ + return ipa->info().ipaAPIVersion == info.ipaAPIVersion && + ipa->info().pipelineVersion <= info.pipelineVersion && + !strcmp(ipa->info().pipelineName, info.pipelineName); +} + +} /* namespace libcamera */ diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build index e5b48f2..ee1b658 100644 --- a/src/libcamera/meson.build +++ b/src/libcamera/meson.build @@ -10,6 +10,7 @@ libcamera_sources = files([ 'event_notifier.cpp', 'formats.cpp', 'geometry.cpp', + 'ipa_manager.cpp', 'ipa_module.cpp', 'log.cpp', 'media_device.cpp', @@ -32,6 +33,7 @@ libcamera_headers = files([ 'include/device_enumerator_udev.h', 'include/event_dispatcher_poll.h', 'include/formats.h', + 'include/ipa_manager.h', 'include/ipa_module.h', 'include/log.h', 'include/media_device.h', From patchwork Wed May 22 21:02:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 1259 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 452C360C0D for ; Wed, 22 May 2019 23:02:42 +0200 (CEST) Received: from localhost.localdomain (unknown [96.44.9.117]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 6AD85596; Wed, 22 May 2019 23:02:41 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1558558961; bh=okBm1Vv2R6907wIYqTilAnTJMPeHIBnVm4ai4Bvas3U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IkVfCqF/OOCqoCc8qtaM2x/5QYZfXxqOXboh/F3rM40B8iy2Ne/Bzi3POzaFDa6Nv qxOvNx/ofJX8av0iotrxadovZBzyFQ6N46faT/Ad+CxkQlucL6J7g02MjCbI528TK+ Sat0tK/QFbZoJiNoS/rvlNrHS0gpZaLvHV+qDDK8= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Wed, 22 May 2019 17:02:19 -0400 Message-Id: <20190522210220.1631-5-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190522210220.1631-1-paul.elder@ideasonboard.com> References: <20190522210220.1631-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 4/5] test: ipa_manager: add test for IPAManager X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 May 2019 21:02:42 -0000 Add simple test to test IPA module acquiring through IPAManager. Signed-off-by: Paul Elder --- test/ipa/ipa_manager_test.cpp | 43 +++++++++++++++++++++++++++++++++++ test/ipa/meson.build | 3 ++- 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 test/ipa/ipa_manager_test.cpp diff --git a/test/ipa/ipa_manager_test.cpp b/test/ipa/ipa_manager_test.cpp new file mode 100644 index 0000000..13be202 --- /dev/null +++ b/test/ipa/ipa_manager_test.cpp @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * load-so.cpp - loading .so tests + */ + +#include +#include + +#include "ipa_module.h" +#include "ipa_manager.h" + +#include "test.h" + +using namespace std; +using namespace libcamera; + +class IPAManagerTest : public Test +{ +protected: + int run() override + { + IPAManager *ipam = new IPAManager(); + + ipam->addDir("test/ipa"); + + struct IPAModuleInfo info; + info.ipaAPIVersion = 1; + info.pipelineVersion = 8999; + strcpy(info.pipelineName, "bleep"); + const IPAModule *ipa = ipam->acquireIPA(info); + + if (!ipa || strcmp(ipa->info().name, "It's under nine thousand!")) { + cerr << "failed to acquire IPA" << endl; + return TestFail; + } + + return TestPass; + } +}; + +TEST_REGISTER(IPAManagerTest) diff --git a/test/ipa/meson.build b/test/ipa/meson.build index 6df0671..a489ed4 100644 --- a/test/ipa/meson.build +++ b/test/ipa/meson.build @@ -9,7 +9,8 @@ foreach m : ipa_modules_sources endforeach ipa_test = [ - ['ipa_test', 'ipa_test.cpp'], + ['ipa_test', 'ipa_test.cpp'], + ['ipa_manager_test', 'ipa_manager_test.cpp'], ] foreach t : ipa_test From patchwork Wed May 22 21:02:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 1260 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id ECCDC61867 for ; Wed, 22 May 2019 23:02:42 +0200 (CEST) Received: from localhost.localdomain (unknown [96.44.9.117]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 36C3EBB0; Wed, 22 May 2019 23:02:42 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1558558962; bh=VsE7t7sIFFzaxwZ6yNKbnfIn1efX+h5TkSSBpYuXvrQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PHsfBlR8dQFWiI1ZVCU6oBBjXIT5hJU27BDajOyTWRFUpvH9riqtZ6FFl3FKTxbHe uynySzdH5GOBU+bn9Breu61Y0SeJLRqLR1AM9JQL32VKF/+VpZ2/BGFJC4b25Y15Ei iJp9HrDUjBTsX4+497xQrREfxNafjGdobXcxei0A= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Wed, 22 May 2019 17:02:20 -0400 Message-Id: <20190522210220.1631-6-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190522210220.1631-1-paul.elder@ideasonboard.com> References: <20190522210220.1631-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 5/5] libcamera: pipelines: add IPAManager X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 May 2019 21:02:43 -0000 The pipeline handlers must be able to query the IPAManager (unique pointer, similar to DeviceEnumerator) for an IPA module. Change the PipelineHandler::match() method to accept an IPAManager, and make the UVC pipeline query for one of the test IPA modules. Signed-off-by: Paul Elder --- src/libcamera/camera_manager.cpp | 8 +++++++- src/libcamera/include/pipeline_handler.h | 3 ++- src/libcamera/pipeline/ipu3/ipu3.cpp | 5 +++-- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 5 +++-- src/libcamera/pipeline/uvcvideo.cpp | 18 +++++++++++++++--- src/libcamera/pipeline/vimc.cpp | 4 ++-- 6 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp index cf881ce..b896e93 100644 --- a/src/libcamera/camera_manager.cpp +++ b/src/libcamera/camera_manager.cpp @@ -12,6 +12,7 @@ #include "device_enumerator.h" #include "event_dispatcher_poll.h" +#include "ipa_manager.h" #include "log.h" #include "pipeline_handler.h" #include "utils.h" @@ -83,6 +84,11 @@ int CameraManager::start() if (!enumerator_ || enumerator_->enumerate()) return -ENODEV; + std::unique_ptr ipaManager = IPAManager::create(); + if (!ipaManager) + return -ENODEV; + ipaManager->addDir("test/ipa"); + /* * TODO: Try to read handlers and order from configuration * file and only fallback on all handlers if there is no @@ -97,7 +103,7 @@ int CameraManager::start() */ while (1) { std::shared_ptr pipe = factory->create(this); - if (!pipe->match(enumerator_.get())) + if (!pipe->match(enumerator_.get(), ipaManager.get())) break; LOG(Camera, Debug) diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h index 9f5fe3d..bbc13da 100644 --- a/src/libcamera/include/pipeline_handler.h +++ b/src/libcamera/include/pipeline_handler.h @@ -23,6 +23,7 @@ class CameraConfiguration; class CameraManager; class DeviceEnumerator; class DeviceMatch; +class IPAManager; class MediaDevice; class PipelineHandler; class Request; @@ -53,7 +54,7 @@ public: PipelineHandler(CameraManager *manager); virtual ~PipelineHandler(); - virtual bool match(DeviceEnumerator *enumerator) = 0; + virtual bool match(DeviceEnumerator *enumerator, IPAManager *ipaManager) = 0; MediaDevice *acquireMediaDevice(DeviceEnumerator *enumerator, const DeviceMatch &dm); diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 75a70e6..51593fb 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -18,6 +18,7 @@ #include "camera_sensor.h" #include "device_enumerator.h" +#include "ipa_manager.h" #include "log.h" #include "media_device.h" #include "pipeline_handler.h" @@ -166,7 +167,7 @@ public: int queueRequest(Camera *camera, Request *request) override; - bool match(DeviceEnumerator *enumerator) override; + bool match(DeviceEnumerator *enumerator, IPAManager *ipaManager) override; private: class IPU3CameraData : public CameraData @@ -576,7 +577,7 @@ int PipelineHandlerIPU3::queueRequest(Camera *camera, Request *request) return error; } -bool PipelineHandlerIPU3::match(DeviceEnumerator *enumerator) +bool PipelineHandlerIPU3::match(DeviceEnumerator *enumerator, IPAManager *ipaManager) { int ret; diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 96553bf..2a9aec0 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -17,6 +17,7 @@ #include "camera_sensor.h" #include "device_enumerator.h" +#include "ipa_manager.h" #include "log.h" #include "media_device.h" #include "pipeline_handler.h" @@ -49,7 +50,7 @@ public: int queueRequest(Camera *camera, Request *request) override; - bool match(DeviceEnumerator *enumerator) override; + bool match(DeviceEnumerator *enumerator, IPAManager *ipaManager) override; private: class RkISP1CameraData : public CameraData @@ -337,7 +338,7 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor) return 0; } -bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator) +bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator, IPAManager *ipaManager) { const MediaPad *pad; diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp index 351712c..9c038d0 100644 --- a/src/libcamera/pipeline/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo.cpp @@ -6,16 +6,20 @@ */ #include +#include #include #include #include "device_enumerator.h" +#include "ipa_manager.h" #include "log.h" #include "media_device.h" #include "pipeline_handler.h" #include "utils.h" #include "v4l2_device.h" +#include + namespace libcamera { LOG_DEFINE_CATEGORY(UVC) @@ -41,7 +45,7 @@ public: int queueRequest(Camera *camera, Request *request) override; - bool match(DeviceEnumerator *enumerator) override; + bool match(DeviceEnumerator *enumerator, IPAManager *ipaManager) override; private: class UVCCameraData : public CameraData @@ -166,7 +170,7 @@ int PipelineHandlerUVC::queueRequest(Camera *camera, Request *request) return 0; } -bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator) +bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator, IPAManager *ipaManager) { MediaDevice *media; DeviceMatch dm("uvcvideo"); @@ -175,6 +179,14 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator) if (!media) return false; + struct IPAModuleInfo info; + info.ipaAPIVersion = 1; + info.pipelineVersion = 8999; + strcpy(info.pipelineName, "bleep"); + const IPAModule *ipa = ipaManager->acquireIPA(info); + if (ipa == nullptr) + LOG(UVC, Warning) << "no matching IPA found"; + std::unique_ptr data = utils::make_unique(this); /* Locate and open the default video node. */ @@ -197,7 +209,7 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator) /* Create and register the camera. */ std::set streams{ &data->stream_ }; - std::shared_ptr camera = Camera::create(this, media->model(), streams); + std::shared_ptr camera = Camera::create(this, media->model() + " " + (ipa == nullptr ? "" : ipa->info().name), streams); registerCamera(std::move(camera), std::move(data)); /* Enable hot-unplug notifications. */ diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp index 737d6df..20834aa 100644 --- a/src/libcamera/pipeline/vimc.cpp +++ b/src/libcamera/pipeline/vimc.cpp @@ -41,7 +41,7 @@ public: int queueRequest(Camera *camera, Request *request) override; - bool match(DeviceEnumerator *enumerator) override; + bool match(DeviceEnumerator *enumerator, IPAManager *ipaManager) override; private: class VimcCameraData : public CameraData @@ -166,7 +166,7 @@ int PipelineHandlerVimc::queueRequest(Camera *camera, Request *request) return 0; } -bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator) +bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator, IPAManager *ipaManager) { DeviceMatch dm("vimc");