diff options
author | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-06-27 11:41:32 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-06-27 11:41:32 -0300 |
commit | e8558b23c2907da5025c69968a2da368c3af2cd6 (patch) | |
tree | 8470ec2481d547f2336a84e3984758f0f6941cc7 /linux/drivers/media/video/ivtv/ivtv-controls.c | |
parent | b958baf0ee13fa0e4472567f64ee943deb16d044 (diff) | |
parent | b171b4bf6091c1b3482b7ac3c14e1672f10c6950 (diff) | |
download | mediapointer-dvb-s2-e8558b23c2907da5025c69968a2da368c3af2cd6.tar.gz mediapointer-dvb-s2-e8558b23c2907da5025c69968a2da368c3af2cd6.tar.bz2 |
merge: http://linuxtv.org/hg/~dougsland/cx23885-417
From: Mauro Carvalho Chehab <mchehab@infradead.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'linux/drivers/media/video/ivtv/ivtv-controls.c')
-rw-r--r-- | linux/drivers/media/video/ivtv/ivtv-controls.c | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/linux/drivers/media/video/ivtv/ivtv-controls.c b/linux/drivers/media/video/ivtv/ivtv-controls.c index 6a5b70912..48e103be7 100644 --- a/linux/drivers/media/video/ivtv/ivtv-controls.c +++ b/linux/drivers/media/video/ivtv/ivtv-controls.c @@ -98,10 +98,24 @@ int ivtv_querymenu(struct file *file, void *fh, struct v4l2_querymenu *qmenu) cx2341x_ctrl_get_menu(&itv->params, qmenu->id)); } -int ivtv_s_ctrl(struct file *file, void *fh, struct v4l2_control *vctrl) +static int ivtv_try_ctrl(struct file *file, void *fh, + struct v4l2_ext_control *vctrl) { - struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv; + struct v4l2_queryctrl qctrl; + const char **menu_items = NULL; + int err; + + qctrl.id = vctrl->id; + err = ivtv_queryctrl(file, fh, &qctrl); + if (err) + return err; + if (qctrl.type == V4L2_CTRL_TYPE_MENU) + menu_items = v4l2_ctrl_get_menu(qctrl.id); + return v4l2_ctrl_check(vctrl, &qctrl, menu_items); +} +static int ivtv_s_ctrl(struct ivtv *itv, struct v4l2_control *vctrl) +{ switch (vctrl->id) { /* Standard V4L2 controls */ case V4L2_CID_BRIGHTNESS: @@ -125,10 +139,8 @@ int ivtv_s_ctrl(struct file *file, void *fh, struct v4l2_control *vctrl) return 0; } -int ivtv_g_ctrl(struct file *file, void *fh, struct v4l2_control *vctrl) +static int ivtv_g_ctrl(struct ivtv *itv, struct v4l2_control *vctrl) { - struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv; - switch (vctrl->id) { /* Standard V4L2 controls */ case V4L2_CID_BRIGHTNESS: @@ -203,7 +215,7 @@ int ivtv_g_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c) for (i = 0; i < c->count; i++) { ctrl.id = c->controls[i].id; ctrl.value = c->controls[i].value; - err = ivtv_g_ctrl(file, fh, &ctrl); + err = ivtv_g_ctrl(itv, &ctrl); c->controls[i].value = ctrl.value; if (err) { c->error_idx = i; @@ -229,7 +241,7 @@ int ivtv_s_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c) for (i = 0; i < c->count; i++) { ctrl.id = c->controls[i].id; ctrl.value = c->controls[i].value; - err = ivtv_s_ctrl(file, fh, &ctrl); + err = ivtv_s_ctrl(itv, &ctrl); c->controls[i].value = ctrl.value; if (err) { c->error_idx = i; @@ -277,6 +289,19 @@ int ivtv_try_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c) { struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv; + if (c->ctrl_class == V4L2_CTRL_CLASS_USER) { + int i; + int err = 0; + + for (i = 0; i < c->count; i++) { + err = ivtv_try_ctrl(file, fh, &c->controls[i]); + if (err) { + c->error_idx = i; + break; + } + } + return err; + } if (c->ctrl_class == V4L2_CTRL_CLASS_MPEG) return cx2341x_ext_ctrls(&itv->params, atomic_read(&itv->capturing), c, VIDIOC_TRY_EXT_CTRLS); return -EINVAL; |