[libcamera-devel,RFC,5/5] libcamera: pipelines: add IPAManager

Message ID 20190522210220.1631-6-paul.elder@ideasonboard.com
State Superseded
Headers show
Series
  • Add IPAManager
Related show

Commit Message

Paul Elder May 22, 2019, 9:02 p.m. UTC
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@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(-)

Patch

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