# HG changeset patch # User voroshil # Date 1190132919 0 # Node ID d6bba2781d016d7928e9604e673ed6f8ac124260 # Parent c9c2e550a449644c74f3173718a8d1a075baa1b7 Implement setting gain control for video devices (usually webcams) in v4l2 tv:// driver. diff -r c9c2e550a449 -r d6bba2781d01 DOCS/man/en/mplayer.1 --- a/DOCS/man/en/mplayer.1 Tue Sep 18 14:08:08 2007 +0000 +++ b/DOCS/man/en/mplayer.1 Tue Sep 18 16:28:39 2007 +0000 @@ -1854,6 +1854,11 @@ They will have no effect, if your card does not have one. For v4l2 50 maps to the default value of the control, as reported by the driver. +.IPs "gain=<0\-100> (v4l2)" +Set gain control for video devices (usually webcams) to the desired +value and switch off automatic control. +A value of 0 enables automatic control. +If this option is omitted, gain control will not be modified. .IPs immediatemode= A value of 0 means capture and buffer audio and video together (default for MEncoder). diff -r c9c2e550a449 -r d6bba2781d01 cfg-common.h --- a/cfg-common.h Tue Sep 18 14:08:08 2007 +0000 +++ b/cfg-common.h Tue Sep 18 16:28:39 2007 +0000 @@ -436,6 +436,7 @@ {"contrast", &stream_tv_defaults.contrast, CONF_TYPE_INT, CONF_RANGE, -100, 100, NULL}, {"hue", &stream_tv_defaults.hue, CONF_TYPE_INT, CONF_RANGE, -100, 100, NULL}, {"saturation", &stream_tv_defaults.saturation, CONF_TYPE_INT, CONF_RANGE, -100, 100, NULL}, + {"gain", &stream_tv_defaults.gain, CONF_TYPE_INT, CONF_RANGE, -1, 100, NULL}, #if defined(HAVE_TV_V4L) || defined(HAVE_TV_V4L2) {"amode", &stream_tv_defaults.amode, CONF_TYPE_INT, CONF_RANGE, 0, 3, NULL}, {"volume", &stream_tv_defaults.volume, CONF_TYPE_INT, CONF_RANGE, 0, 65535, NULL}, diff -r c9c2e550a449 -r d6bba2781d01 stream/stream_tv.c --- a/stream/stream_tv.c Tue Sep 18 14:08:08 2007 +0000 +++ b/stream/stream_tv.c Tue Sep 18 16:28:39 2007 +0000 @@ -72,6 +72,7 @@ 0, //contrast 0, //hue 0, //saturation + -1, //gain NULL, //tdevice 0, //tformat 100, //tpage diff -r c9c2e550a449 -r d6bba2781d01 stream/tv.c --- a/stream/tv.c Tue Sep 18 14:08:08 2007 +0000 +++ b/stream/tv.c Tue Sep 18 16:28:39 2007 +0000 @@ -759,6 +759,10 @@ tv_set_color_options(tvh, TV_COLOR_SATURATION, tvh->tv_param->saturation); tv_set_color_options(tvh, TV_COLOR_CONTRAST, tvh->tv_param->contrast); + if(tvh->tv_param->gain!=-1) + if(funcs->control(tvh->priv,TVI_CONTROL_VID_SET_GAIN,&tvh->tv_param->gain)!=TVI_CONTROL_TRUE) + mp_msg(MSGT_TV,MSGL_WARN,"Unable to set gain control!\n"); + funcs->control(tvh->priv,TV_VBI_CONTROL_RESET,tvh->tv_param); return demuxer; diff -r c9c2e550a449 -r d6bba2781d01 stream/tv.h --- a/stream/tv.h Tue Sep 18 14:08:08 2007 +0000 +++ b/stream/tv.h Tue Sep 18 16:28:39 2007 +0000 @@ -47,6 +47,7 @@ int contrast; int hue; int saturation; + int gain; char *tdevice; ///< teletext device int tformat; ///< teletext display format int tpage; ///< start teletext page @@ -151,6 +152,8 @@ #define TVI_CONTROL_VID_SET_CONTRAST 0x11c #define TVI_CONTROL_VID_GET_PICTURE 0x11d #define TVI_CONTROL_VID_SET_PICTURE 0x11e +#define TVI_CONTROL_VID_SET_GAIN 0x11f +#define TVI_CONTROL_VID_GET_GAIN 0x120 /* TUNER controls */ #define TVI_CONTROL_TUN_GET_FREQ 0x201 diff -r c9c2e550a449 -r d6bba2781d01 stream/tvi_v4l2.c --- a/stream/tvi_v4l2.c Tue Sep 18 14:08:08 2007 +0000 +++ b/stream/tvi_v4l2.c Tue Sep 18 16:28:39 2007 +0000 @@ -478,7 +478,6 @@ */ static int set_control(priv_t *priv, struct v4l2_control *control, int val_signed) { struct v4l2_queryctrl qctrl; - qctrl.id = control->id; if (ioctl(priv->video_fd, VIDIOC_QUERYCTRL, &qctrl) < 0) { mp_msg(MSGT_TV, MSGL_ERR, "%s: ioctl query control failed: %s\n", @@ -806,6 +805,40 @@ control.id = V4L2_CID_SATURATION; control.value = *(int *)arg; return set_control(priv, &control, 1); + case TVI_CONTROL_VID_GET_GAIN: + { + + control.id = V4L2_CID_AUTOGAIN; + if(get_control(priv,&control,0)!=TVI_CONTROL_TRUE) + return TVI_CONTROL_FALSE; + + if(control.value){ //Auto Gain control is enabled + *(int*)arg=0; + return TVI_CONTROL_TRUE; + } + + //Manual Gain control + control.id = V4L2_CID_GAIN; + if(get_control(priv,&control,0)!=TVI_CONTROL_TRUE) + return TVI_CONTROL_FALSE; + + *(int*)arg=control.value?control.value:1; + + return TVI_CONTROL_TRUE; + } + case TVI_CONTROL_VID_SET_GAIN: + { + //value==0 means automatic gain control + int value=*(int*)arg; + + if (value < 0 || value>100) + return TVI_CONTROL_FALSE; + + control.id=value?V4L2_CID_GAIN:V4L2_CID_AUTOGAIN; + control.value=value?value:1; + + return set_control(priv,&control,0); + } case TVI_CONTROL_VID_GET_CONTRAST: control.id = V4L2_CID_CONTRAST; if (get_control(priv, &control, 1) == TVI_CONTROL_TRUE) {