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

Kieran Bingham kieran.bingham at ideasonboard.com
Tue Jun 18 22:42:05 CEST 2019


Hi Laurent,

On 17/06/2019 11:09, Laurent Pinchart wrote:
> 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.


I'm very pleased to see this patch.

I asked about allowing an index to identify the camera, rather than the
extended strings sometime ago, especially as I have to deal with:

- HP Wide Vision FHD Camera: HP W
- HP Wide Vision FHD Camera: HP I

But I recall I was told that we were not going to guarantee ordering of
the cameras, thus an ID was not appropriate.

But as all remaining members of the team seem happy with this now, I
finally get to use an index!

So

Highly-desired-by and:
Acked-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

> 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
--
Kieran


More information about the libcamera-devel mailing list