libcamera: pipeline_handler: Simplify request completion
libcamera guarantees that requests complete in sequence. This requirement is currently pushed down to pipeline handlers. Three out of four of our pipeline handlers implement that requirement based on the sole assumption that buffers will always complete in sequeuence, while the IPU3 pipeline handler implements a more complex logic. It turns out that the logic can be moved to the base PipelineHandler class with support from the Request class. Do so to simplify the pipeline handlers. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
parent
a775234d66
commit
185fe3d4b4
5 changed files with 22 additions and 22 deletions
|
@ -927,15 +927,9 @@ void IPU3CameraData::imguOutputBufferReady(Buffer *buffer)
|
|||
/* Request not completed yet, return here. */
|
||||
return;
|
||||
|
||||
/* Complete the pending requests in queueing order. */
|
||||
while (1) {
|
||||
request = queuedRequests_.front();
|
||||
if (request->hasPendingBuffers())
|
||||
break;
|
||||
|
||||
/* Mark the request as complete. */
|
||||
pipe_->completeRequest(camera_, request);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Handle buffers completion at the CIO2 output
|
||||
|
|
|
@ -491,9 +491,7 @@ bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)
|
|||
void PipelineHandlerRkISP1::bufferReady(Buffer *buffer)
|
||||
{
|
||||
ASSERT(activeCamera_);
|
||||
|
||||
RkISP1CameraData *data = cameraData(activeCamera_);
|
||||
Request *request = data->queuedRequests_.front();
|
||||
Request *request = buffer->request();
|
||||
|
||||
completeBuffer(activeCamera_, request, buffer);
|
||||
completeRequest(activeCamera_, request);
|
||||
|
|
|
@ -382,7 +382,7 @@ int UVCCameraData::init(MediaEntity *entity)
|
|||
|
||||
void UVCCameraData::bufferReady(Buffer *buffer)
|
||||
{
|
||||
Request *request = queuedRequests_.front();
|
||||
Request *request = buffer->request();
|
||||
|
||||
pipe_->completeBuffer(camera_, request, buffer);
|
||||
pipe_->completeRequest(camera_, request);
|
||||
|
|
|
@ -376,7 +376,7 @@ int VimcCameraData::init(MediaDevice *media)
|
|||
|
||||
void VimcCameraData::bufferReady(Buffer *buffer)
|
||||
{
|
||||
Request *request = queuedRequests_.front();
|
||||
Request *request = buffer->request();
|
||||
|
||||
pipe_->completeBuffer(camera_, request, buffer);
|
||||
pipe_->completeRequest(camera_, request);
|
||||
|
|
|
@ -391,8 +391,9 @@ int PipelineHandler::queueRequest(Camera *camera, Request *request)
|
|||
* This method shall be called by pipeline handlers to signal completion of the
|
||||
* \a buffer part of the \a request. It notifies applications of buffer
|
||||
* completion and updates the request's internal buffer tracking. The request
|
||||
* is not completed automatically when the last buffer completes, pipeline
|
||||
* handlers shall complete requests explicitly with completeRequest().
|
||||
* is not completed automatically when the last buffer completes to give
|
||||
* pipeline handlers a chance to perform any operation that may still be
|
||||
* needed. They shall complete requests explicitly with completeRequest().
|
||||
*
|
||||
* \return True if all buffers contained in the request have completed, false
|
||||
* otherwise
|
||||
|
@ -413,18 +414,25 @@ bool PipelineHandler::completeBuffer(Camera *camera, Request *request,
|
|||
* request has completed. The request is deleted and shall not be accessed once
|
||||
* this method returns.
|
||||
*
|
||||
* The pipeline handler shall ensure that requests complete in the same order
|
||||
* they are submitted.
|
||||
* This method ensures that requests will be returned to the application in
|
||||
* submission order, the pipeline handler may call it on any complete request
|
||||
* without any ordering constraint.
|
||||
*/
|
||||
void PipelineHandler::completeRequest(Camera *camera, Request *request)
|
||||
{
|
||||
CameraData *data = cameraData(camera);
|
||||
ASSERT(request == data->queuedRequests_.front());
|
||||
data->queuedRequests_.pop_front();
|
||||
|
||||
request->complete(Request::RequestComplete);
|
||||
|
||||
CameraData *data = cameraData(camera);
|
||||
|
||||
while (!data->queuedRequests_.empty()) {
|
||||
request = data->queuedRequests_.front();
|
||||
if (request->hasPendingBuffers())
|
||||
break;
|
||||
|
||||
data->queuedRequests_.pop_front();
|
||||
camera->requestComplete(request);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Register a camera to the camera manager and pipeline handler
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue