[media] V4L: Add support for integer menu controls with standard menu items
The patch modifies the helper function v4l2_ctrl_new_std_menu to accept integer menu controls with standard menu items. Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Arun Kumar K <arun.kk@samsung.com> Acked-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Kamil Debski <k.debski@samsung.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
This commit is contained in:
parent
debe6267b7
commit
d1e9b7c12b
@ -124,26 +124,27 @@ You add non-menu controls by calling v4l2_ctrl_new_std:
|
|||||||
const struct v4l2_ctrl_ops *ops,
|
const struct v4l2_ctrl_ops *ops,
|
||||||
u32 id, s32 min, s32 max, u32 step, s32 def);
|
u32 id, s32 min, s32 max, u32 step, s32 def);
|
||||||
|
|
||||||
Menu controls are added by calling v4l2_ctrl_new_std_menu:
|
Menu and integer menu controls are added by calling v4l2_ctrl_new_std_menu:
|
||||||
|
|
||||||
struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
|
struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
|
||||||
const struct v4l2_ctrl_ops *ops,
|
const struct v4l2_ctrl_ops *ops,
|
||||||
u32 id, s32 max, s32 skip_mask, s32 def);
|
u32 id, s32 max, s32 skip_mask, s32 def);
|
||||||
|
|
||||||
Or alternatively for integer menu controls, by calling v4l2_ctrl_new_int_menu:
|
Menu controls with a driver specific menu are added by calling
|
||||||
|
v4l2_ctrl_new_std_menu_items:
|
||||||
|
|
||||||
|
struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(
|
||||||
|
struct v4l2_ctrl_handler *hdl,
|
||||||
|
const struct v4l2_ctrl_ops *ops, u32 id, s32 max,
|
||||||
|
s32 skip_mask, s32 def, const char * const *qmenu);
|
||||||
|
|
||||||
|
Integer menu controls with a driver specific menu can be added by calling
|
||||||
|
v4l2_ctrl_new_int_menu:
|
||||||
|
|
||||||
struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
|
struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
|
||||||
const struct v4l2_ctrl_ops *ops,
|
const struct v4l2_ctrl_ops *ops,
|
||||||
u32 id, s32 max, s32 def, const s64 *qmenu_int);
|
u32 id, s32 max, s32 def, const s64 *qmenu_int);
|
||||||
|
|
||||||
Standard menu controls with a driver specific menu are added by calling
|
|
||||||
v4l2_ctrl_new_std_menu_items:
|
|
||||||
|
|
||||||
struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(
|
|
||||||
struct v4l2_ctrl_handler *hdl,
|
|
||||||
const struct v4l2_ctrl_ops *ops, u32 id, s32 max,
|
|
||||||
s32 skip_mask, s32 def, const char * const *qmenu);
|
|
||||||
|
|
||||||
These functions are typically called right after the v4l2_ctrl_handler_init:
|
These functions are typically called right after the v4l2_ctrl_handler_init:
|
||||||
|
|
||||||
static const s64 exp_bias_qmenu[] = {
|
static const s64 exp_bias_qmenu[] = {
|
||||||
|
@ -552,6 +552,20 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(v4l2_ctrl_get_menu);
|
EXPORT_SYMBOL(v4l2_ctrl_get_menu);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns NULL or an s64 type array containing the menu for given
|
||||||
|
* control ID. The total number of the menu items is returned in @len.
|
||||||
|
*/
|
||||||
|
const s64 const *v4l2_ctrl_get_int_menu(u32 id, u32 *len)
|
||||||
|
{
|
||||||
|
switch (id) {
|
||||||
|
default:
|
||||||
|
*len = 0;
|
||||||
|
return NULL;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(v4l2_ctrl_get_int_menu);
|
||||||
|
|
||||||
/* Return the control name. */
|
/* Return the control name. */
|
||||||
const char *v4l2_ctrl_get_name(u32 id)
|
const char *v4l2_ctrl_get_name(u32 id)
|
||||||
{
|
{
|
||||||
@ -1712,20 +1726,28 @@ struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
|
|||||||
const struct v4l2_ctrl_ops *ops,
|
const struct v4l2_ctrl_ops *ops,
|
||||||
u32 id, s32 max, s32 mask, s32 def)
|
u32 id, s32 max, s32 mask, s32 def)
|
||||||
{
|
{
|
||||||
const char * const *qmenu = v4l2_ctrl_get_menu(id);
|
const char * const *qmenu = NULL;
|
||||||
|
const s64 *qmenu_int = NULL;
|
||||||
const char *name;
|
const char *name;
|
||||||
enum v4l2_ctrl_type type;
|
enum v4l2_ctrl_type type;
|
||||||
|
unsigned int qmenu_int_len;
|
||||||
s32 min;
|
s32 min;
|
||||||
s32 step;
|
s32 step;
|
||||||
u32 flags;
|
u32 flags;
|
||||||
|
|
||||||
v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
|
v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
|
||||||
if (type != V4L2_CTRL_TYPE_MENU) {
|
|
||||||
|
if (type == V4L2_CTRL_TYPE_MENU)
|
||||||
|
qmenu = v4l2_ctrl_get_menu(id);
|
||||||
|
else if (type == V4L2_CTRL_TYPE_INTEGER_MENU)
|
||||||
|
qmenu_int = v4l2_ctrl_get_int_menu(id, &qmenu_int_len);
|
||||||
|
|
||||||
|
if ((!qmenu && !qmenu_int) || (qmenu_int && max > qmenu_int_len)) {
|
||||||
handler_set_err(hdl, -EINVAL);
|
handler_set_err(hdl, -EINVAL);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return v4l2_ctrl_new(hdl, ops, id, name, type,
|
return v4l2_ctrl_new(hdl, ops, id, name, type,
|
||||||
0, max, mask, def, flags, qmenu, NULL, NULL);
|
0, max, mask, def, flags, qmenu, qmenu_int, NULL);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(v4l2_ctrl_new_std_menu);
|
EXPORT_SYMBOL(v4l2_ctrl_new_std_menu);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user