void common_get(int fd) { if (options[OptGetCtrl] && !get_ctrls.empty()) { struct v4l2_ext_controls ctrls; class2ctrls_map class2ctrls; bool use_ext_ctrls = false; memset(&ctrls, 0, sizeof(ctrls)); for (ctrl_get_list::iterator iter = get_ctrls.begin(); iter != get_ctrls.end(); ++iter) { struct v4l2_ext_control ctrl; struct v4l2_query_ext_ctrl &qc = ctrl_str2q[*iter]; memset(&ctrl, 0, sizeof(ctrl)); ctrl.id = qc.id; if (qc.type == V4L2_CTRL_TYPE_INTEGER64) use_ext_ctrls = true; if (qc.flags & V4L2_CTRL_FLAG_HAS_PAYLOAD) { use_ext_ctrls = true; ctrl.size = qc.elems * qc.elem_size; ctrl.ptr = calloc(1, ctrl.size); } if (V4L2_CTRL_DRIVER_PRIV(ctrl.id)) use_ext_ctrls = true; class2ctrls[V4L2_CTRL_ID2CLASS(ctrl.id)].push_back(ctrl); } for (class2ctrls_map::iterator iter = class2ctrls.begin(); iter != class2ctrls.end(); ++iter) { if (!use_ext_ctrls && (iter->first == V4L2_CTRL_CLASS_USER || iter->first == V4L2_CID_PRIVATE_BASE)) { for (unsigned i = 0; i < iter->second.size(); i++) { struct v4l2_control ctrl; ctrl.id = iter->second[i].id; doioctl(fd, VIDIOC_G_CTRL, &ctrl); printf("%s: %d\n", ctrl_id2str[ctrl.id].c_str(), ctrl.value); } continue; } if (iter->second.size()) { ctrls.ctrl_class = iter->first; ctrls.count = iter->second.size(); ctrls.controls = &iter->second[0]; doioctl(fd, VIDIOC_G_EXT_CTRLS, &ctrls); for (unsigned i = 0; i < iter->second.size(); i++) { struct v4l2_ext_control ctrl = iter->second[i]; std::string &name = ctrl_id2str[ctrl.id]; struct v4l2_query_ext_ctrl &qc = ctrl_str2q[name]; if (qc.flags & V4L2_CTRL_FLAG_HAS_PAYLOAD) { switch (qc.type) { case V4L2_CTRL_TYPE_U8: case V4L2_CTRL_TYPE_U16: case V4L2_CTRL_TYPE_U32: print_array(qc, ctrl.ptr); break; case V4L2_CTRL_TYPE_STRING: printf("%s: '%s'\n", name.c_str(), safename(ctrl.string).c_str()); break; default: fprintf(stderr, "%s: unsupported payload type\n", qc.name); break; } } else printf("%s: %d\n", name.c_str(), ctrl.value); } } } } if (options[OptGetPriority]) { if (doioctl(fd, VIDIOC_G_PRIORITY, &prio) == 0) printf("Priority: %d\n", prio); } if (options[OptLogStatus]) { static char buf[40960]; int len = -1; if (doioctl(fd, VIDIOC_LOG_STATUS, NULL) == 0) { printf("\nStatus Log:\n\n"); #ifdef HAVE_KLOGCTL len = klogctl(3, buf, sizeof(buf) - 1); #endif if (len >= 0) { char *p = buf; char *q; buf[len] = 0; while ((q = strstr(p, "START STATUS"))) { p = q + 1; } if (p) { while (p > buf && *p != '<') p--; q = p; while ((q = strstr(q, "<6>"))) { memcpy(q, " ", 3); } printf("%s", p); } } } } }
static std::string safename(const char *name) { return safename((const unsigned char *)name); }
static void print_qctrl(int fd, struct v4l2_query_ext_ctrl *queryctrl, struct v4l2_ext_control *ctrl, int show_menus) { struct v4l2_querymenu qmenu; std::string s = name2var(queryctrl->name); unsigned i; memset(&qmenu, 0, sizeof(qmenu)); qmenu.id = queryctrl->id; switch (queryctrl->type) { case V4L2_CTRL_TYPE_INTEGER: printf("%31s (int) : min=%lld max=%lld step=%lld default=%lld", s.c_str(), queryctrl->minimum, queryctrl->maximum, queryctrl->step, queryctrl->default_value); break; case V4L2_CTRL_TYPE_INTEGER64: printf("%31s (int64) : min=%lld max=%lld step=%lld default=%lld", s.c_str(), queryctrl->minimum, queryctrl->maximum, queryctrl->step, queryctrl->default_value); break; case V4L2_CTRL_TYPE_STRING: printf("%31s (str) : min=%lld max=%lld step=%lld", s.c_str(), queryctrl->minimum, queryctrl->maximum, queryctrl->step); break; case V4L2_CTRL_TYPE_BOOLEAN: printf("%31s (bool) : default=%lld", s.c_str(), queryctrl->default_value); break; case V4L2_CTRL_TYPE_MENU: printf("%31s (menu) : min=%lld max=%lld default=%lld", s.c_str(), queryctrl->minimum, queryctrl->maximum, queryctrl->default_value); break; case V4L2_CTRL_TYPE_INTEGER_MENU: printf("%31s (intmenu): min=%lld max=%lld default=%lld", s.c_str(), queryctrl->minimum, queryctrl->maximum, queryctrl->default_value); break; case V4L2_CTRL_TYPE_BUTTON: printf("%31s (button) :", s.c_str()); break; case V4L2_CTRL_TYPE_BITMASK: printf("%31s (bitmask): max=0x%08llx default=0x%08llx", s.c_str(), queryctrl->maximum, queryctrl->default_value); break; case V4L2_CTRL_TYPE_U8: printf("%31s (u8) : min=%lld max=%lld step=%lld default=%lld", s.c_str(), queryctrl->minimum, queryctrl->maximum, queryctrl->step, queryctrl->default_value); break; case V4L2_CTRL_TYPE_U16: printf("%31s (u16) : min=%lld max=%lld step=%lld default=%lld", s.c_str(), queryctrl->minimum, queryctrl->maximum, queryctrl->step, queryctrl->default_value); break; case V4L2_CTRL_TYPE_U32: printf("%31s (u32) : min=%lld max=%lld step=%lld default=%lld", s.c_str(), queryctrl->minimum, queryctrl->maximum, queryctrl->step, queryctrl->default_value); break; default: printf("%31s (unknown): type=%x", s.c_str(), queryctrl->type); break; } if (queryctrl->nr_of_dims == 0) { switch (queryctrl->type) { case V4L2_CTRL_TYPE_INTEGER: case V4L2_CTRL_TYPE_BOOLEAN: case V4L2_CTRL_TYPE_MENU: case V4L2_CTRL_TYPE_INTEGER_MENU: printf(" value=%d", ctrl->value); break; case V4L2_CTRL_TYPE_BITMASK: printf(" value=0x%08x", ctrl->value); break; case V4L2_CTRL_TYPE_INTEGER64: printf(" value=%lld", ctrl->value64); break; case V4L2_CTRL_TYPE_STRING: printf(" value='%s'", safename(ctrl->string).c_str()); break; default: break; } } if (queryctrl->nr_of_dims) { printf(" "); for (i = 0; i < queryctrl->nr_of_dims; i++) printf("[%u]", queryctrl->dims[i]); } if (queryctrl->flags) printf(" flags=%s", ctrlflags2s(queryctrl->flags).c_str()); printf("\n"); if ((queryctrl->type == V4L2_CTRL_TYPE_MENU || queryctrl->type == V4L2_CTRL_TYPE_INTEGER_MENU) && show_menus) { for (i = queryctrl->minimum; i <= queryctrl->maximum; i++) { qmenu.index = i; if (test_ioctl(fd, VIDIOC_QUERYMENU, &qmenu)) continue; if (queryctrl->type == V4L2_CTRL_TYPE_MENU) printf("\t\t\t\t%d: %s\n", i, qmenu.name); else printf("\t\t\t\t%d: %lld (0x%llx)\n", i, qmenu.value, qmenu.value); } } }
void common_get(int fd) { if (options[OptGetCtrl] && !get_ctrls.empty()) { struct v4l2_ext_controls ctrls; class2ctrls_map class2ctrls; bool use_ext_ctrls = false; memset(&ctrls, 0, sizeof(ctrls)); for (ctrl_get_list::iterator iter = get_ctrls.begin(); iter != get_ctrls.end(); ++iter) { struct v4l2_ext_control ctrl; memset(&ctrl, 0, sizeof(ctrl)); ctrl.id = ctrl_str2q[*iter].id; if (ctrl_str2q[*iter].type == V4L2_CTRL_TYPE_INTEGER64) use_ext_ctrls = true; if (ctrl_str2q[*iter].type == V4L2_CTRL_TYPE_STRING) { use_ext_ctrls = true; ctrl.size = ctrl_str2q[*iter].maximum + 1; ctrl.string = (char *)malloc(ctrl.size); ctrl.string[0] = 0; } if (V4L2_CTRL_DRIVER_PRIV(ctrl.id)) use_ext_ctrls = true; class2ctrls[V4L2_CTRL_ID2CLASS(ctrl.id)].push_back(ctrl); } for (class2ctrls_map::iterator iter = class2ctrls.begin(); iter != class2ctrls.end(); ++iter) { if (!use_ext_ctrls && (iter->first == V4L2_CTRL_CLASS_USER || iter->first == V4L2_CID_PRIVATE_BASE)) { for (unsigned i = 0; i < iter->second.size(); i++) { struct v4l2_control ctrl; ctrl.id = iter->second[i].id; doioctl(fd, VIDIOC_G_CTRL, &ctrl); printf("%s: %d\n", ctrl_id2str[ctrl.id].c_str(), ctrl.value); } continue; } if (iter->second.size()) { ctrls.ctrl_class = iter->first; ctrls.count = iter->second.size(); ctrls.controls = &iter->second[0]; doioctl(fd, VIDIOC_G_EXT_CTRLS, &ctrls); for (unsigned i = 0; i < iter->second.size(); i++) { struct v4l2_ext_control ctrl = iter->second[i]; if (ctrl_str2q[ctrl_id2str[ctrl.id]].type == V4L2_CTRL_TYPE_STRING) printf("%s: '%s'\n", ctrl_id2str[ctrl.id].c_str(), safename(ctrl.string).c_str()); else printf("%s: %d\n", ctrl_id2str[ctrl.id].c_str(), ctrl.value); } } } } if (options[OptGetPriority]) { if (doioctl(fd, VIDIOC_G_PRIORITY, &prio) == 0) printf("Priority: %d\n", prio); } if (options[OptLogStatus]) { static char buf[40960]; int len = -1; if (doioctl(fd, VIDIOC_LOG_STATUS, NULL) == 0) { printf("\nStatus Log:\n\n"); #ifdef HAVE_KLOGCTL len = klogctl(3, buf, sizeof(buf) - 1); #endif if (len >= 0) { char *p = buf; char *q; buf[len] = 0; while ((q = strstr(p, "START STATUS"))) { p = q + 1; } if (p) { while (p > buf && *p != '<') p--; q = p; while ((q = strstr(q, "<6>"))) { memcpy(q, " ", 3); } printf("%s", p); } } } } }