Following yesterday feedback, I wrote a patch merging usb_video_header_desc and usb_video_header_desc_all in uvideo.c . Current kernel compile fine with it on amd64 and video display image.
At the moment, I can't test the patch on other platform. So I'm looking for feedback, on the pattern used and if it change anything on non-amd64. If those are positive, there is a couple of structure I would alter in the same way.
Index: sys/dev/usb//uvideo.c =================================================================== RCS file: /cvs/src/sys/dev/usb/uvideo.c,v retrieving revision 1.181 diff -u -p -r1.181 uvideo.c --- sys/dev/usb//uvideo.c 9 Jul 2015 14:58:32 -0000 1.181 +++ sys/dev/usb//uvideo.c 17 Jul 2015 11:03:48 -0000 @@ -84,7 +84,7 @@ struct uvideo_softc { int sc_nframes; struct usb_video_probe_commit sc_desc_probe; - struct usb_video_header_desc_all sc_desc_vc_header; + struct usb_video_header_desc *sc_desc_vc_header; struct usb_video_input_header_desc_all sc_desc_vs_input_header; #define UVIDEO_MAX_PU 8 @@ -694,16 +694,15 @@ uvideo_vc_parse_desc_header(struct uvide { struct usb_video_header_desc *d; - d = (struct usb_video_header_desc *)(uint8_t *)desc; + d = (struct usb_video_header_desc *)desc; if (d->bInCollection == 0) { printf("%s: no VS interface found!\n", DEVNAME(sc)); return (USBD_INVAL); } - - sc->sc_desc_vc_header.fix = d; - sc->sc_desc_vc_header.baInterfaceNr = (uByte *)(d + 1); + + sc->sc_desc_vc_header = d; return (USBD_NORMAL_COMPLETION); } @@ -838,7 +837,7 @@ uvideo_vs_parse_desc(struct uvideo_softc DPRINTF(1, "%s: number of total interfaces=%d\n", DEVNAME(sc), sc->sc_nifaces); DPRINTF(1, "%s: number of VS interfaces=%d\n", - DEVNAME(sc), sc->sc_desc_vc_header.fix->bInCollection); + DEVNAME(sc), sc->sc_desc_vc_header->bInCollection); usbd_desc_iter_init(sc->sc_udev, &iter); desc = usbd_desc_iter_next(&iter); @@ -874,8 +873,8 @@ uvideo_vs_parse_desc(struct uvideo_softc return (error); /* parse interface collection */ - for (i = 0; i < sc->sc_desc_vc_header.fix->bInCollection; i++) { - iface = sc->sc_desc_vc_header.baInterfaceNr[i]; + for (i = 0; i < sc->sc_desc_vc_header->bInCollection; i++) { + iface = sc->sc_desc_vc_header->baInterfaceNr[i]; id = usbd_get_interface_descriptor(&sc->sc_udev->ifaces[iface]); if (id == NULL) { @@ -1500,12 +1499,12 @@ uvideo_vs_negotiation(struct uvideo_soft * Some UVC 1.00 devices return dwMaxVideoFrameSize = 0. * If so, fix it by format/frame descriptors. */ - hd = sc->sc_desc_vc_header.fix; + hd = sc->sc_desc_vc_header; if (UGETDW(pc->dwMaxVideoFrameSize) == 0 && UGETW(hd->bcdUVC) < 0x0110 ) { DPRINTF(1, "%s: dwMaxVideoFrameSize == 0, fixed\n", DEVNAME(sc)); - USETDW(pc->dwMaxVideoFrameSize, + USETDW(pc->dwMaxVideoFrameSize, UGETDW(frame->dwMaxVideoFrameBufferSize)); } } Index: sys/dev/usb//uvideo.h =================================================================== RCS file: /cvs/src/sys/dev/usb/uvideo.h,v retrieving revision 1.57 diff -u -p -r1.57 uvideo.h --- sys/dev/usb//uvideo.h 9 Jul 2015 14:58:32 -0000 1.57 +++ sys/dev/usb//uvideo.h 17 Jul 2015 11:03:48 -0000 @@ -162,13 +162,9 @@ struct usb_video_header_desc { uWord wTotalLength; uDWord dwClockFrequency; uByte bInCollection; + uByte baInterfaceNr[1]; } __packed; -struct usb_video_header_desc_all { - struct usb_video_header_desc *fix; - uByte *baInterfaceNr; -}; - /* Table 3-4: Input Terminal Descriptor */ struct usb_video_input_terminal_desc { uByte bLength;