On 2018/04/24 16:34, Landry Breuil wrote: > Hi, > > here's a diff to reuse usbd_devinfo_vp() (exposed in usbdivar.h) in > VIDIOC_QUERYCAP ioctl callback, this way we can fill v4l2_capability > card struct member with the actual usb product name instead of a dummy > "Generic USB video class device".
Generally I think this is a good idea, but some devices have crap in v/p, is that likely to cause any problems? > Firefox uses that ioctl to get the user-facing device name in > https://dxr.mozilla.org/mozilla-central/source/media/webrtc/trunk/webrtc/modules/video_capture/linux/device_info_linux.cc#313 > so that's helpful when you have several devices > and the webrtc doorhanger asks you which camera you want to > share.. cf http://i.imgur.com/uLnWw6u.png > > USB_MAX_STRING_LEN is 127 and card is 32 in v4l2_capability, so strlcpy > should take care of null-terminating/truncating. > > Thx mpi@ for the directions.. > > Landry > Index: usb_subr.c > =================================================================== > RCS file: /cvs/src/sys/dev/usb/usb_subr.c,v > retrieving revision 1.134 > diff -u -r1.134 usb_subr.c > --- usb_subr.c 8 Apr 2017 02:57:25 -0000 1.134 > +++ usb_subr.c 24 Apr 2018 14:20:00 -0000 > @@ -61,8 +61,6 @@ > > usbd_status usbd_set_config(struct usbd_device *, int); > void usbd_devinfo(struct usbd_device *, int, char *, size_t); > -void usbd_devinfo_vp(struct usbd_device *, char *, size_t, > - char *, size_t, int); > char *usbd_get_device_string(struct usbd_device *, uByte); > char *usbd_get_string(struct usbd_device *, int, char *, size_t); > int usbd_getnewaddr(struct usbd_bus *); > Index: usbdivar.h > =================================================================== > RCS file: /cvs/src/sys/dev/usb/usbdivar.h,v > retrieving revision 1.73 > diff -u -r1.73 usbdivar.h > --- usbdivar.h 3 Feb 2018 13:37:37 -0000 1.73 > +++ usbdivar.h 24 Apr 2018 14:20:00 -0000 > @@ -257,6 +257,8 @@ > usbd_status usb_insert_transfer(struct usbd_xfer *); > void usb_transfer_complete(struct usbd_xfer *); > int usbd_detach(struct usbd_device *, struct device *); > +void usbd_devinfo_vp(struct usbd_device *, char *, size_t, > + char *, size_t, int); > > /* Routines from usb.c */ > void usb_needs_explore(struct usbd_device *, int); > Index: uvideo.c > =================================================================== > RCS file: /cvs/src/sys/dev/usb/uvideo.c,v > retrieving revision 1.196 > diff -u -r1.196 uvideo.c > --- uvideo.c 30 Dec 2017 23:08:29 -0000 1.196 > +++ uvideo.c 24 Apr 2018 14:20:00 -0000 > @@ -2781,11 +2781,14 @@ > uvideo_querycap(void *v, struct v4l2_capability *caps) > { > struct uvideo_softc *sc = v; > + char vendor[USB_MAX_STRING_LEN]; > + char product[USB_MAX_STRING_LEN]; > > bzero(caps, sizeof(*caps)); > strlcpy(caps->driver, DEVNAME(sc), sizeof(caps->driver)); > - strlcpy(caps->card, "Generic USB video class device", > - sizeof(caps->card)); > + usbd_devinfo_vp(sc->sc_udev, vendor, sizeof (vendor), product, > + sizeof (product), 1); > + strlcpy(caps->card, product, sizeof(caps->card)); > strlcpy(caps->bus_info, "usb", sizeof(caps->bus_info)); > > caps->version = 1;