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

Niklas Söderlund niklas.soderlund at ragnatech.se
Tue Jun 18 22:26:23 CEST 2019


Hi Laurent,

On 2019-06-18 21:40:39 +0300, Laurent Pinchart wrote:
> Hi Niklas,
> 
> On Tue, Jun 18, 2019 at 09:44:42AM +0200, Niklas Söderlund wrote:
> > On 2019-06-17 13:09:10 +0300, 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 think you should also update the usage information for --camera to 
> > indicate both camera name and index can be used to select a camera.
> 
> Good point ! Would the following be enough ?
> 
>         parser.addOption(OptCamera, OptionString,
> -                        "Specify which camera to operate on", "camera",
> +                        "Specify which camera to operate on, by name or by index", "camera",

Works for me, with this changed,

Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>

>                          ArgumentRequired, "camera");
> 
> > > 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

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list