diff -rupN r110/uvc_driver.c new/uvc_driver.c
--- r110/uvc_driver.c	2007-05-15 00:11:58.000000000 +0300
+++ new/uvc_driver.c	2007-06-15 15:04:25.000000000 +0300
@@ -61,6 +61,26 @@ static struct uvc_format_desc uvc_fmts[]
 		.guid		= UVC_GUID_FORMAT_NV12,
 		.fcc		= V4L2_PIX_FMT_NV12,
 	},
+	{
+		.guid		= UVC_GUID_FORMAT_MJPEG,
+		.fcc		= V4L2_PIX_FMT_MJPEG,
+	},
+	{
+		.guid		= UVC_GUID_FORMAT_YV12,
+		.fcc		= V4L2_PIX_FMT_YVU420,
+	},
+	{
+		.guid		= UVC_GUID_FORMAT_I420,
+		.fcc		= V4L2_PIX_FMT_YUV420,
+	},
+	{
+		.guid		= UVC_GUID_FORMAT_UYVY,
+		.fcc		= V4L2_PIX_FMT_UYVY,
+	},
+	{
+		.guid		= UVC_GUID_FORMAT_MPEG,
+		.fcc		= V4L2_PIX_FMT_MPEG,
+	},
 };
 
 #if 0
@@ -280,7 +300,7 @@ static int uvc_parse_format(struct uvc_d
 	struct uvc_frame *frame;
 	const unsigned char *start = buffer;
 	unsigned int interval;
-	unsigned int i, n;
+	unsigned int i, n, offset_fix;
 	__u8 ftype;
 
 	format->type = buffer[2];
@@ -361,8 +381,34 @@ static int uvc_parse_format(struct uvc_d
 		format->nframes = 1;
 		break;
 
-	case VS_FORMAT_MPEG2TS:
 	case VS_FORMAT_FRAME_BASED:
+		if (buflen < 28) {
+			uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming"
+			       "interface %d FORMAT error\n",
+			       dev->udev->devnum,
+			       alts->desc.bInterfaceNumber);
+			return -EINVAL;
+		}
+
+		strncpy(format->name, "Frame based", sizeof format->name);
+
+		/* Try all known GUIDs for the format. */
+		format->fcc = uvc_guid_to_fcc(&buffer[5]);
+		if (format->fcc == -1)
+		{
+			uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming"
+			       "interface %d unknown frame-based GUID\n",
+			       dev->udev->devnum, alts->desc.bInterfaceNumber);
+			return -EINVAL;
+		}
+
+		/* Assume variable size means compressed. */
+		format->flags = buffer[27] ? UVC_FMT_FLAG_COMPRESSED : 0;
+		format->bpp = buffer[21];
+		ftype = VS_FRAME_FRAME_BASED;
+		break;
+
+	case VS_FORMAT_MPEG2TS:
 	case VS_FORMAT_STREAM_BASED:
 		/* Not supported yet. */
 	default:
@@ -384,7 +430,12 @@ static int uvc_parse_format(struct uvc_d
 		switch (buffer[2]) {
 		case VS_FRAME_UNCOMPRESSED:
 		case VS_FRAME_MJPEG:
-			n = buflen > 25 ? buffer[25] : 0;
+		case VS_FRAME_FRAME_BASED:
+			/* The descriptors have small differences, notably the offsets
+			   of bDefaultFrameIntervand and bFrameIntervalType. */
+			offset_fix = buffer[2]==VS_FRAME_FRAME_BASED ? 4 : 0;
+
+			n = buflen > 25-offset_fix ? buffer[25-offset_fix] : 0;
 			n = n ? n : 3;
 
 			if (buflen < 26 + 4*n) {
@@ -401,8 +452,9 @@ static int uvc_parse_format(struct uvc_d
 			frame->wHeight = le16_to_cpup((__le16*)&buffer[7]);
 			frame->dwMinBitRate = le32_to_cpup((__le32*)&buffer[9]);
 			frame->dwMaxBitRate = le32_to_cpup((__le32*)&buffer[13]);
-			frame->dwMaxVideoFrameBufferSize = le32_to_cpup((__le32*)&buffer[17]);
-			frame->bFrameIntervalType = buffer[25];
+			frame->dwMaxVideoFrameBufferSize = buffer[2]==VS_FRAME_FRAME_BASED ?
+				0 : le32_to_cpup((__le32*)&buffer[17]);
+			frame->bFrameIntervalType = buffer[25-offset_fix];
 			frame->dwFrameInterval = *intervals;
 
 			/* Some bogus devices report dwMinFrameInterval equal
@@ -420,7 +472,7 @@ static int uvc_parse_format(struct uvc_d
 			 * between the boundaries.
 			 */
 			n -= frame->bFrameIntervalType ? 1 : 2;
-			interval = le32_to_cpup((__le32*)&buffer[21]);
+			interval = le32_to_cpup((__le32*)&buffer[21-offset_fix]);
 			if (interval < frame->dwFrameInterval[0])
 				interval = frame->dwFrameInterval[0];
 			else if (interval > frame->dwFrameInterval[n])
@@ -563,6 +615,7 @@ static int uvc_parse_streaming(struct uv
 		switch (_buffer[2]) {
 		case VS_FORMAT_UNCOMPRESSED:
 		case VS_FORMAT_MJPEG:
+		case VS_FORMAT_FRAME_BASED:
 			nformats++;
 			break;
 
@@ -576,7 +629,6 @@ static int uvc_parse_streaming(struct uv
 			break;
 
 		case VS_FORMAT_MPEG2TS:
-		case VS_FORMAT_FRAME_BASED:
 		case VS_FORMAT_STREAM_BASED:
 			uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming "
 				"interface %d FORMAT %u is not supported.\n",
@@ -627,6 +679,7 @@ static int uvc_parse_streaming(struct uv
 		case VS_FORMAT_UNCOMPRESSED:
 		case VS_FORMAT_MJPEG:
 		case VS_FORMAT_DV:
+		case VS_FORMAT_FRAME_BASED:
 			format->frame = frame;
 			ret = uvc_parse_format(dev, streaming, format,
 				&interval, buffer, buflen);
diff -rupN r110/uvcvideo.h new/uvcvideo.h
--- r110/uvcvideo.h	2007-05-21 23:06:26.000000000 +0300
+++ new/uvcvideo.h	2007-06-15 15:04:32.000000000 +0300
@@ -218,6 +218,14 @@
 				 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 #define UVC_GUID_FORMAT_NV12	{0x4e, 0x56, 0x31, 0x32, 0x00, 0x00, 0x10, 0x00, \
 				 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
+#define UVC_GUID_FORMAT_YV12	{ 'Y',  'V',  '1',  '2', 0x00, 0x00, 0x10, 0x00, \
+				 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
+#define UVC_GUID_FORMAT_I420	{ 'I',  '4',  '2',  '0', 0x00, 0x00, 0x10, 0x00, \
+				 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
+#define UVC_GUID_FORMAT_UYVY	{ 'U',  'Y',  'V',  'Y', 0x00, 0x00, 0x10, 0x00, \
+				 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
+#define UVC_GUID_FORMAT_MPEG	{ 'M',  'P',  'E',  'G', 0x00, 0x00, 0x10, 0x00, \
+				 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
 
 
 /* ------------------------------------------------------------------------
