V4L/DVB (11713): gspca - ov534: Don't discard the images when no UVC EOF
authorJean-Francois Moine <moinejf@free.fr>
Thu, 23 Apr 2009 16:52:27 +0000 (13:52 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 16 Jun 2009 21:20:55 +0000 (18:20 -0300)
A new image may start without any UVC EOF in the last packet of the
previous image.

Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/ov534.c

index 92ab92e..6d9b102 100644 (file)
@@ -867,18 +867,16 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, struct gspca_frame *frame,
 
                /* If PTS or FID has changed, start a new frame. */
                if (this_pts != sd->last_pts || this_fid != sd->last_fid) {
-                       gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
-                                       NULL, 0);
+                       if (gspca_dev->last_packet_type == INTER_PACKET)
+                               frame = gspca_frame_add(gspca_dev,
+                                                       LAST_PACKET, frame,
+                                                       NULL, 0);
                        sd->last_pts = this_pts;
                        sd->last_fid = this_fid;
-               }
-
-               /* Add the data from this payload */
-               gspca_frame_add(gspca_dev, INTER_PACKET, frame,
+                       gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
                                        data + 12, len - 12);
-
                /* If this packet is marked as EOF, end the frame */
-               if (data[1] & UVC_STREAM_EOF) {
+               } else if (data[1] & UVC_STREAM_EOF) {
                        sd->last_pts = 0;
 
                        if (frame->data_end - frame->data !=
@@ -886,11 +884,16 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, struct gspca_frame *frame,
                                PDEBUG(D_PACK, "short frame");
                                goto discard;
                        }
-
                        frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame,
-                                               NULL, 0);
+                                               data + 12, len - 12);
+               } else {
+
+                       /* Add the data from this payload */
+                       gspca_frame_add(gspca_dev, INTER_PACKET, frame,
+                                               data + 12, len - 12);
                }
 
+
                /* Done this payload */
                goto scan_next;