My Microdia (SN9C201) webcam succumbs to glare in Linux

Message ID 20120316204005.58f64d41@tele (mailing list archive)
State RFC, archived
Headers

Commit Message

Jean-Francois Moine March 16, 2012, 7:40 p.m. UTC
  On Fri, 16 Mar 2012 08:53:51 +1100
Xavion <xavion.0@gmail.com> wrote:

> As you can probably gather from the attached screenshots, I'm
> attempting to use my SN9C201 webcam for home security.  The problem is
> that it succumbs to external glare during the middle hours of sunny
> days when used in Linux.
> 
> The same problem doesn't occur in Windows, probably since the software
> automatically adjusts to the current lighting conditions.  These
> screenshots were taken only five minutes apart and the sunlight
> intensity didn't change much in-between.
> 
> No amount of adjusting the webcam's settings (via V4L2-UCP) seemed to
> make any significant difference.  For this reason, I'm guessing that
> there's at least one other adjustable setting that the GSPCA driver
> isn't tapping into yet.
	[snip]

Hi Xavion,

It seems that the exposure is not set correctly. May you try the patch
below? (to be applied to the gspca test version 2.15.7 - the exposure
may be too low at init time, set it to 800)
  

Comments

Xavion March 17, 2012, 12:33 a.m. UTC | #1
Hi Jean-Francois

I applied the patch you supplied, but the result wasn't as expected.
The video now cycles between the attached image and total blackness
every couple of seconds (i.e. bright, black, bright, black, ...).  I
should note that my curtains were actually closed and that I had
auto-exposure enabled in V4L2-UCP.

The image remained the same when I manually set the exposure to 800,
but at least it wasn't going black every couple of seconds anymore.
Of course, the problem disappeared when I reverted to the original
GSPCA v2.15.7 code.  Let me know if you want me to email you any of
the relevant debugging output.
  

Patch

--- build/sn9c20x.c~
+++ build/sn9c20x.c
@@ -1650,10 +1650,9 @@ 
 	case SENSOR_OV7670:
 	case SENSOR_OV9655:
 	case SENSOR_OV9650:
-		exp[0] |= (3 << 4);
-		exp[2] = 0x2d;
-		exp[3] = expo;
-		exp[4] = expo >> 8;
+		exp[0] |= (2 << 4);
+		exp[2] = 0x10;			/* AECH */
+		exp[3] = expo * 255 / 0x1780;
 		break;
 	case SENSOR_MT9M001:
 	case SENSOR_MT9V112: