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

Nicolas Dufresne nicolas at ndufresne.ca
Mon Aug 10 18:07:54 CEST 2020


Le mercredi 29 juillet 2020 à 13:39 +0200, Niklas Söderlund a écrit :
> 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.

I believe the fact it's called name() makes that API dedicated to
something human readable. I was expecting a new API called id() or
identifier(). At least all other systems seems to make an effort to
keep it human recognizable, perhaps you should have a look at
pulseaudio unique name scheme ?

I don't think it's great to wave away the ability to display something
slightly human readable, even for debugging having just string of
hexadecimal (UVC cases) will make things much harder.

I also dislike this waving away as it will make it looks like this
basic information is optional, but it should not be.

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



More information about the libcamera-devel mailing list