linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4] media: v4l2-ctrl: add a helper function to add standard control with driver specific menu
@ 2012-09-18 18:54 Prabhakar Lad
  2012-09-19  7:53 ` Hans Verkuil
  0 siblings, 1 reply; 3+ messages in thread
From: Prabhakar Lad @ 2012-09-18 18:54 UTC (permalink / raw)
  To: LMML
  Cc: LKML, DLOS, Mauro Carvalho Chehab, linux-doc, Lad, Prabhakar,
	Manjunath Hadli, Hans Verkuil, Sakari Ailus, Sylwester Nawrocki,
	Laurent Pinchart, Hans de Goede, Kyungmin Park,
	Guennadi Liakhovetski, Rob Landley

From: Lad, Prabhakar <prabhakar.lad@ti.com>

Add helper function v4l2_ctrl_new_std_menu_items(), which adds
a standard menu control, with driver specific menu.

Signed-off-by: Lad, Prabhakar <prabhakar.lad@ti.com>
Signed-off-by: Manjunath Hadli <manjunath.hadli@ti.com>
Cc: Hans Verkuil <hans.verkuil@cisco.com>
Cc: Sakari Ailus <sakari.ailus@iki.fi>
Cc: Sylwester Nawrocki <s.nawrocki@samsung.com>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Mauro Carvalho Chehab <mchehab@infradead.org>
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Cc: Rob Landley <rob@landley.net>
---
Changes for v4:
1: Rather then adding a function to modify the menu, added a helper
   function, that creates a new standard control with user specific
   menu.

Changes for v3:
1: Fixed style/grammer issues as pointed by Hans.
   Thanks Hans for providing the description.

Changes for v2:
1: Fixed review comments from Hans, to have return type as
   void, add WARN_ON() for fail conditions, allow this fucntion
   to modify the menu of custom controls.

 Documentation/video4linux/v4l2-controls.txt |   25 ++++++++++++++++++++++++
 drivers/media/v4l2-core/v4l2-ctrls.c        |   28 +++++++++++++++++++++++++++
 include/media/v4l2-ctrls.h                  |   23 ++++++++++++++++++++++
 3 files changed, 76 insertions(+), 0 deletions(-)

diff --git a/Documentation/video4linux/v4l2-controls.txt b/Documentation/video4linux/v4l2-controls.txt
index 43da22b..ad8e172 100644
--- a/Documentation/video4linux/v4l2-controls.txt
+++ b/Documentation/video4linux/v4l2-controls.txt
@@ -136,11 +136,25 @@ Or alternatively for integer menu controls, by calling v4l2_ctrl_new_int_menu:
 			const struct v4l2_ctrl_ops *ops,
 			u32 id, s32 max, s32 def, const s64 *qmenu_int);
 
+Standard menu controls with 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_user);
+
 These functions are typically called right after the v4l2_ctrl_handler_init:
 
 	static const s64 exp_bias_qmenu[] = {
 	       -2, -1, 0, 1, 2
 	};
+	static const char * const test_pattern[] = {
+		"Disabled",
+		"Vertical Bars",
+		"Solid Black",
+		"Solid White",
+	};
 
 	v4l2_ctrl_handler_init(&foo->ctrl_handler, nr_of_controls);
 	v4l2_ctrl_new_std(&foo->ctrl_handler, &foo_ctrl_ops,
@@ -156,6 +170,9 @@ These functions are typically called right after the v4l2_ctrl_handler_init:
 			ARRAY_SIZE(exp_bias_qmenu) - 1,
 			ARRAY_SIZE(exp_bias_qmenu) / 2 - 1,
 			exp_bias_qmenu);
+	v4l2_ctrl_new_std_menu_items(&foo->ctrl_handler, &foo_ctrl_ops,
+			V4L2_CID_TEST_PATTERN, ARRAY_SIZE(test_pattern) - 1, 0,
+			0, test_pattern);
 	...
 	if (foo->ctrl_handler.error) {
 		int err = foo->ctrl_handler.error;
@@ -185,6 +202,14 @@ v4l2_ctrl_new_std_menu in that it doesn't have the mask argument and takes
 as the last argument an array of signed 64-bit integers that form an exact
 menu item list.
 
+The v4l2_ctrl_new_std_menu_items funtion is very similar as
+v4l2_ctrl_new_std_menu but takes a extra parameter qmenu_user, which is
+driver specific menu but yet a standard menu control.
+A good example for this control is the test pattern control for
+capture/display/sensors devices that have the capability to generate test
+patterns. These test patterns are hardware specific, so the contents of the
+menu will vary from device to device.
+
 Note that if something fails, the function will return NULL or an error and
 set ctrl_handler->error to the error code. If ctrl_handler->error was already
 set, then it will just return and do nothing. This is also true for
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index d731422..9ac1b75 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -1649,6 +1649,34 @@ struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
 }
 EXPORT_SYMBOL(v4l2_ctrl_new_std_menu);
 
+/* Helper function for standard menu controls with user defined menu */
+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 mask, s32 def, const char * const *qmenu_user)
+{
+	const char * const *qmenu = v4l2_ctrl_get_menu(id);
+	const char *name;
+	enum v4l2_ctrl_type type;
+	s32 min;
+	s32 step;
+	u32 flags;
+
+	if (!qmenu) {
+		handler_set_err(hdl, -EINVAL);
+		return NULL;
+	}
+
+	v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
+	if (type != V4L2_CTRL_TYPE_MENU) {
+		handler_set_err(hdl, -EINVAL);
+		return NULL;
+	}
+	return v4l2_ctrl_new(hdl, ops, id, name, type,
+			     0, max, mask, def, flags, qmenu_user, NULL, NULL);
+
+}
+EXPORT_SYMBOL(v4l2_ctrl_new_std_menu_items);
+
 /* Helper function for standard integer menu controls */
 struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
 			const struct v4l2_ctrl_ops *ops,
diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
index 776605f..e0dd392 100644
--- a/include/media/v4l2-ctrls.h
+++ b/include/media/v4l2-ctrls.h
@@ -351,6 +351,29 @@ struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
 			const struct v4l2_ctrl_ops *ops,
 			u32 id, s32 max, s32 mask, s32 def);
 
+/** v4l2_ctrl_new_std_menu_items() - Create a new standard V4L2 menu control
+  * with driver specific menu.
+  * @hdl:	The control handler.
+  * @ops:	The control ops.
+  * @id:	The control ID.
+  * @max:	The control's maximum value.
+  * @mask:	The control's skip mask for menu controls. This makes it
+  *		easy to skip menu items that are not valid. If bit X is set,
+  *		then menu item X is skipped. Of course, this only works for
+  *		menus with <= 32 menu items. There are no menus that come
+  *		close to that number, so this is OK. Should we ever need more,
+  *		then this will have to be extended to a u64 or a bit array.
+  * @def:	The control's default value.
+  * @qmenu_user:The new menu.
+  *
+  * Same as v4l2_ctrl_new_std_menu().but @qmenu_user will be the menu to
+  * which the control will be pointing to.
+  *
+  */
+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 mask, s32 def, const char * const *qmenu_user);
+
 /** v4l2_ctrl_new_int_menu() - Create a new standard V4L2 integer menu control.
   * @hdl:	The control handler.
   * @ops:	The control ops.
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v4] media: v4l2-ctrl: add a helper function to add standard control with driver specific menu
  2012-09-18 18:54 [PATCH v4] media: v4l2-ctrl: add a helper function to add standard control with driver specific menu Prabhakar Lad
@ 2012-09-19  7:53 ` Hans Verkuil
  2012-09-19  9:04   ` Prabhakar Lad
  0 siblings, 1 reply; 3+ messages in thread
From: Hans Verkuil @ 2012-09-19  7:53 UTC (permalink / raw)
  To: Prabhakar Lad
  Cc: LMML, LKML, DLOS, Mauro Carvalho Chehab, linux-doc, Lad,
	Prabhakar, Manjunath Hadli, Hans Verkuil, Sakari Ailus,
	Sylwester Nawrocki, Laurent Pinchart, Hans de Goede,
	Kyungmin Park, Guennadi Liakhovetski, Rob Landley

Hi Prabhakar,

I found some grammar issues, but also some (small) things that should be changed.


On Tue 18 September 2012 20:54:38 Prabhakar Lad wrote:
> From: Lad, Prabhakar <prabhakar.lad@ti.com>
> 
> Add helper function v4l2_ctrl_new_std_menu_items(), which adds
> a standard menu control, with driver specific menu.
> 
> Signed-off-by: Lad, Prabhakar <prabhakar.lad@ti.com>
> Signed-off-by: Manjunath Hadli <manjunath.hadli@ti.com>
> Cc: Hans Verkuil <hans.verkuil@cisco.com>
> Cc: Sakari Ailus <sakari.ailus@iki.fi>
> Cc: Sylwester Nawrocki <s.nawrocki@samsung.com>
> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Cc: Mauro Carvalho Chehab <mchehab@infradead.org>
> Cc: Hans de Goede <hdegoede@redhat.com>
> Cc: Kyungmin Park <kyungmin.park@samsung.com>
> Cc: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
> Cc: Rob Landley <rob@landley.net>
> ---
> Changes for v4:
> 1: Rather then adding a function to modify the menu, added a helper
>    function, that creates a new standard control with user specific
>    menu.
> 
> Changes for v3:
> 1: Fixed style/grammer issues as pointed by Hans.
>    Thanks Hans for providing the description.
> 
> Changes for v2:
> 1: Fixed review comments from Hans, to have return type as
>    void, add WARN_ON() for fail conditions, allow this fucntion
>    to modify the menu of custom controls.
> 
>  Documentation/video4linux/v4l2-controls.txt |   25 ++++++++++++++++++++++++
>  drivers/media/v4l2-core/v4l2-ctrls.c        |   28 +++++++++++++++++++++++++++
>  include/media/v4l2-ctrls.h                  |   23 ++++++++++++++++++++++
>  3 files changed, 76 insertions(+), 0 deletions(-)
> 
> diff --git a/Documentation/video4linux/v4l2-controls.txt b/Documentation/video4linux/v4l2-controls.txt
> index 43da22b..ad8e172 100644
> --- a/Documentation/video4linux/v4l2-controls.txt
> +++ b/Documentation/video4linux/v4l2-controls.txt
> @@ -136,11 +136,25 @@ Or alternatively for integer menu controls, by calling v4l2_ctrl_new_int_menu:
>  			const struct v4l2_ctrl_ops *ops,
>  			u32 id, s32 max, s32 def, const s64 *qmenu_int);
>  
> +Standard menu controls with driver specific menu are added by calling

with driver -> with a driver

> +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_user);

I would recommend that qmenu_user is just renamed to qmenu.
The _user suffix suggests that this is a userspace-provided menu, which
is not the case.

> +
>  These functions are typically called right after the v4l2_ctrl_handler_init:
>  
>  	static const s64 exp_bias_qmenu[] = {
>  	       -2, -1, 0, 1, 2
>  	};
> +	static const char * const test_pattern[] = {
> +		"Disabled",
> +		"Vertical Bars",
> +		"Solid Black",
> +		"Solid White",
> +	};
>  
>  	v4l2_ctrl_handler_init(&foo->ctrl_handler, nr_of_controls);
>  	v4l2_ctrl_new_std(&foo->ctrl_handler, &foo_ctrl_ops,
> @@ -156,6 +170,9 @@ These functions are typically called right after the v4l2_ctrl_handler_init:
>  			ARRAY_SIZE(exp_bias_qmenu) - 1,
>  			ARRAY_SIZE(exp_bias_qmenu) / 2 - 1,
>  			exp_bias_qmenu);
> +	v4l2_ctrl_new_std_menu_items(&foo->ctrl_handler, &foo_ctrl_ops,
> +			V4L2_CID_TEST_PATTERN, ARRAY_SIZE(test_pattern) - 1, 0,
> +			0, test_pattern);
>  	...
>  	if (foo->ctrl_handler.error) {
>  		int err = foo->ctrl_handler.error;
> @@ -185,6 +202,14 @@ v4l2_ctrl_new_std_menu in that it doesn't have the mask argument and takes
>  as the last argument an array of signed 64-bit integers that form an exact
>  menu item list.
>  
> +The v4l2_ctrl_new_std_menu_items funtion is very similar as

funtion -> function
similar as -> similar to

> +v4l2_ctrl_new_std_menu but takes a extra parameter qmenu_user, which is

a extra -> an extra

> +driver specific menu but yet a standard menu control.

the driver specific menu for an otherwise standard menu control.

> +A good example for this control is the test pattern control for
> +capture/display/sensors devices that have the capability to generate test
> +patterns. These test patterns are hardware specific, so the contents of the
> +menu will vary from device to device.
> +
>  Note that if something fails, the function will return NULL or an error and
>  set ctrl_handler->error to the error code. If ctrl_handler->error was already
>  set, then it will just return and do nothing. This is also true for
> diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
> index d731422..9ac1b75 100644
> --- a/drivers/media/v4l2-core/v4l2-ctrls.c
> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c
> @@ -1649,6 +1649,34 @@ struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
>  }
>  EXPORT_SYMBOL(v4l2_ctrl_new_std_menu);
>  
> +/* Helper function for standard menu controls with user defined menu */
> +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 mask, s32 def, const char * const *qmenu_user)
> +{
> +	const char * const *qmenu = v4l2_ctrl_get_menu(id);
> +	const char *name;
> +	enum v4l2_ctrl_type type;
> +	s32 min;
> +	s32 step;
> +	u32 flags;
> +
> +	if (!qmenu) {

This test should be inverted: if (qmenu)

Add a comment that v4l2_ctrl_new_std_menu_items() may only be called for
standard controls *without* a standard menu.

> +		handler_set_err(hdl, -EINVAL);
> +		return NULL;
> +	}
> +
> +	v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
> +	if (type != V4L2_CTRL_TYPE_MENU) {
> +		handler_set_err(hdl, -EINVAL);
> +		return NULL;
> +	}
> +	return v4l2_ctrl_new(hdl, ops, id, name, type,
> +			     0, max, mask, def, flags, qmenu_user, NULL, NULL);
> +
> +}
> +EXPORT_SYMBOL(v4l2_ctrl_new_std_menu_items);
> +
>  /* Helper function for standard integer menu controls */
>  struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
>  			const struct v4l2_ctrl_ops *ops,
> diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
> index 776605f..e0dd392 100644
> --- a/include/media/v4l2-ctrls.h
> +++ b/include/media/v4l2-ctrls.h
> @@ -351,6 +351,29 @@ struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
>  			const struct v4l2_ctrl_ops *ops,
>  			u32 id, s32 max, s32 mask, s32 def);
>  
> +/** v4l2_ctrl_new_std_menu_items() - Create a new standard V4L2 menu control
> +  * with driver specific menu.
> +  * @hdl:	The control handler.
> +  * @ops:	The control ops.
> +  * @id:	The control ID.
> +  * @max:	The control's maximum value.
> +  * @mask:	The control's skip mask for menu controls. This makes it
> +  *		easy to skip menu items that are not valid. If bit X is set,
> +  *		then menu item X is skipped. Of course, this only works for
> +  *		menus with <= 32 menu items. There are no menus that come
> +  *		close to that number, so this is OK. Should we ever need more,
> +  *		then this will have to be extended to a u64 or a bit array.
> +  * @def:	The control's default value.
> +  * @qmenu_user:The new menu.
> +  *
> +  * Same as v4l2_ctrl_new_std_menu().but @qmenu_user will be the menu to

.but -> , but

'will be the driver specific menu of this control.'

> +  * which the control will be pointing to.
> +  *
> +  */
> +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 mask, s32 def, const char * const *qmenu_user);
> +
>  /** v4l2_ctrl_new_int_menu() - Create a new standard V4L2 integer menu control.
>    * @hdl:	The control handler.
>    * @ops:	The control ops.
> 

Regards,

	Hans

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v4] media: v4l2-ctrl: add a helper function to add standard control with driver specific menu
  2012-09-19  7:53 ` Hans Verkuil
@ 2012-09-19  9:04   ` Prabhakar Lad
  0 siblings, 0 replies; 3+ messages in thread
From: Prabhakar Lad @ 2012-09-19  9:04 UTC (permalink / raw)
  To: Hans Verkuil
  Cc: LMML, LKML, DLOS, Mauro Carvalho Chehab, linux-doc, Lad,
	Prabhakar, Manjunath Hadli, Hans Verkuil, Sakari Ailus,
	Sylwester Nawrocki, Laurent Pinchart, Hans de Goede,
	Kyungmin Park, Guennadi Liakhovetski, Rob Landley

Hi Hans,

Thanks for the review.

On Wed, Sep 19, 2012 at 1:23 PM, Hans Verkuil <hverkuil@xs4all.nl> wrote:
> Hi Prabhakar,
>
> I found some grammar issues, but also some (small) things that should be changed.
>
>
> On Tue 18 September 2012 20:54:38 Prabhakar Lad wrote:
>> From: Lad, Prabhakar <prabhakar.lad@ti.com>
>>
>> Add helper function v4l2_ctrl_new_std_menu_items(), which adds
>> a standard menu control, with driver specific menu.
>>
>> Signed-off-by: Lad, Prabhakar <prabhakar.lad@ti.com>
>> Signed-off-by: Manjunath Hadli <manjunath.hadli@ti.com>
>> Cc: Hans Verkuil <hans.verkuil@cisco.com>
>> Cc: Sakari Ailus <sakari.ailus@iki.fi>
>> Cc: Sylwester Nawrocki <s.nawrocki@samsung.com>
>> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
>> Cc: Mauro Carvalho Chehab <mchehab@infradead.org>
>> Cc: Hans de Goede <hdegoede@redhat.com>
>> Cc: Kyungmin Park <kyungmin.park@samsung.com>
>> Cc: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
>> Cc: Rob Landley <rob@landley.net>
>> ---
>> Changes for v4:
>> 1: Rather then adding a function to modify the menu, added a helper
>>    function, that creates a new standard control with user specific
>>    menu.
>>
>> Changes for v3:
>> 1: Fixed style/grammer issues as pointed by Hans.
>>    Thanks Hans for providing the description.
>>
>> Changes for v2:
>> 1: Fixed review comments from Hans, to have return type as
>>    void, add WARN_ON() for fail conditions, allow this fucntion
>>    to modify the menu of custom controls.
>>
>>  Documentation/video4linux/v4l2-controls.txt |   25 ++++++++++++++++++++++++
>>  drivers/media/v4l2-core/v4l2-ctrls.c        |   28 +++++++++++++++++++++++++++
>>  include/media/v4l2-ctrls.h                  |   23 ++++++++++++++++++++++
>>  3 files changed, 76 insertions(+), 0 deletions(-)
>>
>> diff --git a/Documentation/video4linux/v4l2-controls.txt b/Documentation/video4linux/v4l2-controls.txt
>> index 43da22b..ad8e172 100644
>> --- a/Documentation/video4linux/v4l2-controls.txt
>> +++ b/Documentation/video4linux/v4l2-controls.txt
>> @@ -136,11 +136,25 @@ Or alternatively for integer menu controls, by calling v4l2_ctrl_new_int_menu:
>>                       const struct v4l2_ctrl_ops *ops,
>>                       u32 id, s32 max, s32 def, const s64 *qmenu_int);
>>
>> +Standard menu controls with driver specific menu are added by calling
>
> with driver -> with a driver
>
Ok.

>> +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_user);
>
> I would recommend that qmenu_user is just renamed to qmenu.
> The _user suffix suggests that this is a userspace-provided menu, which
> is not the case.
>
Ok.

>> +
>>  These functions are typically called right after the v4l2_ctrl_handler_init:
>>
>>       static const s64 exp_bias_qmenu[] = {
>>              -2, -1, 0, 1, 2
>>       };
>> +     static const char * const test_pattern[] = {
>> +             "Disabled",
>> +             "Vertical Bars",
>> +             "Solid Black",
>> +             "Solid White",
>> +     };
>>
>>       v4l2_ctrl_handler_init(&foo->ctrl_handler, nr_of_controls);
>>       v4l2_ctrl_new_std(&foo->ctrl_handler, &foo_ctrl_ops,
>> @@ -156,6 +170,9 @@ These functions are typically called right after the v4l2_ctrl_handler_init:
>>                       ARRAY_SIZE(exp_bias_qmenu) - 1,
>>                       ARRAY_SIZE(exp_bias_qmenu) / 2 - 1,
>>                       exp_bias_qmenu);
>> +     v4l2_ctrl_new_std_menu_items(&foo->ctrl_handler, &foo_ctrl_ops,
>> +                     V4L2_CID_TEST_PATTERN, ARRAY_SIZE(test_pattern) - 1, 0,
>> +                     0, test_pattern);
>>       ...
>>       if (foo->ctrl_handler.error) {
>>               int err = foo->ctrl_handler.error;
>> @@ -185,6 +202,14 @@ v4l2_ctrl_new_std_menu in that it doesn't have the mask argument and takes
>>  as the last argument an array of signed 64-bit integers that form an exact
>>  menu item list.
>>
>> +The v4l2_ctrl_new_std_menu_items funtion is very similar as
>
> funtion -> function
> similar as -> similar to
>
Ok.
>> +v4l2_ctrl_new_std_menu but takes a extra parameter qmenu_user, which is
>
> a extra -> an extra
>
>> +driver specific menu but yet a standard menu control.
>
> the driver specific menu for an otherwise standard menu control.
>
Ok.

>> +A good example for this control is the test pattern control for
>> +capture/display/sensors devices that have the capability to generate test
>> +patterns. These test patterns are hardware specific, so the contents of the
>> +menu will vary from device to device.
>> +
>>  Note that if something fails, the function will return NULL or an error and
>>  set ctrl_handler->error to the error code. If ctrl_handler->error was already
>>  set, then it will just return and do nothing. This is also true for
>> diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
>> index d731422..9ac1b75 100644
>> --- a/drivers/media/v4l2-core/v4l2-ctrls.c
>> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c
>> @@ -1649,6 +1649,34 @@ struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
>>  }
>>  EXPORT_SYMBOL(v4l2_ctrl_new_std_menu);
>>
>> +/* Helper function for standard menu controls with user defined menu */
>> +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 mask, s32 def, const char * const *qmenu_user)
>> +{
>> +     const char * const *qmenu = v4l2_ctrl_get_menu(id);
>> +     const char *name;
>> +     enum v4l2_ctrl_type type;
>> +     s32 min;
>> +     s32 step;
>> +     u32 flags;
>> +
>> +     if (!qmenu) {
>
> This test should be inverted: if (qmenu)
>
This check is if it really belongs standard menu control, here
qmenu is filled by v4l2_ctrl_get_menu(), If it returns null its a error case.

> Add a comment that v4l2_ctrl_new_std_menu_items() may only be called for
> standard controls *without* a standard menu.
>
Ok.
>> +             handler_set_err(hdl, -EINVAL);
>> +             return NULL;
>> +     }
>> +
>> +     v4l2_ctrl_fill(id, &name, &type, &min, &max, &step, &def, &flags);
>> +     if (type != V4L2_CTRL_TYPE_MENU) {
>> +             handler_set_err(hdl, -EINVAL);
>> +             return NULL;
>> +     }
>> +     return v4l2_ctrl_new(hdl, ops, id, name, type,
>> +                          0, max, mask, def, flags, qmenu_user, NULL, NULL);
>> +
>> +}
>> +EXPORT_SYMBOL(v4l2_ctrl_new_std_menu_items);
>> +
>>  /* Helper function for standard integer menu controls */
>>  struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
>>                       const struct v4l2_ctrl_ops *ops,
>> diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h
>> index 776605f..e0dd392 100644
>> --- a/include/media/v4l2-ctrls.h
>> +++ b/include/media/v4l2-ctrls.h
>> @@ -351,6 +351,29 @@ struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
>>                       const struct v4l2_ctrl_ops *ops,
>>                       u32 id, s32 max, s32 mask, s32 def);
>>
>> +/** v4l2_ctrl_new_std_menu_items() - Create a new standard V4L2 menu control
>> +  * with driver specific menu.
>> +  * @hdl:    The control handler.
>> +  * @ops:    The control ops.
>> +  * @id:     The control ID.
>> +  * @max:    The control's maximum value.
>> +  * @mask:   The control's skip mask for menu controls. This makes it
>> +  *          easy to skip menu items that are not valid. If bit X is set,
>> +  *          then menu item X is skipped. Of course, this only works for
>> +  *          menus with <= 32 menu items. There are no menus that come
>> +  *          close to that number, so this is OK. Should we ever need more,
>> +  *          then this will have to be extended to a u64 or a bit array.
>> +  * @def:    The control's default value.
>> +  * @qmenu_user:The new menu.
>> +  *
>> +  * Same as v4l2_ctrl_new_std_menu().but @qmenu_user will be the menu to
>
> .but -> , but
>
> 'will be the driver specific menu of this control.'
>
Ok.

Regards,
--Prabhakar

>> +  * which the control will be pointing to.
>> +  *
>> +  */
>> +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 mask, s32 def, const char * const *qmenu_user);
>> +
>>  /** v4l2_ctrl_new_int_menu() - Create a new standard V4L2 integer menu control.
>>    * @hdl:    The control handler.
>>    * @ops:    The control ops.
>>
>
> Regards,
>
>         Hans

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2012-09-19  9:04 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-18 18:54 [PATCH v4] media: v4l2-ctrl: add a helper function to add standard control with driver specific menu Prabhakar Lad
2012-09-19  7:53 ` Hans Verkuil
2012-09-19  9:04   ` Prabhakar Lad

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).