提交 8559e8da 编写于 作者: J Jean-Francois Moine 提交者: Mauro Carvalho Chehab

V4L/DVB (8666): gspca: Bad scanning of frames in pac7311.

The previous change in packet scanning did not work,
Also, autogain was no more treated at interrupt level.
Signed-off-by: NJean-Francois Moine <moinejf@free.fr>
Signed-off-by: NMauro Carvalho Chehab <mchehab@infradead.org>
上级 9d5c1251
...@@ -702,8 +702,16 @@ static void do_autogain(struct gspca_dev *gspca_dev) ...@@ -702,8 +702,16 @@ static void do_autogain(struct gspca_dev *gspca_dev)
static void put_jpeg_head(struct gspca_dev *gspca_dev, static void put_jpeg_head(struct gspca_dev *gspca_dev,
struct gspca_frame *frame) struct gspca_frame *frame)
{ {
struct sd *sd = (struct sd *) gspca_dev;
unsigned char tmpbuf[4]; unsigned char tmpbuf[4];
if (sd->ag_cnt >= 0) {
if (--sd->ag_cnt < 0) {
sd->ag_cnt = AG_CNT_START;
atomic_set(&sd->avg_lum, sd->lum_sum / AG_CNT_START);
atomic_set(&sd->do_gain, 1);
}
}
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
(__u8 *) pac7311_jpeg_header, (__u8 *) pac7311_jpeg_header,
12); 12);
...@@ -727,7 +735,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -727,7 +735,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
int i; int i;
#define INTER_FRAME 0x53 #define INTER_FRAME 0x53 /* eof + inter frame + sof */
#define LUM_OFFSET 0x1e /* reverse offset / start of frame */ #define LUM_OFFSET 0x1e /* reverse offset / start of frame */
/* /*
...@@ -746,11 +754,18 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -746,11 +754,18 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
if (sd->tosof == 0) { /* if inside a frame */ if (sd->tosof == 0) { /* if inside a frame */
/* check for 'ff ff ff xx' at start and at end of packet */ /* check for 'ff ff ff xx' at start and at end of packet */
/* (len is always >= 3) */ /* (len is always >= 3 and xx never ff) */
switch (sd->ffnb) { switch (sd->ffnb) {
case 1: case 1:
if (data[0] != 0xff) if (data[0] != 0xff) { /* can be '00' only */
__u8 ff;
sd->ffnb = 0;
ff = 0xff;
gspca_frame_add(gspca_dev, INTER_PACKET,
frame, &ff, 1);
break; /* keep 'ff 00' */ break; /* keep 'ff 00' */
}
/* fall thru */ /* fall thru */
case 2: case 2:
case 3: case 3:
...@@ -775,16 +790,13 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -775,16 +790,13 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
} }
} else { /* outside a frame */ } else { /* outside a frame */
/* /* get the luminosity and go to the start of frame */
* get the luminosity
* and go to the start of frame
*/
data += sd->tosof; data += sd->tosof;
len -= sd->tosof; len -= sd->tosof;
if (sd->tosof > LUM_OFFSET) if (sd->tosof > LUM_OFFSET)
sd->lum_sum += data[-LUM_OFFSET]; sd->lum_sum += data[-LUM_OFFSET];
put_jpeg_head(gspca_dev, frame);
sd->tosof = 0; sd->tosof = 0;
put_jpeg_head(gspca_dev, frame);
} }
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
...@@ -792,10 +804,9 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -792,10 +804,9 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
continue; continue;
switch (data[i + 1]) { switch (data[i + 1]) {
case 0xd9: /* end of frame */ case 0xd9: /* end of frame */
i += 2;
frame = gspca_frame_add(gspca_dev, frame = gspca_frame_add(gspca_dev,
LAST_PACKET, LAST_PACKET,
frame, data, i); frame, data, i + 2);
data += i + INTER_FRAME; data += i + INTER_FRAME;
len -= i + INTER_FRAME; len -= i + INTER_FRAME;
i = 0; i = 0;
...@@ -816,6 +827,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -816,6 +827,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
break; break;
} }
} }
gspca_frame_add(gspca_dev, INTER_PACKET,
frame, data, i);
} }
static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册