libcamera: pipeline_handler: Register requests

Provide a call allowing requests to be registered and associated with
the pipeline handler after being constructed by the camera.

This provides an opportunity for the PipelineHandler to connect any
signals it may be interested in receiving for the request such as
getting notifications when the request is ready for processing when
using a fence.

While here, update the existing usage of the d pointer in
Camera::createRequest() to match the style of other functions.

Bug: https://github.com/raspberrypi/libcamera-apps/issues/217
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Kieran Bingham 2022-01-19 00:17:16 +00:00
parent b7d48634c5
commit 20272b9b18
3 changed files with 28 additions and 6 deletions

View file

@ -59,6 +59,7 @@ public:
void stop(Camera *camera);
bool hasPendingRequests(const Camera *camera) const;
void registerRequest(Request *request);
void queueRequest(Request *request);
bool completeBuffer(Request *request, FrameBuffer *buffer);

View file

@ -1074,12 +1074,19 @@ int Camera::configure(CameraConfiguration *config)
*/
std::unique_ptr<Request> Camera::createRequest(uint64_t cookie)
{
int ret = _d()->isAccessAllowed(Private::CameraConfigured,
Private *const d = _d();
int ret = d->isAccessAllowed(Private::CameraConfigured,
Private::CameraRunning);
if (ret < 0)
return nullptr;
return std::make_unique<Request>(this, cookie);
std::unique_ptr<Request> request = std::make_unique<Request>(this, cookie);
/* Associate the request with the pipeline handler. */
d->pipe_->registerRequest(request.get());
return request;
}
/**

View file

@ -337,6 +337,23 @@ bool PipelineHandler::hasPendingRequests(const Camera *camera) const
return !camera->_d()->queuedRequests_.empty();
}
/**
* \fn PipelineHandler::registerRequest()
* \brief Register a request for use by the pipeline handler
* \param[in] request The request to register
*
* This function is called when the request is created, and allows the pipeline
* handler to perform any one-time initialization it requries for the request.
*/
void PipelineHandler::registerRequest(Request *request)
{
/*
* Connect the request prepared signal to notify the pipeline handler
* when a request is ready to be processed.
*/
request->_d()->prepared.connect(this, &PipelineHandler::doQueueRequests);
}
/**
* \fn PipelineHandler::queueRequest()
* \brief Queue a request
@ -366,9 +383,6 @@ void PipelineHandler::queueRequest(Request *request)
waitingRequests_.push(request);
request->_d()->prepared.connect(this, [this]() {
doQueueRequests();
});
request->_d()->prepare(300ms);
}