public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/6] em28xx: use common urb data copying function for vbi and non-vbi data streams
@ 2012-11-25 10:37 Frank Schäfer
  2012-11-25 10:37 ` [PATCH 1/6] em28xx: fix video data start position calculation in em28xx_urb_data_copy_vbi() Frank Schäfer
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Frank Schäfer @ 2012-11-25 10:37 UTC (permalink / raw)
  To: mchehab; +Cc: linux-media, Frank Schäfer

Patches 1-5 prepare function em28xx_urb_data_copy_vbi() to also work with non-vbi video data.
Patch 6 finally renames em28xx_urb_data_copy_vbi() and changes to code to use this function for both, vbi and non-vbi video data streams.

The changes have been tested with the following devices:
- "SilverCrest 1.3 MPix webcam" (progressive, non-vbi)
- "Hauppauge HVR-900 (65008/A1C0)" (interlaced, vbi enabled and disabled)

This series applies on top of my previous patch series "em28xx: add support fur USB bulk transfers" V2.



Frank Schäfer (6):
  em28xx: fix video data start position calculation in
    em28xx_urb_data_copy_vbi()
  em28xx: make sure the packet size is >= 4 before checking for headers
    in em28xx_urb_data_copy_vbi()
  em28xx: fix capture type setting in em28xx_urb_data_copy_vbi()
  em28xx: fix/improve frame field handling in
    em28xx_urb_data_copy_vbi()
  em28xx: em28xx_urb_data_copy_vbi(): calculate vbi_size only if needed
  em28xx: use common urb data copying function for vbi and non-vbi data
    streams

 drivers/media/usb/em28xx/em28xx-video.c |  224 ++++++-------------------------
 drivers/media/usb/em28xx/em28xx.h       |    4 +-
 2 Dateien geändert, 46 Zeilen hinzugefügt(+), 182 Zeilen entfernt(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/6] em28xx: fix video data start position calculation in em28xx_urb_data_copy_vbi()
  2012-11-25 10:37 [PATCH 0/6] em28xx: use common urb data copying function for vbi and non-vbi data streams Frank Schäfer
@ 2012-11-25 10:37 ` Frank Schäfer
  2012-11-25 10:37 ` [PATCH 2/6] em28xx: make sure the packet size is >= 4 before checking for headers " Frank Schäfer
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Frank Schäfer @ 2012-11-25 10:37 UTC (permalink / raw)
  To: mchehab; +Cc: linux-media, Frank Schäfer

The header check/removal code at the end of function em28xx_urb_data_copy_vbi()
is obsolete, because this is already done earlier in this function.
In fact it is incomplete (doesn't check for vbi header) and causes trouble
when the first data bytes are the same as header bytes (which is fortunately
very unlikely).

Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
---
 drivers/media/usb/em28xx/em28xx-video.c |   20 ++------------------
 1 Datei geändert, 2 Zeilen hinzugefügt(+), 18 Zeilen entfernt(-)

diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c
index 4ec54fd..7994d17 100644
--- a/drivers/media/usb/em28xx/em28xx-video.c
+++ b/drivers/media/usb/em28xx/em28xx-video.c
@@ -678,24 +678,8 @@ static inline int em28xx_urb_data_copy_vbi(struct em28xx *dev, struct urb *urb)
 			dma_q->pos = 0;
 		}
 
-		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_usbdbg("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);
-		}
+		if (buf != NULL && dev->capture_type == 2 && len > 0)
+			em28xx_copy_video(dev, dma_q, buf, p, outp, len);
 	}
 	return rc;
 }
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/6] em28xx: make sure the packet size is >= 4 before checking for headers in em28xx_urb_data_copy_vbi()
  2012-11-25 10:37 [PATCH 0/6] em28xx: use common urb data copying function for vbi and non-vbi data streams Frank Schäfer
  2012-11-25 10:37 ` [PATCH 1/6] em28xx: fix video data start position calculation in em28xx_urb_data_copy_vbi() Frank Schäfer
@ 2012-11-25 10:37 ` Frank Schäfer
  2012-11-25 10:37 ` [PATCH 3/6] em28xx: fix capture type setting " Frank Schäfer
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Frank Schäfer @ 2012-11-25 10:37 UTC (permalink / raw)
  To: mchehab; +Cc: linux-media, Frank Schäfer

Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
---
 drivers/media/usb/em28xx/em28xx-video.c |   45 ++++++++++++++++---------------
 1 Datei geändert, 24 Zeilen hinzugefügt(+), 21 Zeilen entfernt(-)

diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c
index 7994d17..0bbc6dc 100644
--- a/drivers/media/usb/em28xx/em28xx-video.c
+++ b/drivers/media/usb/em28xx/em28xx-video.c
@@ -576,7 +576,7 @@ static inline int em28xx_urb_data_copy_vbi(struct em28xx *dev, struct urb *urb)
 			    urb->iso_frame_desc[i].offset;
 		}
 
-		if (actual_length <= 0) {
+		if (actual_length == 0) {
 			/* NOTE: happens very often with isoc transfers */
 			/* em28xx_usbdbg("packet %d is empty",i); - spammy */
 			continue;
@@ -585,27 +585,30 @@ static inline int em28xx_urb_data_copy_vbi(struct em28xx *dev, struct urb *urb)
 		/* capture type 0 = vbi start
 		   capture type 1 = video start
 		   capture type 2 = video in progress */
-		if (p[0] == 0x33 && p[1] == 0x95) {
-			dev->capture_type = 0;
-			dev->vbi_read = 0;
-			em28xx_usbdbg("VBI START HEADER!!!\n");
-			dev->cur_field = p[2];
-			p += 4;
-			len = actual_length - 4;
-		} else if (p[0] == 0x88 && p[1] == 0x88 &&
-			   p[2] == 0x88 && p[3] == 0x88) {
-			/* continuation */
-			p += 4;
-			len = actual_length - 4;
-		} else if (p[0] == 0x22 && p[1] == 0x5a) {
-			/* start video */
-			p += 4;
-			len = actual_length - 4;
-		} else {
-			/* NOTE: With bulk transfers, intermediate data packets
-			 * have no continuation header */
-			len = actual_length;
+		len = actual_length;
+		if (len >= 4) {
+			/* NOTE: headers are always 4 bytes and
+			 * never split across packets */
+			if (p[0] == 0x33 && p[1] == 0x95) {
+				dev->capture_type = 0;
+				dev->vbi_read = 0;
+				em28xx_usbdbg("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;
+			}
 		}
+		/* NOTE: with bulk transfers, intermediate data packets
+		 * have no continuation header */
 
 		vbi_size = dev->vbi_width * dev->vbi_height;
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/6] em28xx: fix capture type setting in em28xx_urb_data_copy_vbi()
  2012-11-25 10:37 [PATCH 0/6] em28xx: use common urb data copying function for vbi and non-vbi data streams Frank Schäfer
  2012-11-25 10:37 ` [PATCH 1/6] em28xx: fix video data start position calculation in em28xx_urb_data_copy_vbi() Frank Schäfer
  2012-11-25 10:37 ` [PATCH 2/6] em28xx: make sure the packet size is >= 4 before checking for headers " Frank Schäfer
@ 2012-11-25 10:37 ` Frank Schäfer
  2012-11-25 10:37 ` [PATCH 4/6] em28xx: fix/improve frame field handling " Frank Schäfer
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Frank Schäfer @ 2012-11-25 10:37 UTC (permalink / raw)
  To: mchehab; +Cc: linux-media, Frank Schäfer

Set capture type to 1 (video start) when the video frame start header is
detected. This bug didn't cause any trouble, because this type of header is
never received in vbi mode.
Fix it, because we want to use this function with disabled vbi in the future.
Also start with capture type -1 to avoid processing of corrupted/incomplete
frame data which is usually received at streaming start (especially when
USB bulk transfers are used).

Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
---
 drivers/media/usb/em28xx/em28xx-video.c |    2 ++
 1 Datei geändert, 2 Zeilen hinzugefügt(+)

diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c
index 0bbc6dc..b170476 100644
--- a/drivers/media/usb/em28xx/em28xx-video.c
+++ b/drivers/media/usb/em28xx/em28xx-video.c
@@ -603,6 +603,7 @@ static inline int em28xx_urb_data_copy_vbi(struct em28xx *dev, struct urb *urb)
 				len -= 4;
 			} else if (p[0] == 0x22 && p[1] == 0x5a) {
 				/* start video */
+				dev->capture_type = 1;
 				p += 4;
 				len -= 4;
 			}
@@ -774,6 +775,7 @@ buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
 		urb_init = 1;
 
 	if (urb_init) {
+		dev->capture_type = -1;
 		if (em28xx_vbi_supported(dev) == 1)
 			rc = em28xx_init_usb_xfer(dev, EM28XX_ANALOG_MODE,
 						  dev->analog_xfer_bulk,
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 4/6] em28xx: fix/improve frame field handling in em28xx_urb_data_copy_vbi()
  2012-11-25 10:37 [PATCH 0/6] em28xx: use common urb data copying function for vbi and non-vbi data streams Frank Schäfer
                   ` (2 preceding siblings ...)
  2012-11-25 10:37 ` [PATCH 3/6] em28xx: fix capture type setting " Frank Schäfer
@ 2012-11-25 10:37 ` Frank Schäfer
  2012-11-25 10:37 ` [PATCH 5/6] em28xx: em28xx_urb_data_copy_vbi(): calculate vbi_size only if needed Frank Schäfer
  2012-11-25 10:37 ` [PATCH 6/6] em28xx: use common urb data copying function for vbi and non-vbi data streams Frank Schäfer
  5 siblings, 0 replies; 7+ messages in thread
From: Frank Schäfer @ 2012-11-25 10:37 UTC (permalink / raw)
  To: mchehab; +Cc: linux-media, Frank Schäfer

The current code doesn't set the frame field when a normal video header is
received. This bug didn't cause any trouble, because this type of header is
never received in vbi mode.
Fix it, because we want to use this function with disabled vbi in the future.
Also simplifiy the code.

Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
---
 drivers/media/usb/em28xx/em28xx-video.c |   24 ++++++++----------------
 drivers/media/usb/em28xx/em28xx.h       |    2 +-
 2 Dateien geändert, 9 Zeilen hinzugefügt(+), 17 Zeilen entfernt(-)

diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c
index b170476..12e4b0a 100644
--- a/drivers/media/usb/em28xx/em28xx-video.c
+++ b/drivers/media/usb/em28xx/em28xx-video.c
@@ -593,7 +593,7 @@ static inline int em28xx_urb_data_copy_vbi(struct em28xx *dev, struct urb *urb)
 				dev->capture_type = 0;
 				dev->vbi_read = 0;
 				em28xx_usbdbg("VBI START HEADER!!!\n");
-				dev->cur_field = p[2];
+				dev->top_field = !(p[2] & 1);
 				p += 4;
 				len -= 4;
 			} else if (p[0] == 0x88 && p[1] == 0x88 &&
@@ -604,6 +604,7 @@ static inline int em28xx_urb_data_copy_vbi(struct em28xx *dev, struct urb *urb)
 			} else if (p[0] == 0x22 && p[1] == 0x5a) {
 				/* start video */
 				dev->capture_type = 1;
+				dev->top_field = !(p[2] & 1);
 				p += 4;
 				len -= 4;
 			}
@@ -620,8 +621,7 @@ static inline int em28xx_urb_data_copy_vbi(struct em28xx *dev, struct urb *urb)
 				em28xx_usbdbg("dev->vbi_read > vbi_size\n");
 			} else if ((dev->vbi_read + len) < vbi_size) {
 				/* This entire frame is VBI data */
-				if (dev->vbi_read == 0 &&
-				    (!(dev->cur_field & 1))) {
+				if (dev->vbi_read == 0 && dev->top_field) {
 					/* Brand new frame */
 					if (vbi_buf != NULL)
 						vbi_buffer_filled(dev,
@@ -637,12 +637,8 @@ static inline int em28xx_urb_data_copy_vbi(struct em28xx *dev, struct urb *urb)
 
 				if (dev->vbi_read == 0) {
 					vbi_dma_q->pos = 0;
-					if (vbi_buf != NULL) {
-						if (dev->cur_field & 1)
-							vbi_buf->top_field = 0;
-						else
-							vbi_buf->top_field = 1;
-					}
+					if (vbi_buf != NULL)
+						vbi_buf->top_field = dev->top_field;
 				}
 
 				dev->vbi_read += len;
@@ -663,7 +659,7 @@ static inline int em28xx_urb_data_copy_vbi(struct em28xx *dev, struct urb *urb)
 
 		if (dev->capture_type == 1) {
 			dev->capture_type = 2;
-			if (dev->progressive || !(dev->cur_field & 1)) {
+			if (dev->progressive || dev->top_field) {
 				if (buf != NULL)
 					buffer_filled(dev, dma_q, buf);
 				get_next_buf(dma_q, &buf);
@@ -672,12 +668,8 @@ static inline int em28xx_urb_data_copy_vbi(struct em28xx *dev, struct urb *urb)
 				else
 					outp = videobuf_to_vmalloc(&buf->vb);
 			}
-			if (buf != NULL) {
-				if (dev->cur_field & 1)
-					buf->top_field = 0;
-				else
-					buf->top_field = 1;
-			}
+			if (buf != NULL)
+				buf->top_field = dev->top_field;
 
 			dma_q->pos = 0;
 		}
diff --git a/drivers/media/usb/em28xx/em28xx.h b/drivers/media/usb/em28xx/em28xx.h
index aa413bd..09df56a 100644
--- a/drivers/media/usb/em28xx/em28xx.h
+++ b/drivers/media/usb/em28xx/em28xx.h
@@ -563,7 +563,7 @@ struct em28xx {
 	/* vbi related state tracking */
 	int capture_type;
 	int vbi_read;
-	unsigned char cur_field;
+	unsigned char top_field:1;
 	unsigned int vbi_width;
 	unsigned int vbi_height; /* lines per field */
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 5/6] em28xx: em28xx_urb_data_copy_vbi(): calculate vbi_size only if needed
  2012-11-25 10:37 [PATCH 0/6] em28xx: use common urb data copying function for vbi and non-vbi data streams Frank Schäfer
                   ` (3 preceding siblings ...)
  2012-11-25 10:37 ` [PATCH 4/6] em28xx: fix/improve frame field handling " Frank Schäfer
@ 2012-11-25 10:37 ` Frank Schäfer
  2012-11-25 10:37 ` [PATCH 6/6] em28xx: use common urb data copying function for vbi and non-vbi data streams Frank Schäfer
  5 siblings, 0 replies; 7+ messages in thread
From: Frank Schäfer @ 2012-11-25 10:37 UTC (permalink / raw)
  To: mchehab; +Cc: linux-media, Frank Schäfer

Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
---
 drivers/media/usb/em28xx/em28xx-video.c |    5 ++---
 1 Datei geändert, 2 Zeilen hinzugefügt(+), 3 Zeilen entfernt(-)

diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c
index 12e4b0a..6843784 100644
--- a/drivers/media/usb/em28xx/em28xx-video.c
+++ b/drivers/media/usb/em28xx/em28xx-video.c
@@ -525,7 +525,7 @@ static inline int em28xx_urb_data_copy_vbi(struct em28xx *dev, struct urb *urb)
 	struct em28xx_buffer    *buf, *vbi_buf;
 	struct em28xx_dmaqueue  *dma_q = &dev->vidq;
 	struct em28xx_dmaqueue  *vbi_dma_q = &dev->vbiq;
-	int xfer_bulk, vbi_size, num_packets, i, rc = 1;
+	int xfer_bulk, num_packets, i, rc = 1;
 	unsigned int actual_length, len = 0;
 	unsigned char *p, *outp = NULL, *vbioutp = NULL;
 
@@ -612,9 +612,8 @@ static inline int em28xx_urb_data_copy_vbi(struct em28xx *dev, struct urb *urb)
 		/* NOTE: with bulk transfers, intermediate data packets
 		 * have no continuation header */
 
-		vbi_size = dev->vbi_width * dev->vbi_height;
-
 		if (dev->capture_type == 0) {
+			int vbi_size = dev->vbi_width * dev->vbi_height;
 			if (dev->vbi_read >= vbi_size) {
 				/* We've already read all the VBI data, so
 				   treat the rest as video */
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 6/6] em28xx: use common urb data copying function for vbi and non-vbi data streams
  2012-11-25 10:37 [PATCH 0/6] em28xx: use common urb data copying function for vbi and non-vbi data streams Frank Schäfer
                   ` (4 preceding siblings ...)
  2012-11-25 10:37 ` [PATCH 5/6] em28xx: em28xx_urb_data_copy_vbi(): calculate vbi_size only if needed Frank Schäfer
@ 2012-11-25 10:37 ` Frank Schäfer
  5 siblings, 0 replies; 7+ messages in thread
From: Frank Schäfer @ 2012-11-25 10:37 UTC (permalink / raw)
  To: mchehab; +Cc: linux-media, Frank Schäfer

em28xx_urb_data_copy_vbi() is actually an extended version of
em28xx_urb_data_copy(). With the preceding fixes and improvements, it works
fine with both, vbi and non-vbi data streams without performance impacts.

So rename em28xx_urb_data_copy_vbi() to em28xx_urb_data_copy(), delete the
the old implementation of em28xx_urb_data_copy() and change the code to use
this function for both data stream types.

Tested with "SilverCrest 1.3 MPix webcam" (progressive, non-vbi) and
"Hauppauge HVR-900 (65008/A1C0)" (interlaced, vbi enabled and disabled).

Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
---
 drivers/media/usb/em28xx/em28xx-video.c |  130 ++-----------------------------
 drivers/media/usb/em28xx/em28xx.h       |    4 +-
 2 Dateien geändert, 9 Zeilen hinzugefügt(+), 125 Zeilen entfernt(-)

diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c
index 6843784..6282d48 100644
--- a/drivers/media/usb/em28xx/em28xx-video.c
+++ b/drivers/media/usb/em28xx/em28xx-video.c
@@ -178,7 +178,6 @@ static inline void vbi_buffer_filled(struct em28xx *dev,
 {
 	/* Advice that buffer was filled */
 	em28xx_usbdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
-
 	buf->vb.state = VIDEOBUF_DONE;
 	buf->vb.field_count++;
 	do_gettimeofday(&buf->vb.ts);
@@ -376,7 +375,6 @@ static inline void get_next_buf(struct em28xx_dmaqueue *dma_q,
 
 	/* Get the next buffer */
 	*buf = list_entry(dma_q->active.next, struct em28xx_buffer, vb.queue);
-
 	/* Cleans up buffer - Useful for testing for frame/URB loss */
 	outp = videobuf_to_vmalloc(&(*buf)->vb);
 	memset(outp, 0, (*buf)->vb.size);
@@ -413,115 +411,9 @@ static inline void vbi_get_next_buf(struct em28xx_dmaqueue *dma_q,
 	return;
 }
 
-/* Processes and copies the URB data content to a frame buffer queue */
+/* Processes and copies the URB data content (video and VBI data) */
 static inline int em28xx_urb_data_copy(struct em28xx *dev, struct urb *urb)
 {
-	struct em28xx_buffer    *buf;
-	struct em28xx_dmaqueue  *dma_q = &dev->vidq;
-	int xfer_bulk, num_packets, i, rc = 1;
-	unsigned int actual_length, len = 0;
-	unsigned char *p, *outp = NULL;
-
-	if (!dev)
-		return 0;
-
-	if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED))
-		return 0;
-
-	if (urb->status < 0)
-		print_err_status(dev, -1, urb->status);
-
-	xfer_bulk = usb_pipebulk(urb->pipe);
-
-	buf = dev->usb_ctl.vid_buf;
-	if (buf != NULL)
-		outp = videobuf_to_vmalloc(&buf->vb);
-
-	if (xfer_bulk) /* bulk */
-		num_packets = 1;
-	else /* isoc */
-		num_packets = urb->number_of_packets;
-
-	for (i = 0; i < num_packets; i++) {
-		if (xfer_bulk) { /* bulk */
-			actual_length = urb->actual_length;
-
-			p = urb->transfer_buffer;
-		} else { /* isoc */
-			if (urb->iso_frame_desc[i].status < 0) {
-				print_err_status(dev, i,
-						 urb->iso_frame_desc[i].status);
-				if (urb->iso_frame_desc[i].status != -EPROTO)
-					continue;
-			}
-
-			actual_length = urb->iso_frame_desc[i].actual_length;
-			if (actual_length > dev->max_pkt_size) {
-				em28xx_usbdbg("packet bigger than packet size");
-				continue;
-			}
-
-			p = urb->transfer_buffer +
-			    urb->iso_frame_desc[i].offset;
-		}
-
-		if (actual_length <= 0) {
-			/* NOTE: happens very often with isoc transfers */
-			/* em28xx_usbdbg("packet %d is empty",i); - spammy */
-			continue;
-		}
-
-		/* FIXME: incomplete buffer checks where removed to make
-		   logic simpler. Impacts of those changes should be evaluated
-		 */
-		if (p[0] == 0x33 && p[1] == 0x95 && p[2] == 0x00) {
-			em28xx_usbdbg("VBI HEADER!!!\n");
-			/* FIXME: Should add vbi copy */
-			continue;
-		}
-		if (p[0] == 0x22 && p[1] == 0x5a) {
-			em28xx_usbdbg("Video frame %d, length=%i, %s\n", p[2],
-				       len, (p[2] & 1) ? "odd" : "even");
-
-			if (dev->progressive || !(p[2] & 1)) {
-				if (buf != NULL)
-					buffer_filled(dev, dma_q, buf);
-				get_next_buf(dma_q, &buf);
-				if (buf == NULL)
-					outp = NULL;
-				else
-					outp = videobuf_to_vmalloc(&buf->vb);
-			}
-
-			if (buf != NULL) {
-				if (p[2] & 1)
-					buf->top_field = 0;
-				else
-					buf->top_field = 1;
-			}
-
-			dma_q->pos = 0;
-		}
-		if (buf != NULL) {
-			if (p[0] != 0x88 && p[0] != 0x22) {
-				/* NOTE: no intermediate data packet header
-				 * 88 88 88 88 when using bulk transfers */
-				em28xx_usbdbg("frame is not complete\n");
-				len = actual_length;
-			} else {
-				len = actual_length - 4;
-				p += 4;
-			}
-			em28xx_copy_video(dev, dma_q, buf, p, outp, len);
-		}
-	}
-	return rc;
-}
-
-/* Version of the urb data handler that takes into account a mixture of
-   video and VBI data */
-static inline int em28xx_urb_data_copy_vbi(struct em28xx *dev, struct urb *urb)
-{
 	struct em28xx_buffer    *buf, *vbi_buf;
 	struct em28xx_dmaqueue  *dma_q = &dev->vidq;
 	struct em28xx_dmaqueue  *vbi_dma_q = &dev->vbiq;
@@ -767,20 +659,12 @@ buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
 
 	if (urb_init) {
 		dev->capture_type = -1;
-		if (em28xx_vbi_supported(dev) == 1)
-			rc = em28xx_init_usb_xfer(dev, EM28XX_ANALOG_MODE,
-						  dev->analog_xfer_bulk,
-						  EM28XX_NUM_BUFS,
-						  dev->max_pkt_size,
-						  dev->packet_multiplier,
-						  em28xx_urb_data_copy_vbi);
-		else
-			rc = em28xx_init_usb_xfer(dev, EM28XX_ANALOG_MODE,
-						  dev->analog_xfer_bulk,
-						  EM28XX_NUM_BUFS,
-						  dev->max_pkt_size,
-						  dev->packet_multiplier,
-						  em28xx_urb_data_copy);
+		rc = em28xx_init_usb_xfer(dev, EM28XX_ANALOG_MODE,
+					  dev->analog_xfer_bulk,
+					  EM28XX_NUM_BUFS,
+					  dev->max_pkt_size,
+					  dev->packet_multiplier,
+					  em28xx_urb_data_copy);
 		if (rc < 0)
 			goto fail;
 	}
diff --git a/drivers/media/usb/em28xx/em28xx.h b/drivers/media/usb/em28xx/em28xx.h
index 09df56a..304896d 100644
--- a/drivers/media/usb/em28xx/em28xx.h
+++ b/drivers/media/usb/em28xx/em28xx.h
@@ -560,10 +560,10 @@ struct em28xx {
 	/* states */
 	enum em28xx_dev_state state;
 
-	/* vbi related state tracking */
+	/* capture state tracking */
 	int capture_type;
-	int vbi_read;
 	unsigned char top_field:1;
+	int vbi_read;
 	unsigned int vbi_width;
 	unsigned int vbi_height; /* lines per field */
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-11-25 10:38 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-25 10:37 [PATCH 0/6] em28xx: use common urb data copying function for vbi and non-vbi data streams Frank Schäfer
2012-11-25 10:37 ` [PATCH 1/6] em28xx: fix video data start position calculation in em28xx_urb_data_copy_vbi() Frank Schäfer
2012-11-25 10:37 ` [PATCH 2/6] em28xx: make sure the packet size is >= 4 before checking for headers " Frank Schäfer
2012-11-25 10:37 ` [PATCH 3/6] em28xx: fix capture type setting " Frank Schäfer
2012-11-25 10:37 ` [PATCH 4/6] em28xx: fix/improve frame field handling " Frank Schäfer
2012-11-25 10:37 ` [PATCH 5/6] em28xx: em28xx_urb_data_copy_vbi(): calculate vbi_size only if needed Frank Schäfer
2012-11-25 10:37 ` [PATCH 6/6] em28xx: use common urb data copying function for vbi and non-vbi data streams Frank Schäfer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox