diff options
author | Hans de Goede <j.w.r.degoede@hhs.nl> | 2008-09-04 15:22:56 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2008-09-04 15:22:56 -0400 |
commit | bf2a2202f75cda679303f09d150f9549f9835953 (patch) | |
tree | 5f5d6b2466e573b920fffa83c5d3eff1f59346d1 /drivers/media | |
parent | a94a508691d16420ad10572a33db4d45115b5f75 (diff) |
V4L/DVB (8870): gspca: Fix dark room problem with sonixb.
When using the sonixb driver in a dark room and given that the autoexposure
algorithm starts with a setting most suitable for daylight, the picture
produced by the cam may actually be 100% black leading to a avg_lum value of 0,
so an avg_lum value of 0 does not always signal an exposure settings change
(which it normally does). This patch adds a check for the really black image
case and stops dropping all frames as invalid in this case.
Signed-off-by: Hans de Goede <j.w.r.degoede@hhs.nl>
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/gspca/sonixb.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/media/video/gspca/sonixb.c b/drivers/media/video/gspca/sonixb.c index bde9ea9b980e..64bc758fbae5 100644 --- a/drivers/media/video/gspca/sonixb.c +++ b/drivers/media/video/gspca/sonixb.c | |||
@@ -52,6 +52,7 @@ MODULE_LICENSE("GPL"); | |||
52 | struct sd { | 52 | struct sd { |
53 | struct gspca_dev gspca_dev; /* !! must be the first item */ | 53 | struct gspca_dev gspca_dev; /* !! must be the first item */ |
54 | atomic_t avg_lum; | 54 | atomic_t avg_lum; |
55 | int prev_avg_lum; | ||
55 | 56 | ||
56 | unsigned char gain; | 57 | unsigned char gain; |
57 | unsigned char exposure; | 58 | unsigned char exposure; |
@@ -1022,10 +1023,19 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, | |||
1022 | } else { | 1023 | } else { |
1023 | lum = data[i + 8] + (data[i + 9] << 8); | 1024 | lum = data[i + 8] + (data[i + 9] << 8); |
1024 | } | 1025 | } |
1025 | if (lum == 0) { | 1026 | /* When exposure changes midway a frame we |
1027 | get a lum of 0 in this case drop 2 frames | ||
1028 | as the frames directly after an exposure | ||
1029 | change have an unstable image. Sometimes lum | ||
1030 | *really* is 0 (cam used in low light with | ||
1031 | low exposure setting), so do not drop frames | ||
1032 | if the previous lum was 0 too. */ | ||
1033 | if (lum == 0 && sd->prev_avg_lum != 0) { | ||
1026 | lum = -1; | 1034 | lum = -1; |
1027 | sd->frames_to_drop = 2; | 1035 | sd->frames_to_drop = 2; |
1028 | } | 1036 | sd->prev_avg_lum = 0; |
1037 | } else | ||
1038 | sd->prev_avg_lum = lum; | ||
1029 | atomic_set(&sd->avg_lum, lum); | 1039 | atomic_set(&sd->avg_lum, lum); |
1030 | 1040 | ||
1031 | if (sd->frames_to_drop) { | 1041 | if (sd->frames_to_drop) { |