[libcamera-devel] [PATCH v3 4/5] libcamera: pipeline: uvcvideo: Generate unique camera names

Niklas Söderlund niklas.soderlund at ragnatech.se
Wed Jul 29 11:05:45 CEST 2020


Hi Jacopo,

Thanks for your comments.

On 2020-07-29 10:14:59 +0200, Jacopo Mondi wrote:
> Hi Niklas,
> 
> On Wed, Jul 29, 2020 at 01:42:24AM +0200, Niklas Söderlund wrote:
> > Generate camera names that are unique and persistent between system
> > resets. The name is constructed from the USB vendor and product
> > information that is stored on USB device itself and the USB bus and
> > device numbers where the hardware is plugged in.
> >
> > Before this change example of camera names:
> >
> > Venus USB2.0 Camera: Venus USB2
> > Logitech Webcam C930e
> >
> > After this change the same cameras are:
> >
> > 0ac8:3420:3:10
> > 046d:0843:3:4
> >
> > Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> > ---
> >  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 34 +++++++++++++++++++-
> >  1 file changed, 33 insertions(+), 1 deletion(-)
> >
> > diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> > index 93e3dc17e3a7105e..72f3f5d9f7c414d0 100644
> > --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> > +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> > @@ -6,6 +6,7 @@
> >   */
> >
> >  #include <algorithm>
> > +#include <fstream>
> >  #include <iomanip>
> >  #include <math.h>
> >  #include <tuple>
> > @@ -81,6 +82,9 @@ public:
> >  	bool match(DeviceEnumerator *enumerator) override;
> >
> >  private:
> > +	std::string generateName(const MediaDevice *media,
> > +				 const std::string path);
> > +
> >  	int processControl(ControlList *controls, unsigned int id,
> >  			   const ControlValue &value);
> >  	int processControls(UVCCameraData *data, Request *request);
> > @@ -379,6 +383,28 @@ int PipelineHandlerUVC::queueRequestDevice(Camera *camera, Request *request)
> >  	return 0;
> >  }
> >
> > +std::string PipelineHandlerUVC::generateName(const MediaDevice *media,
> 
> Is media used ?
> 
> > +					     const std::string path)
> 
> I would have passed the CameraData instance and got the path from
> there.

I have no strong preference so I will make it so in v4.


> 
> > +{
> > +	static const std::vector<std::string> files = { "idVendor", "idProduct", "busnum", "devnum" };
> 
> less than 120 cols ?
> 
> > +	std::vector<std::string> values;
> > +	std::string value;
> > +
> > +	for (const std::string &name : files) {
> > +		std::ifstream file(path + "/../" + name);
> > +
> > +		if (!file.is_open())
> > +			return "";
> 
> Return or just skip that file ? If you want to return is this worth an
> error message ?

All files are mandatory so its all pass or we should fail.

> > +
> > +		std::getline(file, value);
> > +		file.close();
> 
> This applies to the other patches as well, reading
> std::ifstream::close documentation I see:
> 
> "Note that any open file is automatically closed when the ifstream object is destroyed."
> 
> Do you need to call close ? I got suspicious as it felt weird that an
> STL library opens a file on construction but requires manual closure..

I like to explicitly close the file, specially here as we loop I think 
it makes the code more readable.

> 
> > +
> > +		values.push_back(value);
> > +	}
> > +
> > +	return utils::join(values, ":");
> > +}
> > +
> >  bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
> >  {
> >  	MediaDevice *media;
> > @@ -405,8 +431,14 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
> >  		return false;
> >
> >  	/* Create and register the camera. */
> > +	std::string name = generateName(media, data->video_->devicePath());
> > +	if (name.empty()) {
> > +		LOG(UVC, Error) << "Failed to generate camera name";
> > +		return false;
> > +	}
> 
> Oh the error is here, and is better here than in the function. But
> then you have to fail if you don't find one of the files... I think
> what you have here is right then...
> 
> > +
> >  	std::set<Stream *> streams{ &data->stream_ };
> > -	std::shared_ptr<Camera> camera = Camera::create(this, media->model(), streams);
> > +	std::shared_ptr<Camera> camera = Camera::create(this, name, streams);
> 
> nits apart
> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>

Thanks.

> 
> Thanks
>   j
> 
> >  	registerCamera(std::move(camera), std::move(data));
> >
> >  	/* Enable hot-unplug notifications. */
> > --
> > 2.27.0
> >
> > _______________________________________________
> > libcamera-devel mailing list
> > libcamera-devel at lists.libcamera.org
> > https://lists.libcamera.org/listinfo/libcamera-devel

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list