diff options
author | Jean-Francois Moine <moinejf@free.fr> | 2008-07-16 11:56:07 +0200 |
---|---|---|
committer | Jean-Francois Moine <moinejf@free.fr> | 2008-07-16 11:56:07 +0200 |
commit | dc1edb0687fa7a00e95a47980e58f40198c71256 (patch) | |
tree | b315f17c2db6f5a173f71b2db5ead9ec58f6a28f /linux | |
parent | 576eb69e32e0f368412e19b6e131f5bc1081ef22 (diff) | |
download | mediapointer-dvb-s2-dc1edb0687fa7a00e95a47980e58f40198c71256.tar.gz mediapointer-dvb-s2-dc1edb0687fa7a00e95a47980e58f40198c71256.tar.bz2 |
gspca: Bad offset of the brightness sum in sn9c103 packets.
From: Hans de Goede <j.w.r.degoede@hhs.nl>
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Diffstat (limited to 'linux')
-rw-r--r-- | linux/drivers/media/video/gspca/sonixb.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/linux/drivers/media/video/gspca/sonixb.c b/linux/drivers/media/video/gspca/sonixb.c index edec35bd0..b23106c51 100644 --- a/linux/drivers/media/video/gspca/sonixb.c +++ b/linux/drivers/media/video/gspca/sonixb.c @@ -1059,6 +1059,15 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, int i; struct sd *sd = (struct sd *) gspca_dev; + /* frames start with: + * ff ff 00 c4 c4 96 synchro + * 00 (unknown) + * xx (frame sequence / size / compression) + * (xx) (idem - extra byte for sn9c103) + * ll mm brightness sum inside auto exposure + * ll mm brightness sum outside auto exposure + * (xx xx xx xx xx) audio values for snc103 + */ if (len > 6 && len < 24) { for (i = 0; i < len - 6; i++) { if (data[0 + i] == 0xff @@ -1069,15 +1078,18 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, && data[5 + i] == 0x96) { /* start of frame */ frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, 0); - if (i < (len - 10)) { - atomic_set(&sd->avg_lum, data[i + 8] + + if (len - i < sd->fr_h_sz) { + atomic_set(&sd->avg_lum, -1); + PDEBUG(D_STREAM, "packet too short to" + " get avg brightness"); + } else if (sd->fr_h_sz == 12) { + atomic_set(&sd->avg_lum, + data[i + 8] + (data[i + 9] << 8)); } else { - atomic_set(&sd->avg_lum, -1); -#ifdef CONFIG_VIDEO_ADV_DEBUG - PDEBUG(D_STREAM, "packet too short to " - "get avg brightness"); -#endif + atomic_set(&sd->avg_lum, + data[i + 9] + + (data[i + 10] << 8)); } data += i + sd->fr_h_sz; len -= i + sd->fr_h_sz; |