diff mbox series

[v4,8/8] v4l2-ctl: Check for Streams API support

Message ID 20230421124428.393261-9-tomi.valkeinen@ideasonboard.com (mailing list archive)
State New, archived
Headers show
Series [v4,1/8] v4l2-ctl: Add routing and streams support | expand

Commit Message

Tomi Valkeinen April 21, 2023, 12:44 p.m. UTC
Return an error if the user tries to use streams related features, but
streams are not supported.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
 utils/v4l2-ctl/v4l2-ctl-subdev.cpp | 55 ++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

Comments

Laurent Pinchart April 24, 2023, 8:03 a.m. UTC | #1
Hi Tomi,

Thank you for the patch.

On Fri, Apr 21, 2023 at 03:44:28PM +0300, Tomi Valkeinen wrote:
> Return an error if the user tries to use streams related features, but
> streams are not supported.
> 
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>

> ---
>  utils/v4l2-ctl/v4l2-ctl-subdev.cpp | 55 ++++++++++++++++++++++++++++++
>  1 file changed, 55 insertions(+)
> 
> diff --git a/utils/v4l2-ctl/v4l2-ctl-subdev.cpp b/utils/v4l2-ctl/v4l2-ctl-subdev.cpp
> index 7ab64646..ec70b52b 100644
> --- a/utils/v4l2-ctl/v4l2-ctl-subdev.cpp
> +++ b/utils/v4l2-ctl/v4l2-ctl-subdev.cpp
> @@ -569,6 +569,11 @@ void subdev_set(cv4l_fd &_fd)
>  	if (options[OptSetSubDevFormat] || options[OptTrySubDevFormat]) {
>  		struct v4l2_subdev_format fmt;
>  
> +		if (!_fd.has_streams_support() && set_fmt_stream) {
> +			printf("Streams API not supported.\n");
> +			return;
> +		}
> +
>  		memset(&fmt, 0, sizeof(fmt));
>  		fmt.pad = set_fmt_pad;
>  		fmt.stream = set_fmt_stream;
> @@ -617,6 +622,11 @@ void subdev_set(cv4l_fd &_fd)
>  	if (options[OptSetSubDevSelection] || options[OptTrySubDevSelection]) {
>  		struct v4l2_subdev_selection sel;
>  
> +		if (!_fd.has_streams_support() && vsel.stream) {
> +			printf("Streams API not supported.\n");
> +			return;
> +		}
> +
>  		memset(&sel, 0, sizeof(sel));
>  		sel.pad = vsel.pad;
>  		sel.stream = vsel.stream;
> @@ -649,6 +659,11 @@ void subdev_set(cv4l_fd &_fd)
>  	if (options[OptSetSubDevFPS]) {
>  		struct v4l2_subdev_frame_interval fival;
>  
> +		if (!_fd.has_streams_support() && set_fps_stream) {
> +			printf("Streams API not supported.\n");
> +			return;
> +		}
> +
>  		memset(&fival, 0, sizeof(fival));
>  		fival.pad = set_fps_pad;
>  		fival.stream = set_fps_stream;
> @@ -674,6 +689,11 @@ void subdev_set(cv4l_fd &_fd)
>  		}
>  	}
>  	if (options[OptSetRouting]) {
> +		if (!_fd.has_streams_support()) {
> +			printf("Streams API not supported.\n");
> +			return;
> +		}
> +
>  		if (doioctl(fd, VIDIOC_SUBDEV_S_ROUTING, &routing) == 0)
>  			printf("Routing set\n");
>  	}
> @@ -731,6 +751,11 @@ void subdev_get(cv4l_fd &_fd)
>  	if (options[OptGetSubDevFormat]) {
>  		struct v4l2_subdev_format fmt;
>  
> +		if (!_fd.has_streams_support() && get_fmt_stream) {
> +			printf("Streams API not supported.\n");
> +			return;
> +		}
> +
>  		memset(&fmt, 0, sizeof(fmt));
>  		fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
>  		fmt.pad = get_fmt_pad;
> @@ -745,6 +770,11 @@ void subdev_get(cv4l_fd &_fd)
>  		struct v4l2_subdev_selection sel;
>  		unsigned idx = 0;
>  
> +		if (!_fd.has_streams_support() && get_sel_stream) {
> +			printf("Streams API not supported.\n");
> +			return;
> +		}
> +
>  		memset(&sel, 0, sizeof(sel));
>  		sel.which = V4L2_SUBDEV_FORMAT_ACTIVE;
>  		sel.pad = get_sel_pad;
> @@ -767,6 +797,11 @@ void subdev_get(cv4l_fd &_fd)
>  	if (options[OptGetSubDevFPS]) {
>  		struct v4l2_subdev_frame_interval fival;
>  
> +		if (!_fd.has_streams_support() && get_fps_stream) {
> +			printf("Streams API not supported.\n");
> +			return;
> +		}
> +
>  		memset(&fival, 0, sizeof(fival));
>  		fival.pad = get_fps_pad;
>  		fival.stream = get_fps_stream;
> @@ -784,6 +819,11 @@ void subdev_get(cv4l_fd &_fd)
>  	}
>  
>  	if (options[OptGetRouting]) {
> +		if (!_fd.has_streams_support()) {
> +			printf("Streams API not supported.\n");
> +			return;
> +		}
> +
>  		memset(&routing, 0, sizeof(routing));
>  		memset(routes, 0, sizeof(routes[0]) * NUM_ROUTES_MAX);
>  		routing.which = V4L2_SUBDEV_FORMAT_ACTIVE;
> @@ -867,11 +907,21 @@ void subdev_list(cv4l_fd &_fd)
>  	int fd = _fd.g_fd();
>  
>  	if (options[OptListSubDevMBusCodes]) {
> +		if (!_fd.has_streams_support() && list_mbus_codes_stream) {
> +			printf("Streams API not supported.\n");
> +			return;
> +		}
> +
>  		printf("ioctl: VIDIOC_SUBDEV_ENUM_MBUS_CODE (pad=%u,stream=%u)\n",
>  		       list_mbus_codes_pad, list_mbus_codes_stream);
>  		print_mbus_codes(fd, list_mbus_codes_pad, list_mbus_codes_stream);
>  	}
>  	if (options[OptListSubDevFrameSizes]) {
> +		if (!_fd.has_streams_support() && frmsize.stream) {
> +			printf("Streams API not supported.\n");
> +			return;
> +		}
> +
>  		printf("ioctl: VIDIOC_SUBDEV_ENUM_FRAME_SIZE (pad=%u,stream=%u)\n",
>  		       frmsize.pad, frmsize.stream);
>  		frmsize.index = 0;
> @@ -882,6 +932,11 @@ void subdev_list(cv4l_fd &_fd)
>  		}
>  	}
>  	if (options[OptListSubDevFrameIntervals]) {
> +		if (!_fd.has_streams_support() && frmival.stream) {
> +			printf("Streams API not supported.\n");
> +			return;
> +		}
> +
>  		printf("ioctl: VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL (pad=%u,stream=%u)\n",
>  		       frmival.pad, frmival.stream);
>  		frmival.index = 0;
diff mbox series

Patch

diff --git a/utils/v4l2-ctl/v4l2-ctl-subdev.cpp b/utils/v4l2-ctl/v4l2-ctl-subdev.cpp
index 7ab64646..ec70b52b 100644
--- a/utils/v4l2-ctl/v4l2-ctl-subdev.cpp
+++ b/utils/v4l2-ctl/v4l2-ctl-subdev.cpp
@@ -569,6 +569,11 @@  void subdev_set(cv4l_fd &_fd)
 	if (options[OptSetSubDevFormat] || options[OptTrySubDevFormat]) {
 		struct v4l2_subdev_format fmt;
 
+		if (!_fd.has_streams_support() && set_fmt_stream) {
+			printf("Streams API not supported.\n");
+			return;
+		}
+
 		memset(&fmt, 0, sizeof(fmt));
 		fmt.pad = set_fmt_pad;
 		fmt.stream = set_fmt_stream;
@@ -617,6 +622,11 @@  void subdev_set(cv4l_fd &_fd)
 	if (options[OptSetSubDevSelection] || options[OptTrySubDevSelection]) {
 		struct v4l2_subdev_selection sel;
 
+		if (!_fd.has_streams_support() && vsel.stream) {
+			printf("Streams API not supported.\n");
+			return;
+		}
+
 		memset(&sel, 0, sizeof(sel));
 		sel.pad = vsel.pad;
 		sel.stream = vsel.stream;
@@ -649,6 +659,11 @@  void subdev_set(cv4l_fd &_fd)
 	if (options[OptSetSubDevFPS]) {
 		struct v4l2_subdev_frame_interval fival;
 
+		if (!_fd.has_streams_support() && set_fps_stream) {
+			printf("Streams API not supported.\n");
+			return;
+		}
+
 		memset(&fival, 0, sizeof(fival));
 		fival.pad = set_fps_pad;
 		fival.stream = set_fps_stream;
@@ -674,6 +689,11 @@  void subdev_set(cv4l_fd &_fd)
 		}
 	}
 	if (options[OptSetRouting]) {
+		if (!_fd.has_streams_support()) {
+			printf("Streams API not supported.\n");
+			return;
+		}
+
 		if (doioctl(fd, VIDIOC_SUBDEV_S_ROUTING, &routing) == 0)
 			printf("Routing set\n");
 	}
@@ -731,6 +751,11 @@  void subdev_get(cv4l_fd &_fd)
 	if (options[OptGetSubDevFormat]) {
 		struct v4l2_subdev_format fmt;
 
+		if (!_fd.has_streams_support() && get_fmt_stream) {
+			printf("Streams API not supported.\n");
+			return;
+		}
+
 		memset(&fmt, 0, sizeof(fmt));
 		fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
 		fmt.pad = get_fmt_pad;
@@ -745,6 +770,11 @@  void subdev_get(cv4l_fd &_fd)
 		struct v4l2_subdev_selection sel;
 		unsigned idx = 0;
 
+		if (!_fd.has_streams_support() && get_sel_stream) {
+			printf("Streams API not supported.\n");
+			return;
+		}
+
 		memset(&sel, 0, sizeof(sel));
 		sel.which = V4L2_SUBDEV_FORMAT_ACTIVE;
 		sel.pad = get_sel_pad;
@@ -767,6 +797,11 @@  void subdev_get(cv4l_fd &_fd)
 	if (options[OptGetSubDevFPS]) {
 		struct v4l2_subdev_frame_interval fival;
 
+		if (!_fd.has_streams_support() && get_fps_stream) {
+			printf("Streams API not supported.\n");
+			return;
+		}
+
 		memset(&fival, 0, sizeof(fival));
 		fival.pad = get_fps_pad;
 		fival.stream = get_fps_stream;
@@ -784,6 +819,11 @@  void subdev_get(cv4l_fd &_fd)
 	}
 
 	if (options[OptGetRouting]) {
+		if (!_fd.has_streams_support()) {
+			printf("Streams API not supported.\n");
+			return;
+		}
+
 		memset(&routing, 0, sizeof(routing));
 		memset(routes, 0, sizeof(routes[0]) * NUM_ROUTES_MAX);
 		routing.which = V4L2_SUBDEV_FORMAT_ACTIVE;
@@ -867,11 +907,21 @@  void subdev_list(cv4l_fd &_fd)
 	int fd = _fd.g_fd();
 
 	if (options[OptListSubDevMBusCodes]) {
+		if (!_fd.has_streams_support() && list_mbus_codes_stream) {
+			printf("Streams API not supported.\n");
+			return;
+		}
+
 		printf("ioctl: VIDIOC_SUBDEV_ENUM_MBUS_CODE (pad=%u,stream=%u)\n",
 		       list_mbus_codes_pad, list_mbus_codes_stream);
 		print_mbus_codes(fd, list_mbus_codes_pad, list_mbus_codes_stream);
 	}
 	if (options[OptListSubDevFrameSizes]) {
+		if (!_fd.has_streams_support() && frmsize.stream) {
+			printf("Streams API not supported.\n");
+			return;
+		}
+
 		printf("ioctl: VIDIOC_SUBDEV_ENUM_FRAME_SIZE (pad=%u,stream=%u)\n",
 		       frmsize.pad, frmsize.stream);
 		frmsize.index = 0;
@@ -882,6 +932,11 @@  void subdev_list(cv4l_fd &_fd)
 		}
 	}
 	if (options[OptListSubDevFrameIntervals]) {
+		if (!_fd.has_streams_support() && frmival.stream) {
+			printf("Streams API not supported.\n");
+			return;
+		}
+
 		printf("ioctl: VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL (pad=%u,stream=%u)\n",
 		       frmival.pad, frmival.stream);
 		frmival.index = 0;