Re: [RFC 01/17] v4l: Introduce integer menu controls

2012-01-06 Thread Sakari Ailus
Hi Laurent,

Laurent Pinchart wrote:
 Hi Sakari,
 
 Thanks for the patch.

Thanks for the review!

 On Tuesday 20 December 2011 21:27:53 Sakari Ailus wrote:
 From: Sakari Ailus sakari.ai...@iki.fi

 Create a new control type called V4L2_CTRL_TYPE_INTEGER_MENU. Integer menu
 controls are just like menu controls but the menu items are 64-bit integers
 rather than strings.
 
 [snip]
 
 diff --git a/drivers/media/video/v4l2-ctrls.c
 b/drivers/media/video/v4l2-ctrls.c index 0f415da..083bb79 100644
 --- a/drivers/media/video/v4l2-ctrls.c
 +++ b/drivers/media/video/v4l2-ctrls.c
 
 @@ -1775,16 +1797,22 @@ int v4l2_querymenu(struct v4l2_ctrl_handler *hdl,
 struct v4l2_querymenu *qm)

  qm-reserved = 0;
  /* Sanity checks */
 
 You should return -EINVAL here if the control is not of a menu type. It was 
 done implictly before by the ctrl-qmenu == NULL check, but that's now 
 conditioned to the control type being V4L2_CTRL_TYPE_MENU.

Good point. Fixed.

 -if (ctrl-qmenu == NULL ||
 +if ((ctrl-type == V4L2_CTRL_TYPE_MENU  ctrl-qmenu == NULL) ||
 +(ctrl-type == V4L2_CTRL_TYPE_INTEGER_MENU
 +  ctrl-qmenu_int == NULL) ||
  i  ctrl-minimum || i  ctrl-maximum)
  return -EINVAL;
  /* Use mask to see if this menu item should be skipped */
  if (ctrl-menu_skip_mask  (1  i))
  return -EINVAL;
  /* Empty menu items should also be skipped */
 -if (ctrl-qmenu[i] == NULL || ctrl-qmenu[i][0] == '\0')
 -return -EINVAL;
 -strlcpy(qm-name, ctrl-qmenu[i], sizeof(qm-name));
 +if (ctrl-type == V4L2_CTRL_TYPE_MENU) {
 +if (ctrl-qmenu[i] == NULL || ctrl-qmenu[i][0] == '\0')
 +return -EINVAL;
 +strlcpy(qm-name, ctrl-qmenu[i], sizeof(qm-name));
 +} else if (ctrl-type == V4L2_CTRL_TYPE_INTEGER_MENU) {
 
 And you can then replace the else if by an else.

As well as this one.

 +qm-value = ctrl-qmenu_int[i];
 +}
  return 0;
  }
  EXPORT_SYMBOL(v4l2_querymenu);
 


-- 
Sakari Ailus
sakari.ai...@maxwell.research.nokia.com
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC 01/17] v4l: Introduce integer menu controls

2012-01-05 Thread Laurent Pinchart
Hi Sakari,

Thanks for the patch.

On Tuesday 20 December 2011 21:27:53 Sakari Ailus wrote:
 From: Sakari Ailus sakari.ai...@iki.fi
 
 Create a new control type called V4L2_CTRL_TYPE_INTEGER_MENU. Integer menu
 controls are just like menu controls but the menu items are 64-bit integers
 rather than strings.

[snip]

 diff --git a/drivers/media/video/v4l2-ctrls.c
 b/drivers/media/video/v4l2-ctrls.c index 0f415da..083bb79 100644
 --- a/drivers/media/video/v4l2-ctrls.c
 +++ b/drivers/media/video/v4l2-ctrls.c

 @@ -1775,16 +1797,22 @@ int v4l2_querymenu(struct v4l2_ctrl_handler *hdl,
 struct v4l2_querymenu *qm)
 
   qm-reserved = 0;
   /* Sanity checks */

You should return -EINVAL here if the control is not of a menu type. It was 
done implictly before by the ctrl-qmenu == NULL check, but that's now 
conditioned to the control type being V4L2_CTRL_TYPE_MENU.

 - if (ctrl-qmenu == NULL ||
 + if ((ctrl-type == V4L2_CTRL_TYPE_MENU  ctrl-qmenu == NULL) ||
 + (ctrl-type == V4L2_CTRL_TYPE_INTEGER_MENU
 +   ctrl-qmenu_int == NULL) ||
   i  ctrl-minimum || i  ctrl-maximum)
   return -EINVAL;
   /* Use mask to see if this menu item should be skipped */
   if (ctrl-menu_skip_mask  (1  i))
   return -EINVAL;
   /* Empty menu items should also be skipped */
 - if (ctrl-qmenu[i] == NULL || ctrl-qmenu[i][0] == '\0')
 - return -EINVAL;
 - strlcpy(qm-name, ctrl-qmenu[i], sizeof(qm-name));
 + if (ctrl-type == V4L2_CTRL_TYPE_MENU) {
 + if (ctrl-qmenu[i] == NULL || ctrl-qmenu[i][0] == '\0')
 + return -EINVAL;
 + strlcpy(qm-name, ctrl-qmenu[i], sizeof(qm-name));
 + } else if (ctrl-type == V4L2_CTRL_TYPE_INTEGER_MENU) {

And you can then replace the else if by an else.

 + qm-value = ctrl-qmenu_int[i];
 + }
   return 0;
  }
  EXPORT_SYMBOL(v4l2_querymenu);

-- 
Regards,

Laurent Pinchart
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[RFC 01/17] v4l: Introduce integer menu controls

2011-12-20 Thread Sakari Ailus
From: Sakari Ailus sakari.ai...@iki.fi

Create a new control type called V4L2_CTRL_TYPE_INTEGER_MENU. Integer menu
controls are just like menu controls but the menu items are 64-bit integers
rather than strings.

Signed-off-by: Sakari Ailus sakari.ai...@iki.fi
---
 drivers/media/video/v4l2-ctrls.c |   60 +++--
 include/linux/videodev2.h|6 +++-
 include/media/v4l2-ctrls.h   |6 +++-
 3 files changed, 54 insertions(+), 18 deletions(-)

diff --git a/drivers/media/video/v4l2-ctrls.c b/drivers/media/video/v4l2-ctrls.c
index 0f415da..083bb79 100644
--- a/drivers/media/video/v4l2-ctrls.c
+++ b/drivers/media/video/v4l2-ctrls.c
@@ -804,7 +804,8 @@ static void fill_event(struct v4l2_event *ev, struct 
v4l2_ctrl *ctrl, u32 change
ev-u.ctrl.value64 = ctrl-cur.val64;
ev-u.ctrl.minimum = ctrl-minimum;
ev-u.ctrl.maximum = ctrl-maximum;
-   if (ctrl-type == V4L2_CTRL_TYPE_MENU)
+   if (ctrl-type == V4L2_CTRL_TYPE_MENU
+   || ctrl-type == V4L2_CTRL_TYPE_INTEGER_MENU)
ev-u.ctrl.step = 1;
else
ev-u.ctrl.step = ctrl-step;
@@ -1035,10 +1036,13 @@ static int validate_new_int(const struct v4l2_ctrl 
*ctrl, s32 *pval)
return 0;
 
case V4L2_CTRL_TYPE_MENU:
+   case V4L2_CTRL_TYPE_INTEGER_MENU:
if (val  ctrl-minimum || val  ctrl-maximum)
return -ERANGE;
-   if (ctrl-qmenu[val][0] == '\0' ||
-   (ctrl-menu_skip_mask  (1  val)))
+   if (ctrl-menu_skip_mask  (1  val))
+   return -EINVAL;
+   if (ctrl-type == V4L2_CTRL_TYPE_MENU 
+   ctrl-qmenu[val][0] == '\0')
return -EINVAL;
return 0;
 
@@ -1295,7 +1299,8 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct 
v4l2_ctrl_handler *hdl,
const struct v4l2_ctrl_ops *ops,
u32 id, const char *name, enum v4l2_ctrl_type type,
s32 min, s32 max, u32 step, s32 def,
-   u32 flags, const char * const *qmenu, void *priv)
+   u32 flags, const char * const *qmenu,
+   const s64 *qmenu_int, void *priv)
 {
struct v4l2_ctrl *ctrl;
unsigned sz_extra = 0;
@@ -1308,6 +1313,7 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct 
v4l2_ctrl_handler *hdl,
(type == V4L2_CTRL_TYPE_INTEGER  step == 0) ||
(type == V4L2_CTRL_TYPE_BITMASK  max == 0) ||
(type == V4L2_CTRL_TYPE_MENU  qmenu == NULL) ||
+   (type == V4L2_CTRL_TYPE_INTEGER_MENU  qmenu_int == NULL) ||
(type == V4L2_CTRL_TYPE_STRING  max == 0)) {
handler_set_err(hdl, -ERANGE);
return NULL;
@@ -1318,6 +1324,7 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct 
v4l2_ctrl_handler *hdl,
}
if ((type == V4L2_CTRL_TYPE_INTEGER ||
 type == V4L2_CTRL_TYPE_MENU ||
+type == V4L2_CTRL_TYPE_INTEGER_MENU ||
 type == V4L2_CTRL_TYPE_BOOLEAN) 
(def  min || def  max)) {
handler_set_err(hdl, -ERANGE);
@@ -1352,7 +1359,10 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct 
v4l2_ctrl_handler *hdl,
ctrl-minimum = min;
ctrl-maximum = max;
ctrl-step = step;
-   ctrl-qmenu = qmenu;
+   if (type == V4L2_CTRL_TYPE_MENU)
+   ctrl-qmenu = qmenu;
+   else if (type == V4L2_CTRL_TYPE_INTEGER_MENU)
+   ctrl-qmenu_int = qmenu_int;
ctrl-priv = priv;
ctrl-cur.val = ctrl-val = ctrl-default_value = def;
 
@@ -1379,6 +1389,7 @@ struct v4l2_ctrl *v4l2_ctrl_new_custom(struct 
v4l2_ctrl_handler *hdl,
struct v4l2_ctrl *ctrl;
const char *name = cfg-name;
const char * const *qmenu = cfg-qmenu;
+   const s64 *qmenu_int = cfg-qmenu_int;
enum v4l2_ctrl_type type = cfg-type;
u32 flags = cfg-flags;
s32 min = cfg-min;
@@ -1390,18 +1401,24 @@ struct v4l2_ctrl *v4l2_ctrl_new_custom(struct 
v4l2_ctrl_handler *hdl,
v4l2_ctrl_fill(cfg-id, name, type, min, max, step,
def, flags);
 
-   is_menu = (cfg-type == V4L2_CTRL_TYPE_MENU);
+   is_menu = (cfg-type == V4L2_CTRL_TYPE_MENU ||
+  cfg-type == V4L2_CTRL_TYPE_INTEGER_MENU);
if (is_menu)
WARN_ON(step);
else
WARN_ON(cfg-menu_skip_mask);
-   if (is_menu  qmenu == NULL)
+   if (cfg-type == V4L2_CTRL_TYPE_MENU  qmenu == NULL)
qmenu = v4l2_ctrl_get_menu(cfg-id);
+   else if (cfg-type == V4L2_CTRL_TYPE_INTEGER_MENU 
+qmenu_int == NULL) {
+   handler_set_err(hdl, -EINVAL);
+   return NULL;
+   }
 
ctrl = v4l2_ctrl_new(hdl, cfg-ops, cfg-id, name,
type, min, max,