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");