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

Niklas Söderlund niklas.soderlund at ragnatech.se
Wed Jul 29 13:39:08 CEST 2020


Hi Kieran,

Thanks for your feedback.

On 2020-07-29 11:54:40 +0100, Kieran Bingham wrote:
> Hi Niklas,
> 
> On 29/07/2020 10:21, 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
> > 
> 
> I don't see any update to cam or qcam in this series.
> 
> Is that really what we want to present to the users in this new-world-order?
> 
> Unique 'yes'
> Consistent 'yes'
> 
> Allows the 'user' to pick the right camera .... 'nope'.

As discussed on previous versions of this series and irc the name of 
cameras is not suitable to be presented to users expect for 
debugging/development tools. Examples of badly formatted UVC model names 
and serial numbers where brought up as examples on why they should not 
be part of the camera name.

The use-case for the name is for applications to be able to have a 
identifier that is unique and persistent.

To address your concern about a user-friendly string applications should 
construct one themself using informations and controls exposed by the 
Camera. The string could contain information about where in the system a 
camera is located and the string might need to be localized and other 
such concerns.

I agree work is needed on cam and qcam to support this. That is however 
a different problem this series do not address. I hope to have shot at 
working on that as soon as we have this work merged.

> 
> 
> 
> > Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> > Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
> > ---
> > * Changes since v3
> > - Switch argument to generateName() to UVCCameraData pointer.
> > ---
> >  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 35 +++++++++++++++++++-
> >  1 file changed, 34 insertions(+), 1 deletion(-)
> > 
> > diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> > index 93e3dc17e3a7105e..f51529ea519f5aee 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,8 @@ public:
> >  	bool match(DeviceEnumerator *enumerator) override;
> >  
> >  private:
> > +	std::string generateName(const UVCCameraData *data);
> > +
> >  	int processControl(ControlList *controls, unsigned int id,
> >  			   const ControlValue &value);
> >  	int processControls(UVCCameraData *data, Request *request);
> > @@ -379,6 +382,30 @@ int PipelineHandlerUVC::queueRequestDevice(Camera *camera, Request *request)
> >  	return 0;
> >  }
> >  
> > +std::string PipelineHandlerUVC::generateName(const UVCCameraData *data)
> > +{
> > +
> > +	static const std::vector<std::string> files
> > +		= { "idVendor", "idProduct", "busnum", "devnum" };
> > +	std::string path = data->video_->devicePath();
> > +	std::vector<std::string> values;
> > +	std::string value;
> > +
> > +	for (const std::string &name : files) {
> > +		std::ifstream file(path + "/../" + name);
> > +
> > +		if (!file.is_open())
> > +			return "";
> > +
> > +		std::getline(file, value);
> > +		file.close();
> > +
> > +		values.push_back(value);
> > +	}
> > +
> > +	return utils::join(values, ":");
> > +}
> > +
> >  bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
> >  {
> >  	MediaDevice *media;
> > @@ -405,8 +432,14 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
> >  		return false;
> >  
> >  	/* Create and register the camera. */
> > +	std::string name = generateName(data.get());
> > +	if (name.empty()) {
> > +		LOG(UVC, Error) << "Failed to generate camera name";
> > +		return false;
> > +	}
> > +
> >  	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);
> >  	registerCamera(std::move(camera), std::move(data));
> >  
> >  	/* Enable hot-unplug notifications. */
> > 
> 
> -- 
> Regards
> --
> Kieran

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list