[v2,6/8] libcamera: camera: Hook into the LayerManager
diff mbox series

Message ID 20250703114225.2074071-7-paul.elder@ideasonboard.com
State New
Headers show
Series
  • Add Layers support
Related show

Commit Message

Paul Elder July 3, 2025, 11:42 a.m. UTC
Add hooks into the CameraManager to call into the LayerManager on all
relevant public-facing interface of Camera.

The entry point for each function into the LayerManager is has been
chosen based on the capabilities that we want to allow to Layer
implementations.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>

---
Changes in v2:
- move the LayerManager out of Camera into the CameraManager
- remove hooks for generateConfiguration() and streams()
- Camera now passes itself into the layer hooks, as it is required for
  the LayerManager to fetch the closure based on the camera to pass to
  each layer
---
 src/libcamera/camera.cpp | 40 ++++++++++++++++++++++++++++++++++++++--
 1 file changed, 38 insertions(+), 2 deletions(-)

Patch
diff mbox series

diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index c3e656cab671..665fc5157349 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -18,6 +18,7 @@ 
 #include <libcamera/base/log.h>
 #include <libcamera/base/thread.h>
 
+#include <libcamera/camera_manager.h>
 #include <libcamera/color_space.h>
 #include <libcamera/control_ids.h>
 #include <libcamera/framebuffer_allocator.h>
@@ -27,6 +28,8 @@ 
 
 #include "libcamera/internal/camera.h"
 #include "libcamera/internal/camera_controls.h"
+#include "libcamera/internal/camera_manager.h"
+#include "libcamera/internal/layer_manager.h"
 #include "libcamera/internal/pipeline_handler.h"
 #include "libcamera/internal/request.h"
 
@@ -741,18 +744,24 @@  void Camera::Private::setState(State state)
 void Camera::Private::emitBufferCompleted(Request *request, FrameBuffer *buffer)
 {
 	Camera *camera = _o<Camera>();
+	LayerManager *layerManager = pipe()->cameraManager()->_d()->layerManager();
+	layerManager->bufferCompleted(camera, request, buffer);
 	camera->bufferCompleted.emit(request, buffer);
 }
 
 void Camera::Private::emitRequestCompleted(Request *request)
 {
 	Camera *camera = _o<Camera>();
+	LayerManager *layerManager = pipe()->cameraManager()->_d()->layerManager();
+	layerManager->requestCompleted(camera, request);
 	camera->requestCompleted.emit(request);
 }
 
 void Camera::Private::emitDisconnected()
 {
 	Camera *camera = _o<Camera>();
+	LayerManager *layerManager = pipe()->cameraManager()->_d()->layerManager();
+	layerManager->disconnected(camera);
 	camera->disconnected.emit();
 }
 
@@ -943,10 +952,14 @@  Camera::Camera(std::unique_ptr<Private> d, const std::string &id,
 	_d()->id_ = id;
 	_d()->streams_ = streams;
 	_d()->validator_ = std::make_unique<CameraControlValidator>(this);
+	_d()->pipe()->cameraManager()->_d()->layerManager()->init(this,
+								  _d()->properties_,
+								  _d()->controlInfo_);
 }
 
 Camera::~Camera()
 {
+	_d()->pipe()->cameraManager()->_d()->layerManager()->terminate(this);
 }
 
 /**
@@ -1032,6 +1045,9 @@  int Camera::acquire()
 		return -EBUSY;
 	}
 
+	LayerManager *layerManager = d->pipe()->cameraManager()->_d()->layerManager();
+	layerManager->acquire(this);
+
 	d->setState(Private::CameraAcquired);
 
 	return 0;
@@ -1064,6 +1080,9 @@  int Camera::release()
 		d->pipe_->invokeMethod(&PipelineHandler::release,
 				       ConnectionTypeBlocking, this);
 
+	LayerManager *layerManager = d->pipe()->cameraManager()->_d()->layerManager();
+	layerManager->release(this);
+
 	d->setState(Private::CameraAvailable);
 
 	return 0;
@@ -1081,7 +1100,8 @@  int Camera::release()
  */
 const ControlInfoMap &Camera::controls() const
 {
-	return _d()->controlInfo_;
+	LayerManager *layerManager = _d()->pipe()->cameraManager()->_d()->layerManager();
+	return layerManager->controls(this);
 }
 
 /**
@@ -1094,7 +1114,8 @@  const ControlInfoMap &Camera::controls() const
  */
 const ControlList &Camera::properties() const
 {
-	return _d()->properties_;
+	LayerManager *layerManager = _d()->pipe()->cameraManager()->_d()->layerManager();
+	return layerManager->properties(this);
 }
 
 /**
@@ -1242,6 +1263,9 @@  int Camera::configure(CameraConfiguration *config)
 		d->activeStreams_.insert(stream);
 	}
 
+	LayerManager *layerManager = d->pipe()->cameraManager()->_d()->layerManager();
+	layerManager->configure(this, config, d->controlInfo_);
+
 	d->setState(Private::CameraConfigured);
 
 	return 0;
@@ -1282,6 +1306,9 @@  std::unique_ptr<Request> Camera::createRequest(uint64_t cookie)
 	/* Associate the request with the pipeline handler. */
 	d->pipe_->registerRequest(request.get());
 
+	LayerManager *layerManager = d->pipe()->cameraManager()->_d()->layerManager();
+	layerManager->createRequest(this, cookie, request.get());
+
 	return request;
 }
 
@@ -1366,6 +1393,9 @@  int Camera::queueRequest(Request *request)
 		}
 	}
 
+	LayerManager *layerManager = d->pipe()->cameraManager()->_d()->layerManager();
+	layerManager->queueRequest(this, request);
+
 	d->pipe_->invokeMethod(&PipelineHandler::queueRequest,
 			       ConnectionTypeQueued, request);
 
@@ -1402,6 +1432,9 @@  int Camera::start(const ControlList *controls)
 
 	ASSERT(d->requestSequence_ == 0);
 
+	LayerManager *layerManager = d->pipe()->cameraManager()->_d()->layerManager();
+	layerManager->start(this, controls);
+
 	ret = d->pipe_->invokeMethod(&PipelineHandler::start,
 				     ConnectionTypeBlocking, this, controls);
 	if (ret)
@@ -1446,6 +1479,9 @@  int Camera::stop()
 
 	d->setState(Private::CameraStopping);
 
+	LayerManager *layerManager = d->pipe()->cameraManager()->_d()->layerManager();
+	layerManager->stop(this);
+
 	d->pipe_->invokeMethod(&PipelineHandler::stop, ConnectionTypeBlocking,
 			       this);