int cx2341x_ext_ctrls(struct cx2341x_mpeg_params *params, struct v4l2_ext_controls *ctrls, unsigned int cmd) { int err = 0; int i; if (cmd == VIDIOC_G_EXT_CTRLS) { for (i = 0; i < ctrls->count; i++) { struct v4l2_ext_control *ctrl = ctrls->controls + i; err = cx2341x_get_ctrl(params, ctrl); if (err) { ctrls->error_idx = i; break; } } return err; } for (i = 0; i < ctrls->count; i++) { struct v4l2_ext_control *ctrl = ctrls->controls + i; struct v4l2_queryctrl qctrl; const char **menu_items = NULL; qctrl.id = ctrl->id; err = cx2341x_ctrl_query(params, &qctrl); if (err) break; if (qctrl.type == V4L2_CTRL_TYPE_MENU) menu_items = cx2341x_ctrl_get_menu(qctrl.id); err = v4l2_ctrl_check(ctrl, &qctrl, menu_items); if (err) break; err = cx2341x_set_ctrl(params, ctrl); if (err) break; } if (err == 0 && params->video_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR && params->video_bitrate_peak < params->video_bitrate) { err = -ERANGE; ctrls->error_idx = ctrls->count; } if (err) { ctrls->error_idx = i; } else { cx2341x_calc_audio_properties(params); } return err; }
int cx18_queryctrl(struct file *file, void *fh, struct v4l2_queryctrl *qctrl) { struct cx18 *cx = ((struct cx18_open_id *)fh)->cx; const char *name; qctrl->id = v4l2_ctrl_next(ctrl_classes, qctrl->id); if (qctrl->id == 0) return -EINVAL; switch (qctrl->id) { /* Standard V4L2 controls */ case V4L2_CID_USER_CLASS: return v4l2_ctrl_query_fill(qctrl, 0, 0, 0, 0); case V4L2_CID_BRIGHTNESS: case V4L2_CID_HUE: case V4L2_CID_SATURATION: case V4L2_CID_CONTRAST: if (v4l2_subdev_call(cx->sd_av, core, queryctrl, qctrl)) qctrl->flags |= V4L2_CTRL_FLAG_DISABLED; return 0; case V4L2_CID_AUDIO_VOLUME: case V4L2_CID_AUDIO_MUTE: case V4L2_CID_AUDIO_BALANCE: case V4L2_CID_AUDIO_BASS: case V4L2_CID_AUDIO_TREBLE: case V4L2_CID_AUDIO_LOUDNESS: if (v4l2_subdev_call(cx->sd_av, core, queryctrl, qctrl)) qctrl->flags |= V4L2_CTRL_FLAG_DISABLED; return 0; default: if (cx2341x_ctrl_query(&cx->params, qctrl)) qctrl->flags |= V4L2_CTRL_FLAG_DISABLED; return 0; } strncpy(qctrl->name, name, sizeof(qctrl->name) - 1); qctrl->name[sizeof(qctrl->name) - 1] = 0; return 0; }
int ivtv_queryctrl(struct file *file, void *fh, struct v4l2_queryctrl *qctrl) { struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv; const char *name; qctrl->id = v4l2_ctrl_next(ctrl_classes, qctrl->id); if (qctrl->id == 0) return -EINVAL; switch (qctrl->id) { /* Standard V4L2 controls */ case V4L2_CID_BRIGHTNESS: case V4L2_CID_HUE: case V4L2_CID_SATURATION: case V4L2_CID_CONTRAST: if (itv->video_dec_func(itv, VIDIOC_QUERYCTRL, qctrl)) qctrl->flags |= V4L2_CTRL_FLAG_DISABLED; return 0; case V4L2_CID_AUDIO_VOLUME: case V4L2_CID_AUDIO_MUTE: case V4L2_CID_AUDIO_BALANCE: case V4L2_CID_AUDIO_BASS: case V4L2_CID_AUDIO_TREBLE: case V4L2_CID_AUDIO_LOUDNESS: if (ivtv_i2c_hw(itv, itv->card->hw_audio_ctrl, VIDIOC_QUERYCTRL, qctrl)) qctrl->flags |= V4L2_CTRL_FLAG_DISABLED; return 0; default: if (cx2341x_ctrl_query(&itv->params, qctrl)) qctrl->flags |= V4L2_CTRL_FLAG_DISABLED; return 0; } strncpy(qctrl->name, name, sizeof(qctrl->name) - 1); qctrl->name[sizeof(qctrl->name) - 1] = 0; return 0; }