[libcamera-devel] [PATCH] cam: Allow selecting cameras by index

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Jun 17 12:09:10 CEST 2019


As camera names can be cumbersome to type, selection of cameras by index
from a list can be useful. Print the list of detected cameras with an
index for each item, and interpret the camera name as an index if it is
a numerical value in the range from 1 to the number of cameras.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 src/cam/main.cpp | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/src/cam/main.cpp b/src/cam/main.cpp
index f03a9faf87fa..0e7610b1befd 100644
--- a/src/cam/main.cpp
+++ b/src/cam/main.cpp
@@ -73,7 +73,14 @@ int CamApp::init(int argc, char **argv)
 	}
 
 	if (options_.isSet(OptCamera)) {
-		camera_ = cm_->get(options_[OptCamera]);
+		const std::string &cameraName = options_[OptCamera];
+		char *endptr;
+		unsigned long index = strtoul(cameraName.c_str(), &endptr, 10);
+		if (*endptr == '\0' && index > 0 && index <= cm_->cameras().size())
+			camera_ = cm_->cameras()[index - 1];
+		else
+			camera_ = cm_->get(cameraName);
+
 		if (!camera_) {
 			std::cout << "Camera "
 				  << std::string(options_[OptCamera])
@@ -172,8 +179,12 @@ int CamApp::run()
 {
 	if (options_.isSet(OptList)) {
 		std::cout << "Available cameras:" << std::endl;
-		for (const std::shared_ptr<Camera> &cam : cm_->cameras())
-			std::cout << "- " << cam->name() << std::endl;
+
+		unsigned int index = 1;
+		for (const std::shared_ptr<Camera> &cam : cm_->cameras()) {
+			std::cout << index << ": " << cam->name() << std::endl;
+			index++;
+		}
 	}
 
 	if (options_.isSet(OptCapture)) {
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list