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: v4l2-ctl/compliance: read and show the subdev client capabilities Author: Hans Verkuil <[email protected]> Date: Fri Dec 15 10:58:23 2023 +0100 Report the subdev client capabilities in v4l2-ctl and v4l2-compliance. Signed-off-by: Hans Verkuil <[email protected]> utils/common/v4l2-info.cpp | 16 +++++++++++++++- utils/common/v4l2-info.h | 6 +++++- utils/v4l2-compliance/v4l2-compliance.cpp | 6 +++++- utils/v4l2-ctl/v4l2-ctl.cpp | 11 ++++++++--- 4 files changed, 33 insertions(+), 6 deletions(-) --- http://git.linuxtv.org/cgit.cgi/v4l-utils.git/commit/?id=2b2ba7e0e86c4e33f485bfda931245e26bc04549 diff --git a/utils/common/v4l2-info.cpp b/utils/common/v4l2-info.cpp index ffcc2e87852b..72731bad8016 100644 --- a/utils/common/v4l2-info.cpp +++ b/utils/common/v4l2-info.cpp @@ -128,7 +128,8 @@ void v4l2_info_capability(const v4l2_capability &vcap) } } -void v4l2_info_subdev_capability(const v4l2_subdev_capability &subdevcap) +void v4l2_info_subdev_capability(const v4l2_subdev_capability &subdevcap, + const v4l2_subdev_client_capability &subdevclientcap) { printf("\tDriver version : %d.%d.%d\n", subdevcap.version >> 16, @@ -136,6 +137,8 @@ void v4l2_info_subdev_capability(const v4l2_subdev_capability &subdevcap) subdevcap.version & 0xff); printf("\tCapabilities : 0x%08x\n", subdevcap.capabilities); printf("%s", subdevcap2s(subdevcap.capabilities).c_str()); + printf("\tClient Capabilities: 0x%016llx\n", subdevclientcap.capabilities); + printf("%s", subdevclientcap2s(subdevclientcap.capabilities).c_str()); } std::string fcc2s(__u32 val) @@ -873,3 +876,14 @@ std::string modulation2s(unsigned modulation) } return "Unknown"; } + +std::string subdevclientcap2s(__u64 cap) +{ + std::string s; + + if (cap & V4L2_SUBDEV_CLIENT_CAP_STREAMS) + s += "streams "; + if (cap & V4L2_SUBDEV_CLIENT_CAP_INTERVAL_USES_WHICH) + s += "interval-uses-which "; + return s; +} diff --git a/utils/common/v4l2-info.h b/utils/common/v4l2-info.h index 2142952a27ff..ac227971b709 100644 --- a/utils/common/v4l2-info.h +++ b/utils/common/v4l2-info.h @@ -34,7 +34,8 @@ std::string flags2s(unsigned val, const flag_def *def); /* Print capability information */ void v4l2_info_capability(const v4l2_capability &cap); -void v4l2_info_subdev_capability(const v4l2_subdev_capability &subdevcap); +void v4l2_info_subdev_capability(const v4l2_subdev_capability &subdevcap, + const v4l2_subdev_client_capability &subdevclientcap); /* Return fourcc pixelformat string */ std::string fcc2s(__u32 val); @@ -157,4 +158,7 @@ std::string tcap2s(unsigned cap); /* Return band modulation description */ std::string modulation2s(unsigned modulation); +/* Return subdev client capabilities description */ +std::string subdevclientcap2s(__u64 cap); + #endif diff --git a/utils/v4l2-compliance/v4l2-compliance.cpp b/utils/v4l2-compliance/v4l2-compliance.cpp index b670b78d2c95..9e2c6983637a 100644 --- a/utils/v4l2-compliance/v4l2-compliance.cpp +++ b/utils/v4l2-compliance/v4l2-compliance.cpp @@ -973,6 +973,7 @@ void testNode(struct node &node, struct node &node_m2m_cap, struct node &expbuf_ struct node node2; struct v4l2_capability vcap = {}; struct v4l2_subdev_capability subdevcap = {}; + struct v4l2_subdev_client_capability subdevclientcap = {}; std::string driver; tests_total = tests_ok = warnings = 0; @@ -993,6 +994,9 @@ void testNode(struct node &node, struct node &node_m2m_cap, struct node &expbuf_ determine_codec_mask(node); } else if (node.is_subdev()) { doioctl(&node, VIDIOC_SUBDEV_QUERYCAP, &subdevcap); + subdevclientcap.capabilities = ~0ULL; + if (doioctl(&node, VIDIOC_SUBDEV_S_CLIENT_CAP, &subdevclientcap)) + subdevclientcap.capabilities = 0ULL; } else { memset(&vcap, 0, sizeof(vcap)); } @@ -1079,7 +1083,7 @@ void testNode(struct node &node, struct node &node_m2m_cap, struct node &expbuf_ } } else if (node.is_subdev()) { printf("Driver Info:\n"); - v4l2_info_subdev_capability(subdevcap); + v4l2_info_subdev_capability(subdevcap, subdevclientcap); } __u32 ent_id = 0; diff --git a/utils/v4l2-ctl/v4l2-ctl.cpp b/utils/v4l2-ctl/v4l2-ctl.cpp index 4cd84f78e134..e195ad8e4ded 100644 --- a/utils/v4l2-ctl/v4l2-ctl.cpp +++ b/utils/v4l2-ctl/v4l2-ctl.cpp @@ -1138,6 +1138,7 @@ int main(int argc, char **argv) const char *export_device = nullptr; struct v4l2_capability vcap = {}; struct v4l2_subdev_capability subdevcap = {}; + struct v4l2_subdev_client_capability subdevclientcap = {}; std::vector<event> events; unsigned secs = 0; char short_options[26 * 2 * 3 + 1]; @@ -1354,6 +1355,9 @@ int main(int argc, char **argv) // This ioctl was introduced in kernel 5.10, so don't // exit if this ioctl returns an error. doioctl(fd, VIDIOC_SUBDEV_QUERYCAP, &subdevcap); + subdevclientcap.capabilities = ~0ULL; + if (doioctl(fd, VIDIOC_SUBDEV_S_CLIENT_CAP, &subdevclientcap)) + subdevclientcap.capabilities = 0ULL; } if (!is_subdev) { capabilities = vcap.capabilities; @@ -1460,10 +1464,11 @@ int main(int argc, char **argv) if (options[OptGetDriverInfo]) { printf("Driver Info%s:\n", options[OptUseWrapper] ? " (using libv4l2)" : ""); - if (is_subdev) - v4l2_info_subdev_capability(subdevcap); - else + if (is_subdev) { + v4l2_info_subdev_capability(subdevcap, subdevclientcap); + } else { v4l2_info_capability(vcap); + } } if (options[OptGetDriverInfo] && media_fd >= 0) mi_media_info_for_fd(media_fd, fd); _______________________________________________ linuxtv-commits mailing list [email protected] https://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits
