[libcamera-devel] [PATCH v3 2/3] cam: capture: Cache the EventLoop handler

Niklas Söderlund niklas.soderlund at ragnatech.se
Fri Jul 24 21:18:50 CEST 2020


Prepare for the ability to exit the event loop based on conditions in
the request complete handler by caching the pointer instead of passing
it as an argument.

Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
* Changes since v2
- Pass EventLoop to constructor instead of run()
---
 src/cam/capture.cpp | 13 +++++++------
 src/cam/capture.h   | 10 ++++++----
 src/cam/main.cpp    |  4 ++--
 3 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/src/cam/capture.cpp b/src/cam/capture.cpp
index 55fa2dabcee97f21..f811a18c579508a1 100644
--- a/src/cam/capture.cpp
+++ b/src/cam/capture.cpp
@@ -16,12 +16,13 @@
 
 using namespace libcamera;
 
-Capture::Capture(std::shared_ptr<Camera> camera, CameraConfiguration *config)
-	: camera_(camera), config_(config), writer_(nullptr)
+Capture::Capture(std::shared_ptr<Camera> camera, CameraConfiguration *config,
+		 EventLoop *loop)
+	: camera_(camera), config_(config), writer_(nullptr), loop_(loop)
 {
 }
 
-int Capture::run(EventLoop *loop, const OptionsParser::Options &options)
+int Capture::run(const OptionsParser::Options &options)
 {
 	int ret;
 
@@ -54,7 +55,7 @@ int Capture::run(EventLoop *loop, const OptionsParser::Options &options)
 
 	FrameBufferAllocator *allocator = new FrameBufferAllocator(camera_);
 
-	ret = capture(loop, allocator);
+	ret = capture(allocator);
 
 	if (options.isSet(OptFile)) {
 		delete writer_;
@@ -66,7 +67,7 @@ int Capture::run(EventLoop *loop, const OptionsParser::Options &options)
 	return ret;
 }
 
-int Capture::capture(EventLoop *loop, FrameBufferAllocator *allocator)
+int Capture::capture(FrameBufferAllocator *allocator)
 {
 	int ret;
 
@@ -132,7 +133,7 @@ int Capture::capture(EventLoop *loop, FrameBufferAllocator *allocator)
 	}
 
 	std::cout << "Capture until user interrupts by SIGINT" << std::endl;
-	ret = loop->exec();
+	ret = loop_->exec();
 	if (ret)
 		std::cout << "Failed to run capture loop" << std::endl;
 
diff --git a/src/cam/capture.h b/src/cam/capture.h
index 9bca5661070efcf5..acdefc47b24314d2 100644
--- a/src/cam/capture.h
+++ b/src/cam/capture.h
@@ -24,12 +24,12 @@ class Capture
 {
 public:
 	Capture(std::shared_ptr<libcamera::Camera> camera,
-		libcamera::CameraConfiguration *config);
+		libcamera::CameraConfiguration *config,
+		EventLoop *loop);
 
-	int run(EventLoop *loop, const OptionsParser::Options &options);
+	int run(const OptionsParser::Options &options);
 private:
-	int capture(EventLoop *loop,
-		    libcamera::FrameBufferAllocator *allocator);
+	int capture(libcamera::FrameBufferAllocator *allocator);
 
 	void requestComplete(libcamera::Request *request);
 
@@ -39,6 +39,8 @@ private:
 	std::map<libcamera::Stream *, std::string> streamName_;
 	BufferWriter *writer_;
 	std::chrono::steady_clock::time_point last_;
+
+	EventLoop *loop_;
 };
 
 #endif /* __CAM_CAPTURE_H__ */
diff --git a/src/cam/main.cpp b/src/cam/main.cpp
index ead0abe3e2abf42d..3e83feabe64e036c 100644
--- a/src/cam/main.cpp
+++ b/src/cam/main.cpp
@@ -341,8 +341,8 @@ int CamApp::run()
 	}
 
 	if (options_.isSet(OptCapture)) {
-		Capture capture(camera_, config_.get());
-		return capture.run(loop_, options_);
+		Capture capture(camera_, config_.get(), loop_);
+		return capture.run(options_);
 	}
 
 	return 0;
-- 
2.27.0



More information about the libcamera-devel mailing list