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
