[v2,4/7] libcamera: rkisp1: Switch tryCompleteRequest() to use Request *
diff mbox series

Message ID 20240220164317.998477-5-dan.scally@ideasonboard.com
State New
Headers show
Series
  • Remove RkISP1FrameInfo and IPU3Frames classes
Related show

Commit Message

Daniel Scally Feb. 20, 2024, 4:43 p.m. UTC
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(-)

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index d926c83c..43e9d98b 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -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;
 	}