@@ -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);
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(-)