[media] gspca - sn9c20x: Fix loss of frame start
authorJean-François Moine <moinejf@free.fr>
Mon, 19 Mar 2012 07:22:44 +0000 (04:22 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 20 Mar 2012 01:27:27 +0000 (22:27 -0300)
The frame header was checked on packets of size 64 bytes only, while the webcams
may put a frame header at the beginning of bigger packets.

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

index 9e198b45c3c804e11471ccff215c69471fa825ed..e54bf54b3901075cc82960776366d3c81a7ed856 100644 (file)
@@ -2457,7 +2457,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
        int avg_lum;
        static u8 frame_header[] =
                {0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96};
-       if (len == 64 && memcmp(data, frame_header, 6) == 0) {
+       if (len >= 64 && memcmp(data, frame_header, 6) == 0) {
                avg_lum = ((data[35] >> 2) & 3) |
                           (data[20] << 2) |
                           (data[19] << 10);
@@ -2485,7 +2485,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
                avg_lum >>= 9;
                atomic_set(&sd->avg_lum, avg_lum);
                gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
-               return;
+               len -= 64;
+               if (len == 0)
+                       return;
+               data += 64;
        }
        if (gspca_dev->last_packet_type == LAST_PACKET) {
                if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv