This is an automatic generated email to let you know that the following patch 
were queued at the 
http://git.linuxtv.org/cgit.cgi/v4l-utils.git tree:

Subject: qv4l2/v4l2-ctl/v4l2-compliance: fix V4L2_CTRL_TYPE_BITMASK handling
Author:  Hans Verkuil <[email protected]>
Date:    Thu Sep 17 11:02:04 2015 +0200

The maximum and default_value field of a bitmask control are defined
as being unsigned instead of signed. This is normally not a problem,
but when you transform a struct v4l2_queryctrl to a struct v4l2_query_ext_ctrl
then you assign an s32 to an s64 and you get sign extension if bit 31 was
set.

So for bitmask controls the s32 should first be cast to a u32 before
assigning it to an s64. The same should be done for struct v4l2_event_ctrl
when the value and/or range changes and a control event is sent.

Signed-off-by: Hans Verkuil <[email protected]>

 utils/qv4l2/qv4l2.cpp               |    9 +++++++--
 utils/v4l2-compliance/v4l-helpers.h |    9 +++++++--
 utils/v4l2-ctl/v4l2-ctl-common.cpp  |   22 +++++++++++++++++-----
 3 files changed, 31 insertions(+), 9 deletions(-)

---

http://git.linuxtv.org/cgit.cgi/v4l-utils.git/commit/?id=4a57509a8334aca6ca8e81cd3beb08d5be397dac

diff --git a/utils/qv4l2/qv4l2.cpp b/utils/qv4l2/qv4l2.cpp
index 9133614..ccbeba1 100644
--- a/utils/qv4l2/qv4l2.cpp
+++ b/utils/qv4l2/qv4l2.cpp
@@ -499,9 +499,14 @@ void ApplicationWindow::ctrlEvent()
                        continue;
                m_ctrlMap[ev.id].flags = ev.u.ctrl.flags;
                m_ctrlMap[ev.id].minimum = ev.u.ctrl.minimum;
-               m_ctrlMap[ev.id].maximum = ev.u.ctrl.maximum;
+               if (m_ctrlMap[ev.id].type == V4L2_CTRL_TYPE_BITMASK) {
+                       m_ctrlMap[ev.id].maximum = (__u32)ev.u.ctrl.maximum;
+                       m_ctrlMap[ev.id].default_value = 
(__u32)ev.u.ctrl.default_value;
+               } else {
+                       m_ctrlMap[ev.id].maximum = ev.u.ctrl.maximum;
+                       m_ctrlMap[ev.id].default_value = 
ev.u.ctrl.default_value;
+               }
                m_ctrlMap[ev.id].step = ev.u.ctrl.step;
-               m_ctrlMap[ev.id].default_value = ev.u.ctrl.default_value;
 
                bool disabled = m_ctrlMap[ev.id].flags & CTRL_FLAG_DISABLED;
 
diff --git a/utils/v4l2-compliance/v4l-helpers.h 
b/utils/v4l2-compliance/v4l-helpers.h
index 44395c0..1e2ad54 100644
--- a/utils/v4l2-compliance/v4l-helpers.h
+++ b/utils/v4l2-compliance/v4l-helpers.h
@@ -1585,9 +1585,14 @@ static inline int v4l_query_ext_ctrl(v4l_fd *f, struct 
v4l2_query_ext_ctrl *qec,
        qec->type = qc.type;
        memcpy(qec->name, qc.name, sizeof(qec->name));
        qec->minimum = qc.minimum;
-       qec->maximum = qc.maximum;
+       if (qc.type == V4L2_CTRL_TYPE_BITMASK) {
+               qec->maximum = (__u32)qc.maximum;
+               qec->default_value = (__u32)qc.default_value;
+       } else {
+               qec->maximum = qc.maximum;
+               qec->default_value = qc.default_value;
+       }
        qec->step = qc.step;
-       qec->default_value = qc.default_value;
        qec->flags = qc.flags;
        qec->elems = 1;
        qec->nr_of_dims = 0;
diff --git a/utils/v4l2-ctl/v4l2-ctl-common.cpp 
b/utils/v4l2-ctl/v4l2-ctl-common.cpp
index 0531cfc..b7a9f8b 100644
--- a/utils/v4l2-ctl/v4l2-ctl-common.cpp
+++ b/utils/v4l2-ctl/v4l2-ctl-common.cpp
@@ -471,9 +471,14 @@ static int query_ext_ctrl_ioctl(int fd, struct 
v4l2_query_ext_ctrl &qctrl)
                qctrl.type = qc.type;
                memcpy(qctrl.name, qc.name, sizeof(qctrl.name));
                qctrl.minimum = qc.minimum;
-               qctrl.maximum = qc.maximum;
+               if (qc.type == V4L2_CTRL_TYPE_BITMASK) {
+                       qctrl.maximum = (__u32)qc.maximum;
+                       qctrl.default_value = (__u32)qc.default_value;
+               } else {
+                       qctrl.maximum = qc.maximum;
+                       qctrl.default_value = qc.default_value;
+               }
                qctrl.step = qc.step;
-               qctrl.default_value = qc.default_value;
                qctrl.flags = qc.flags;
                qctrl.elems = 1;
                qctrl.nr_of_dims = 0;
@@ -596,14 +601,21 @@ void common_control_event(const struct v4l2_event *ev)
        if (ctrl->changes & V4L2_EVENT_CTRL_CH_VALUE) {
                if (ctrl->type == V4L2_CTRL_TYPE_INTEGER64)
                        printf("\tvalue: %lld 0x%llx\n", ctrl->value64, 
ctrl->value64);
+               else if (ctrl->type == V4L2_CTRL_TYPE_BITMASK)
+                       printf("\tvalue: %u 0x%08x\n", ctrl->value, 
ctrl->value);
                else
                        printf("\tvalue: %d 0x%x\n", ctrl->value, ctrl->value);
        }
        if (ctrl->changes & V4L2_EVENT_CTRL_CH_FLAGS)
                printf("\tflags: %s\n", ctrlflags2s(ctrl->flags).c_str());
-       if (ctrl->changes & V4L2_EVENT_CTRL_CH_RANGE)
-               printf("\trange: min=%d max=%d step=%d default=%d\n",
-                       ctrl->minimum, ctrl->maximum, ctrl->step, 
ctrl->default_value);
+       if (ctrl->changes & V4L2_EVENT_CTRL_CH_RANGE) {
+               if (ctrl->type == V4L2_CTRL_TYPE_BITMASK)
+                       printf("\trange: max=0x%08x default=0x%08x\n",
+                               ctrl->maximum, ctrl->default_value);
+               else
+                       printf("\trange: min=%d max=%d step=%d default=%d\n",
+                               ctrl->minimum, ctrl->maximum, ctrl->step, 
ctrl->default_value);
+       }
 }
 
 static bool parse_subset(char *optarg)

_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to