7.uvc_parse_format
7.1 uvc格式描述符
struct uvc_format_desc { //uvc格式描述符
char *name; //uvc格式描述符名字
__u8 guid[16];//全局唯一ID
__u32 fcc; //压缩格式
};
7.2 uvc解析1个格式描述符
static int uvc_parse_format(struct uvc_device *dev,struct uvc_streaming *streaming, struct uvc_format *format,__u32 **intervals, unsigned char *buffer, int buflen)
{
struct usb_interface *intf = streaming->intf; //获取usb接口
struct usb_host_interface *alts = intf->cur_altsetting; //获取usb_host_interface
struct uvc_format_desc *fmtdesc; //uvc格式描述符
struct uvc_frame *frame; //uvc帧
const unsigned char *start = buffer;
unsigned int interval;
unsigned int i, n;
__u8 ftype;
format->type = buffer[2]; //uvc格式类型
format->index = buffer[3]; //uvc格式索引
switch (buffer[2]) { //uvc格式类型
case UVC_VS_FORMAT_UNCOMPRESSED:
case UVC_VS_FORMAT_FRAME_BASED:
n = buffer[2] == UVC_VS_FORMAT_UNCOMPRESSED ? 27 : 28; //获取描述符大小
if (buflen < n) { //检验buflen大小
uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface %d FORMAT error\n",dev->udev->devnum,alts->desc.bInterfaceNumber);
return -EINVAL;
}
/* Find the format descriptor from its GUID. */
fmtdesc = uvc_format_by_guid(&buffer[5]); //获取uvc格式描述符
if (fmtdesc != NULL) { //设置uvc格式编码格式名字
strlcpy(format->name, fmtdesc->name,sizeof format->name);
format->fcc = fmtdesc->fcc; //设置uvc格式的fcc(压缩格式)
}