@@ -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);
@@ -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::CameraRunning);
+ 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;
}
/**
@@ -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);
}