[libcamera-devel] [RFC PATCH 5/5] libcamera: pipelines: add IPAManager
Paul Elder
paul.elder at ideasonboard.com
Wed May 22 23:02:20 CEST 2019
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 <paul.elder at ideasonboard.com>
---
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 = 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<PipelineHandler> 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 <libcamera/camera.h>
+#include <libcamera/ipa/ipa_module_info.h>
#include <libcamera/request.h>
#include <libcamera/stream.h>
#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 <string.h>
+
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<UVCCameraData> data = utils::make_unique<UVCCameraData>(this);
/* Locate and open the default video node. */
@@ -197,7 +209,7 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
/* Create and register the camera. */
std::set<Stream *> streams{ &data->stream_ };
- std::shared_ptr<Camera> camera = Camera::create(this, media->model(), streams);
+ std::shared_ptr<Camera> 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");
--
2.20.1
More information about the libcamera-devel
mailing list