[libcamera-devel] [PATCH 26/30] cam: Reorganize run() function and merge the two event loops
Kieran Bingham
kieran.bingham at ideasonboard.com
Mon Jul 12 18:03:20 CEST 2021
On 07/07/2021 03:19, Laurent Pinchart wrote:
> Reorganize the run() function to make it more readable, and merge the
> two event loops into one as capture and hotplug monitoring don't have to
> be mutually exclusive.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> src/cam/main.cpp | 60 ++++++++++++++++++++++++------------------------
> 1 file changed, 30 insertions(+), 30 deletions(-)
>
> diff --git a/src/cam/main.cpp b/src/cam/main.cpp
> index 380c14e02cf0..a3f19d0fa61b 100644
> --- a/src/cam/main.cpp
> +++ b/src/cam/main.cpp
> @@ -5,6 +5,7 @@
> * main.cpp - cam - The libcamera swiss army knife
> */
>
> +#include <atomic>
> #include <iomanip>
> #include <iostream>
> #include <signal.h>
> @@ -48,6 +49,7 @@ private:
>
> std::unique_ptr<CameraManager> cm_;
>
> + std::atomic_uint loopUsers_;
> EventLoop loop_;
> };
>
> @@ -164,14 +166,15 @@ void CamApp::cameraRemoved(std::shared_ptr<Camera> cam)
>
> void CamApp::captureDone()
> {
> - EventLoop::instance()->exit(0);
> + if (--loopUsers_ == 0)
Aha, now I see how we're getting multi-session too.
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> + EventLoop::instance()->exit(0);
> }
>
> int CamApp::run()
> {
> - std::unique_ptr<CameraSession> session;
> int ret;
>
> + /* 1. List all cameras. */
> if (options_.isSet(OptList)) {
> std::cout << "Available cameras:" << std::endl;
>
> @@ -182,6 +185,9 @@ int CamApp::run()
> }
> }
>
> + /* 2. Create the camera session. */
> + std::unique_ptr<CameraSession> session;
> +
> if (options_.isSet(OptCamera)) {
> session = std::make_unique<CameraSession>(cm_.get(), options_);
> if (!session->isValid()) {
> @@ -195,36 +201,25 @@ int CamApp::run()
> session->captureDone.connect(this, &CamApp::captureDone);
> }
>
> - if (options_.isSet(OptListControls)) {
> + /* 3. Print camera information. */
> + if (options_.isSet(OptListControls) ||
> + options_.isSet(OptListProperties) ||
> + options_.isSet(OptInfo)) {
> if (!session) {
> - std::cout << "Cannot list controls without a camera"
> + std::cout << "Cannot print camera information without a camera"
> << std::endl;
> return -EINVAL;
> }
>
> - session->listControls();
> - }
> -
> - if (options_.isSet(OptListProperties)) {
> - if (!session) {
> - std::cout << "Cannot list properties without a camera"
> - << std::endl;
> - return -EINVAL;
> - }
> -
> - session->listProperties();
> - }
> -
> - if (options_.isSet(OptInfo)) {
> - if (!session) {
> - std::cout << "Cannot print stream information without a camera"
> - << std::endl;
> - return -EINVAL;
> - }
> -
> - session->infoConfiguration();
> + if (options_.isSet(OptListControls))
> + session->listControls();
> + if (options_.isSet(OptListProperties))
> + session->listProperties();
> + if (options_.isSet(OptInfo))
> + session->infoConfiguration();
> }
>
> + /* 4. Start capture. */
> if (options_.isSet(OptCapture)) {
> if (!session) {
> std::cout << "Can't capture without a camera" << std::endl;
> @@ -237,12 +232,10 @@ int CamApp::run()
> return ret;
> }
>
> - loop_.exec();
> -
> - session->stop();
> - return 0;
> + loopUsers_++;
> }
>
> + /* 5. Enable hotplug monitoring. */
> if (options_.isSet(OptMonitor)) {
> std::cout << "Monitoring new hotplug and unplug events" << std::endl;
> std::cout << "Press Ctrl-C to interrupt" << std::endl;
> @@ -250,9 +243,16 @@ int CamApp::run()
> cm_->cameraAdded.connect(this, &CamApp::cameraAdded);
> cm_->cameraRemoved.connect(this, &CamApp::cameraRemoved);
>
> - loop_.exec();
> + loopUsers_++;
> }
>
> + if (loopUsers_)
> + loop_.exec();
> +
> + /* 6. Stop capture. */
> + if (options_.isSet(OptCapture))
> + session->stop();
> +
> return 0;
> }
>
>
More information about the libcamera-devel
mailing list