if (dma_q->pos + len > buf->vb.size)
                len = buf->vb.size - dma_q->pos;
 
-       if (p[0] != 0x88 && p[0] != 0x22) {
-               em28xx_isocdbg("frame is not complete\n");
-               len += 4;
-       } else
-               p += 4;
-
        startread = p;
        remain = len;
 
        if (dma_q->pos + len > buf->vb.size)
                len = buf->vb.size - dma_q->pos;
 
-       if ((p[0] == 0x33 && p[1] == 0x95) ||
-           (p[0] == 0x88 && p[1] == 0x88)) {
-               /* Header field, advance past it */
-               p += 4;
-       } else {
-               len += 4;
-       }
-
        startread = p;
 
        startwrite = outp + dma_q->pos;
 
                        dma_q->pos = 0;
                }
-               if (buf != NULL)
+               if (buf != NULL) {
+                       if (p[0] != 0x88 && p[0] != 0x22) {
+                               em28xx_isocdbg("frame is not complete\n");
+                               len += 4;
+                       } else {
+                               p += 4;
+                       }
                        em28xx_copy_video(dev, dma_q, buf, p, outp, len);
+               }
        }
        return rc;
 }
                                continue;
                }
 
-               len = urb->iso_frame_desc[i].actual_length - 4;
-
+               len = urb->iso_frame_desc[i].actual_length;
                if (urb->iso_frame_desc[i].actual_length <= 0) {
                        /* em28xx_isocdbg("packet %d is empty",i); - spammy */
                        continue;
                        dev->vbi_read = 0;
                        em28xx_isocdbg("VBI START HEADER!!!\n");
                        dev->cur_field = p[2];
+                       p += 4;
+                       len -= 4;
+               } else if (p[0] == 0x88 && p[1] == 0x88 &&
+                          p[2] == 0x88 && p[3] == 0x88) {
+                       /* continuation */
+                       p += 4;
+                       len -= 4;
+               } else if (p[0] == 0x22 && p[1] == 0x5a) {
+                       /* start video */
+                       p += 4;
+                       len -= 4;
                }
 
                vbi_size = dev->vbi_width * dev->vbi_height;
 
                if (dev->capture_type == 1) {
                        dev->capture_type = 2;
-                       em28xx_isocdbg("Video frame %d, length=%i, %s\n", p[2],
-                                      len, (p[2] & 1) ? "odd" : "even");
-
                        if (dev->progressive || !(dev->cur_field & 1)) {
                                if (buf != NULL)
                                        buffer_filled(dev, dma_q, buf);
 
                        dma_q->pos = 0;
                }
-               if (buf != NULL && dev->capture_type == 2)
-                       em28xx_copy_video(dev, dma_q, buf, p, outp, len);
+
+               if (buf != NULL && dev->capture_type == 2) {
+                       if (len > 4 && p[0] == 0x88 && p[1] == 0x88 &&
+                           p[2] == 0x88 && p[3] == 0x88) {
+                               p += 4;
+                               len -= 4;
+                       }
+                       if (len > 4 && p[0] == 0x22 && p[1] == 0x5a) {
+                               em28xx_isocdbg("Video frame %d, len=%i, %s\n",
+                                              p[2], len, (p[2] & 1) ?
+                                              "odd" : "even");
+                               p += 4;
+                               len -= 4;
+                       }
+
+                       if (len > 0)
+                               em28xx_copy_video(dev, dma_q, buf, p, outp,
+                                                 len);
+               }
        }
        return rc;
 }