[libcamera-devel] [PATCH v4 4/8] libcamera: pipeline: rkisp1: Add clear() to RkISP1Frames

Niklas Söderlund niklas.soderlund at ragnatech.se
Mon Apr 13 23:26:56 CEST 2020


When the camera is stopping the helper that keeps track of which buffers
are associated with a request is not cleared. Add a clear operation and
call it when the camera is stopped.

Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
---
 src/libcamera/pipeline/rkisp1/rkisp1.cpp | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index de90615edf217cca..c4e46bea1cc9a47f 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -64,6 +64,7 @@ public:
 
 	RkISP1FrameInfo *create(unsigned int frame, Request *request, Stream *stream);
 	int destroy(unsigned int frame);
+	void clear();
 
 	RkISP1FrameInfo *find(unsigned int frame);
 	RkISP1FrameInfo *find(FrameBuffer *buffer);
@@ -279,6 +280,21 @@ int RkISP1Frames::destroy(unsigned int frame)
 	return 0;
 }
 
+void RkISP1Frames::clear()
+{
+	auto it = frameInfo_.cbegin();
+	while (it != frameInfo_.cend()) {
+		RkISP1FrameInfo *info = it->second;
+
+		pipe_->availableParamBuffers_.push(info->paramBuffer);
+		pipe_->availableStatBuffers_.push(info->statBuffer);
+
+		it = frameInfo_.erase(it);
+
+		delete info;
+	}
+}
+
 RkISP1FrameInfo *RkISP1Frames::find(unsigned int frame)
 {
 	auto itInfo = frameInfo_.find(frame);
@@ -832,6 +848,8 @@ void PipelineHandlerRkISP1::stop(Camera *camera)
 
 	data->timeline_.reset();
 
+	data->frameInfo_.clear();
+
 	freeBuffers(camera);
 
 	activeCamera_ = nullptr;
-- 
2.26.0



More information about the libcamera-devel mailing list