[media] em28xx: em28xx_urb_data_copy(): move duplicate code for capture_type=0 and...
authorFrank Schaefer <fschaefer.oss@googlemail.com>
Sat, 8 Dec 2012 14:31:30 +0000 (11:31 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 22 Dec 2012 22:55:48 +0000 (20:55 -0200)
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@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/usb/em28xx/em28xx-video.c

index da59442d40a57312a113f290d724fa7604ebfd78..a1f6de0f1b3be636775a05918291884e92b9f9d1 100644 (file)
@@ -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)