[RFC,5/7] libcamera: camera: Hook into the LayerManager
diff mbox series

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

Commit Message

Paul Elder June 26, 2025, 9:59 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>
---
 include/libcamera/internal/camera.h |  4 ++++
 src/libcamera/camera.cpp            | 26 +++++++++++++++++++++++---
 2 files changed, 27 insertions(+), 3 deletions(-)

Patch
diff mbox series

diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h
index 967d4e1693ec..1b9c3da695b6 100644
--- a/include/libcamera/internal/camera.h
+++ b/include/libcamera/internal/camera.h
@@ -18,6 +18,8 @@ 
 
 #include <libcamera/camera.h>
 
+#include "libcamera/internal/layer_manager.h"
+
 namespace libcamera {
 
 class CameraControlValidator;
@@ -76,6 +78,8 @@  private:
 	std::atomic<State> state_;
 
 	std::unique_ptr<CameraControlValidator> validator_;
+
+	std::unique_ptr<LayerManager> layerManager_;
 };
 
 } /* namespace libcamera */
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index c3e656cab671..895180452edb 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -741,18 +741,21 @@  void Camera::Private::setState(State state)
 void Camera::Private::emitBufferCompleted(Request *request, FrameBuffer *buffer)
 {
 	Camera *camera = _o<Camera>();
+	layerManager_->bufferCompleted(request, buffer);
 	camera->bufferCompleted.emit(request, buffer);
 }
 
 void Camera::Private::emitRequestCompleted(Request *request)
 {
 	Camera *camera = _o<Camera>();
+	layerManager_->requestCompleted(request);
 	camera->requestCompleted.emit(request);
 }
 
 void Camera::Private::emitDisconnected()
 {
 	Camera *camera = _o<Camera>();
+	layerManager_->disconnected();
 	camera->disconnected.emit();
 }
 
@@ -943,6 +946,7 @@  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()->layerManager_ = std::make_unique<LayerManager>();
 }
 
 Camera::~Camera()
@@ -1032,6 +1036,8 @@  int Camera::acquire()
 		return -EBUSY;
 	}
 
+	d->layerManager_->acquire();
+
 	d->setState(Private::CameraAcquired);
 
 	return 0;
@@ -1064,6 +1070,8 @@  int Camera::release()
 		d->pipe_->invokeMethod(&PipelineHandler::release,
 				       ConnectionTypeBlocking, this);
 
+	d->layerManager_->release();
+
 	d->setState(Private::CameraAvailable);
 
 	return 0;
@@ -1081,7 +1089,7 @@  int Camera::release()
  */
 const ControlInfoMap &Camera::controls() const
 {
-	return _d()->controlInfo_;
+	return _d()->layerManager_->controls(_d()->controlInfo_);
 }
 
 /**
@@ -1094,7 +1102,7 @@  const ControlInfoMap &Camera::controls() const
  */
 const ControlList &Camera::properties() const
 {
-	return _d()->properties_;
+	return _d()->layerManager_->properties(_d()->properties_);
 }
 
 /**
@@ -1110,7 +1118,7 @@  const ControlList &Camera::properties() const
  */
 const std::set<Stream *> &Camera::streams() const
 {
-	return _d()->streams_;
+	return _d()->layerManager_->streams(_d()->streams_);
 }
 
 /**
@@ -1158,6 +1166,8 @@  std::unique_ptr<CameraConfiguration> Camera::generateConfiguration(Span<const St
 
 	LOG(Camera, Debug) << msg.str();
 
+	d->layerManager_->generateConfiguration(roles, config.get());
+
 	return config;
 }
 
@@ -1242,6 +1252,8 @@  int Camera::configure(CameraConfiguration *config)
 		d->activeStreams_.insert(stream);
 	}
 
+	d->layerManager_->configure(config);
+
 	d->setState(Private::CameraConfigured);
 
 	return 0;
@@ -1282,6 +1294,8 @@  std::unique_ptr<Request> Camera::createRequest(uint64_t cookie)
 	/* Associate the request with the pipeline handler. */
 	d->pipe_->registerRequest(request.get());
 
+	d->layerManager_->createRequest(cookie, request.get());
+
 	return request;
 }
 
@@ -1366,6 +1380,8 @@  int Camera::queueRequest(Request *request)
 		}
 	}
 
+	d->layerManager_->queueRequest(request);
+
 	d->pipe_->invokeMethod(&PipelineHandler::queueRequest,
 			       ConnectionTypeQueued, request);
 
@@ -1402,6 +1418,8 @@  int Camera::start(const ControlList *controls)
 
 	ASSERT(d->requestSequence_ == 0);
 
+	d->layerManager_->start(controls);
+
 	ret = d->pipe_->invokeMethod(&PipelineHandler::start,
 				     ConnectionTypeBlocking, this, controls);
 	if (ret)
@@ -1446,6 +1464,8 @@  int Camera::stop()
 
 	d->setState(Private::CameraStopping);
 
+	d->layerManager_->stop();
+
 	d->pipe_->invokeMethod(&PipelineHandler::stop, ConnectionTypeBlocking,
 			       this);