@@ -39,6 +39,7 @@
#include "libcamera/internal/ipa_manager.h"
#include "libcamera/internal/media_device.h"
#include "libcamera/internal/pipeline_handler.h"
+#include "libcamera/internal/request.h"
#include "libcamera/internal/v4l2_subdevice.h"
#include "libcamera/internal/v4l2_videodevice.h"
@@ -48,6 +49,8 @@ namespace libcamera {
LOG_DEFINE_CATEGORY(RkISP1)
+using InternalStream = Request::Private::InternalStream;
+
class PipelineHandlerRkISP1;
class RkISP1CameraData;
@@ -174,7 +177,7 @@ private:
int initLinks(Camera *camera, const CameraSensor *sensor,
const RkISP1CameraConfiguration &config);
int createCamera(MediaEntity *sensor);
- void tryCompleteRequest(RkISP1FrameInfo *info);
+ void tryCompleteRequest(Request *request);
void bufferReady(FrameBuffer *buffer);
void paramReady(FrameBuffer *buffer);
void statReady(FrameBuffer *buffer);
@@ -231,6 +234,7 @@ RkISP1FrameInfo *RkISP1Frames::create(const RkISP1CameraData *data, Request *req
paramBuffer = pipe_->availableParamBuffers_.front();
pipe_->availableParamBuffers_.pop();
+ paramBuffer->_d()->setRequest(request);
statBuffer = pipe_->availableStatBuffers_.front();
pipe_->availableStatBuffers_.pop();
@@ -413,7 +417,8 @@ void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &meta
info->request->metadata().merge(metadata);
info->metadataProcessed = true;
- pipe()->tryCompleteRequest(info);
+ pipe()->completeBuffer(info->request, info->statBuffer);
+ pipe()->tryCompleteRequest(info->request);
}
/* -----------------------------------------------------------------------------
@@ -1026,6 +1031,9 @@ int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request)
if (!info)
return -ENOENT;
+ request->_d()->addInternalBuffer(InternalStream::Statistics, info->statBuffer);
+ request->_d()->addInternalBuffer(InternalStream::Parameters, info->paramBuffer);
+
data->ipa_->queueRequest(request->sequence(), request->controls());
if (isRaw_) {
if (info->mainPathBuffer)
@@ -1228,15 +1236,15 @@ bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)
* Buffer Handling
*/
-void PipelineHandlerRkISP1::tryCompleteRequest(RkISP1FrameInfo *info)
+void PipelineHandlerRkISP1::tryCompleteRequest(Request *request)
{
RkISP1CameraData *data = cameraData(activeCamera_);
- Request *request = info->request;
- if (request->hasPendingBuffers())
+ RkISP1FrameInfo *info = data->frameInfo_.find(request);
+ if (!info)
return;
- if (!info->metadataProcessed)
+ if (request->hasPendingBuffers())
return;
if (!isRaw_ && !info->paramDequeued)
@@ -1281,7 +1289,7 @@ void PipelineHandlerRkISP1::bufferReady(FrameBuffer *buffer)
}
completeBuffer(request, buffer);
- tryCompleteRequest(info);
+ tryCompleteRequest(request);
}
void PipelineHandlerRkISP1::paramReady(FrameBuffer *buffer)
@@ -1294,7 +1302,8 @@ void PipelineHandlerRkISP1::paramReady(FrameBuffer *buffer)
return;
info->paramDequeued = true;
- tryCompleteRequest(info);
+ completeBuffer(info->request, buffer);
+ tryCompleteRequest(info->request);
}
void PipelineHandlerRkISP1::statReady(FrameBuffer *buffer)
@@ -1309,7 +1318,8 @@ void PipelineHandlerRkISP1::statReady(FrameBuffer *buffer)
if (buffer->metadata().status == FrameMetadata::FrameCancelled) {
info->metadataProcessed = true;
- tryCompleteRequest(info);
+ completeBuffer(info->request, buffer);
+ tryCompleteRequest(info->request);
return;
}
tryCompleteRequest() is used to delay completeRequest() until all the image buffers have been returned to userspace and the Request's metadata has been filled with control values by the IPA. To do that the pipeline handler has a struct which holds various pieces of info that allow the tryCompleteRequest() function to decide whether it's ok to complete the request yet or not. This is quite a heavy way of doing things - ultimately what is being tracked is whether or not the buffers in question have been handled by the pipeline handler, and a Request already tracks that for the image buffers. The internal buffers can be tracked in the same way using the new concept of internal buffers for a Request. Re-factor the tryCompleteRequest() function to take a Request * and simply check hasPendingBuffers(request). Use the relatively new Request::Private::addInternalBuffer() to link the stats and parameters buffers to the request on each queueRequestDevice(). Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> --- Changes in v2: - Use the new internal buffers for Requests to track status rather than the inFlightStatsBuffers_ map. src/libcamera/pipeline/rkisp1/rkisp1.cpp | 28 ++++++++++++++++-------- 1 file changed, 19 insertions(+), 9 deletions(-)