[PATCH 7/9] em28xx: em28xx_urb_data_copy(): move duplicate code for capture_type=0 and capture_type=2 to a function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Reduce code duplication by moving the duplicate code for dev->capture_type=0
(vbi start) and dev->capture_type=2 (video start) to a function.
The same function will also be called by the (not yet existing) em25xx frame
data processing code.

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

diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c
index 60df756..61c7321 100644
--- a/drivers/media/usb/em28xx/em28xx-video.c
+++ b/drivers/media/usb/em28xx/em28xx-video.c
@@ -358,6 +358,27 @@ static inline struct em28xx_buffer *get_next_buf(struct em28xx *dev,
 	return buf;
 }
 
+/*
+ * Finish the current buffer if completed and prepare for the next field
+ */
+static struct em28xx_buffer *
+finish_field_prepare_next(struct em28xx *dev,
+			  struct em28xx_buffer *buf,
+			  struct em28xx_dmaqueue *dma_q)
+{
+	if (dev->progressive || dev->top_field) { /* Brand new frame */
+		if (buf != NULL)
+			finish_buffer(dev, buf);
+		buf = get_next_buf(dev, dma_q);
+	}
+	if (buf != NULL) {
+		buf->top_field = dev->top_field;
+		buf->pos = 0;
+	}
+
+	return buf;
+}
+
 /* Processes and copies the URB data content (video and VBI data) */
 static inline int em28xx_urb_data_copy(struct em28xx *dev, struct urb *urb)
 {
@@ -448,17 +469,9 @@ static inline int em28xx_urb_data_copy(struct em28xx *dev, struct urb *urb)
 		 * have no continuation header */
 
 		if (dev->capture_type == 0) {
+			vbi_buf = finish_field_prepare_next(dev, vbi_buf, vbi_dma_q);
+			dev->usb_ctl.vbi_buf = vbi_buf;
 			dev->capture_type = 1;
-			if (dev->top_field) { /* Brand new frame */
-				if (vbi_buf != NULL)
-					finish_buffer(dev, vbi_buf);
-				vbi_buf = get_next_buf(dev, vbi_dma_q);
-				dev->usb_ctl.vbi_buf = vbi_buf;
-			}
-			if (vbi_buf != NULL) {
-				vbi_buf->top_field = dev->top_field;
-				vbi_buf->pos = 0;
-			}
 		}
 
 		if (dev->capture_type == 1) {
@@ -480,17 +493,9 @@ static inline int em28xx_urb_data_copy(struct em28xx *dev, struct urb *urb)
 		}
 
 		if (dev->capture_type == 2) {
+			buf = finish_field_prepare_next(dev, buf, dma_q);
+			dev->usb_ctl.vid_buf = buf;
 			dev->capture_type = 3;
-			if (dev->progressive || dev->top_field) {
-				if (buf != NULL)
-					finish_buffer(dev, buf);
-				buf = get_next_buf(dev, dma_q);
-				dev->usb_ctl.vid_buf = buf;
-			}
-			if (buf != NULL) {
-				buf->top_field = dev->top_field;
-				buf->pos = 0;
-			}
 		}
 
 		if (buf != NULL && dev->capture_type == 3 && len > 0)
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux