|
@@ -203,12 +203,6 @@ static void em28xx_copy_video(struct em28xx *dev,
|
|
if (dma_q->pos + len > buf->vb.size)
|
|
if (dma_q->pos + len > buf->vb.size)
|
|
len = buf->vb.size - dma_q->pos;
|
|
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;
|
|
startread = p;
|
|
remain = len;
|
|
remain = len;
|
|
|
|
|
|
@@ -309,14 +303,6 @@ static void em28xx_copy_vbi(struct em28xx *dev,
|
|
if (dma_q->pos + len > buf->vb.size)
|
|
if (dma_q->pos + len > buf->vb.size)
|
|
len = buf->vb.size - dma_q->pos;
|
|
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;
|
|
startread = p;
|
|
|
|
|
|
startwrite = outp + dma_q->pos;
|
|
startwrite = outp + dma_q->pos;
|
|
@@ -507,8 +493,15 @@ static inline int em28xx_isoc_copy(struct em28xx *dev, struct urb *urb)
|
|
|
|
|
|
dma_q->pos = 0;
|
|
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);
|
|
em28xx_copy_video(dev, dma_q, buf, p, outp, len);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
@@ -555,8 +548,7 @@ static inline int em28xx_isoc_copy_vbi(struct em28xx *dev, struct urb *urb)
|
|
continue;
|
|
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) {
|
|
if (urb->iso_frame_desc[i].actual_length <= 0) {
|
|
/* em28xx_isocdbg("packet %d is empty",i); - spammy */
|
|
/* em28xx_isocdbg("packet %d is empty",i); - spammy */
|
|
continue;
|
|
continue;
|
|
@@ -577,6 +569,17 @@ static inline int em28xx_isoc_copy_vbi(struct em28xx *dev, struct urb *urb)
|
|
dev->vbi_read = 0;
|
|
dev->vbi_read = 0;
|
|
em28xx_isocdbg("VBI START HEADER!!!\n");
|
|
em28xx_isocdbg("VBI START HEADER!!!\n");
|
|
dev->cur_field = p[2];
|
|
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;
|
|
vbi_size = dev->vbi_width * dev->vbi_height;
|
|
@@ -631,9 +634,6 @@ static inline int em28xx_isoc_copy_vbi(struct em28xx *dev, struct urb *urb)
|
|
|
|
|
|
if (dev->capture_type == 1) {
|
|
if (dev->capture_type == 1) {
|
|
dev->capture_type = 2;
|
|
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 (dev->progressive || !(dev->cur_field & 1)) {
|
|
if (buf != NULL)
|
|
if (buf != NULL)
|
|
buffer_filled(dev, dma_q, buf);
|
|
buffer_filled(dev, dma_q, buf);
|
|
@@ -652,8 +652,25 @@ static inline int em28xx_isoc_copy_vbi(struct em28xx *dev, struct urb *urb)
|
|
|
|
|
|
dma_q->pos = 0;
|
|
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;
|
|
return rc;
|
|
}
|
|
}
|