linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] v4l2-compliance: Basic support for array controls
@ 2015-09-16  9:30 Ricardo Ribalda Delgado
  2015-09-16  9:48 ` Hans Verkuil
  0 siblings, 1 reply; 2+ messages in thread
From: Ricardo Ribalda Delgado @ 2015-09-16  9:30 UTC (permalink / raw)
  To: hverkuil, linux-media; +Cc: Ricardo Ribalda Delgado

Without this patch:

Control ioctls:
	test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK
	test VIDIOC_QUERYCTRL: OK
	fail: v4l2-test-controls.cpp(411): g_ctrl returned an error (22)
	test VIDIOC_G/S_CTRL: FAIL
	fail: v4l2-test-controls.cpp(637): g_ext_ctrls returned an error (28)
	test VIDIOC_G/S/TRY_EXT_CTRLS: FAIL
	test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK
	test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
	Standard Controls: 55 Private Controls: 0

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
---
 utils/v4l2-compliance/v4l2-test-controls.cpp | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/utils/v4l2-compliance/v4l2-test-controls.cpp b/utils/v4l2-compliance/v4l2-test-controls.cpp
index 526905eef183..eba32a9f7855 100644
--- a/utils/v4l2-compliance/v4l2-test-controls.cpp
+++ b/utils/v4l2-compliance/v4l2-test-controls.cpp
@@ -377,6 +377,9 @@ int testSimpleControls(struct node *node)
 	for (iter = node->controls.begin(); iter != node->controls.end(); ++iter) {
 		test_query_ext_ctrl &qctrl = iter->second;
 
+		if (qctrl.elems > 1)
+			continue;
+
 		info("checking control '%s' (0x%08x)\n", qctrl.name, qctrl.id);
 		ctrl.id = qctrl.id;
 		if (qctrl.type == V4L2_CTRL_TYPE_INTEGER64 ||
@@ -518,6 +521,10 @@ static int checkExtendedCtrl(struct v4l2_ext_control &ctrl, struct test_query_ex
 
 	if (ctrl.id != qctrl.id)
 		return fail("control id mismatch\n");
+
+	if (qctrl.elems > 1)
+		return 0;
+
 	switch (qctrl.type) {
 	case V4L2_CTRL_TYPE_INTEGER:
 	case V4L2_CTRL_TYPE_INTEGER64:
@@ -620,7 +627,8 @@ int testExtendedControls(struct node *node)
 			ctrl.id = qctrl.id;
 			ctrl.value = qctrl.default_value;
 		} else {
-			if (ret != ENOSPC && qctrl.type == V4L2_CTRL_TYPE_STRING)
+			if (ret != ENOSPC &&
+				(qctrl.type == V4L2_CTRL_TYPE_STRING || qctrl.elems > 1 ))
 				return fail("did not check against size\n");
 			if (ret == ENOSPC && qctrl.type == V4L2_CTRL_TYPE_STRING) {
 				if (ctrls.error_idx != 0)
@@ -629,6 +637,10 @@ int testExtendedControls(struct node *node)
 				ctrl.size = qctrl.maximum + 1;
 				ret = doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls);
 			}
+			if (ret == ENOSPC && qctrl.elems > 1){
+				ctrl.ptr = new char[ctrl.size];
+				ret = doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls);
+			}
 			if (ret == EIO) {
 				warn("g_ext_ctrls returned EIO\n");
 				ret = 0;
@@ -668,7 +680,7 @@ int testExtendedControls(struct node *node)
 			if (checkExtendedCtrl(ctrl, qctrl))
 				return fail("s_ext_ctrls returned invalid control contents (%08x)\n", qctrl.id);
 		}
-		if (qctrl.type == V4L2_CTRL_TYPE_STRING)
+		if (qctrl.type == V4L2_CTRL_TYPE_STRING || qctrl.elems > 1)
 			delete [] ctrl.string;
 		ctrl.string = NULL;
 	}
@@ -708,6 +720,10 @@ int testExtendedControls(struct node *node)
 			ctrl.size = qctrl.maximum + 1;
 			ctrl.string = new char[ctrl.size];
 		}
+		if (qctrl.elems > 1){
+			ctrl.size = qctrl.elem_size * qctrl.elems;
+			ctrl.ptr = new char[ctrl.size];
+		}
 		ctrl.reserved2[0] = 0;
 		if (!ctrl_class)
 			ctrl_class = V4L2_CTRL_ID2CLASS(ctrl.id);
-- 
2.5.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] v4l2-compliance: Basic support for array controls
  2015-09-16  9:30 [PATCH] v4l2-compliance: Basic support for array controls Ricardo Ribalda Delgado
@ 2015-09-16  9:48 ` Hans Verkuil
  0 siblings, 0 replies; 2+ messages in thread
From: Hans Verkuil @ 2015-09-16  9:48 UTC (permalink / raw)
  To: Ricardo Ribalda Delgado, linux-media

On 09/16/2015 11:30 AM, Ricardo Ribalda Delgado wrote:
> Without this patch:
> 
> Control ioctls:
> 	test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK
> 	test VIDIOC_QUERYCTRL: OK
> 	fail: v4l2-test-controls.cpp(411): g_ctrl returned an error (22)

That's weird.

At the moment v4l2-compliance doesn't test compound controls at all (that really
should be added!). But it never should see them anyway since V4L2_CTRL_FLAG_NEXT_COMPOUND
is never used, so any compound controls should be ignored.

So why does v4l2-compliance see compound controls? Is there perhaps a bug in the
control framework?

Regards,

	Hans

> 	test VIDIOC_G/S_CTRL: FAIL
> 	fail: v4l2-test-controls.cpp(637): g_ext_ctrls returned an error (28)
> 	test VIDIOC_G/S/TRY_EXT_CTRLS: FAIL
> 	test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK
> 	test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
> 	Standard Controls: 55 Private Controls: 0
> 
> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
> ---
>  utils/v4l2-compliance/v4l2-test-controls.cpp | 20 ++++++++++++++++++--
>  1 file changed, 18 insertions(+), 2 deletions(-)
> 
> diff --git a/utils/v4l2-compliance/v4l2-test-controls.cpp b/utils/v4l2-compliance/v4l2-test-controls.cpp
> index 526905eef183..eba32a9f7855 100644
> --- a/utils/v4l2-compliance/v4l2-test-controls.cpp
> +++ b/utils/v4l2-compliance/v4l2-test-controls.cpp
> @@ -377,6 +377,9 @@ int testSimpleControls(struct node *node)
>  	for (iter = node->controls.begin(); iter != node->controls.end(); ++iter) {
>  		test_query_ext_ctrl &qctrl = iter->second;
>  
> +		if (qctrl.elems > 1)
> +			continue;
> +
>  		info("checking control '%s' (0x%08x)\n", qctrl.name, qctrl.id);
>  		ctrl.id = qctrl.id;
>  		if (qctrl.type == V4L2_CTRL_TYPE_INTEGER64 ||
> @@ -518,6 +521,10 @@ static int checkExtendedCtrl(struct v4l2_ext_control &ctrl, struct test_query_ex
>  
>  	if (ctrl.id != qctrl.id)
>  		return fail("control id mismatch\n");
> +
> +	if (qctrl.elems > 1)
> +		return 0;
> +
>  	switch (qctrl.type) {
>  	case V4L2_CTRL_TYPE_INTEGER:
>  	case V4L2_CTRL_TYPE_INTEGER64:
> @@ -620,7 +627,8 @@ int testExtendedControls(struct node *node)
>  			ctrl.id = qctrl.id;
>  			ctrl.value = qctrl.default_value;
>  		} else {
> -			if (ret != ENOSPC && qctrl.type == V4L2_CTRL_TYPE_STRING)
> +			if (ret != ENOSPC &&
> +				(qctrl.type == V4L2_CTRL_TYPE_STRING || qctrl.elems > 1 ))
>  				return fail("did not check against size\n");
>  			if (ret == ENOSPC && qctrl.type == V4L2_CTRL_TYPE_STRING) {
>  				if (ctrls.error_idx != 0)
> @@ -629,6 +637,10 @@ int testExtendedControls(struct node *node)
>  				ctrl.size = qctrl.maximum + 1;
>  				ret = doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls);
>  			}
> +			if (ret == ENOSPC && qctrl.elems > 1){
> +				ctrl.ptr = new char[ctrl.size];
> +				ret = doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls);
> +			}
>  			if (ret == EIO) {
>  				warn("g_ext_ctrls returned EIO\n");
>  				ret = 0;
> @@ -668,7 +680,7 @@ int testExtendedControls(struct node *node)
>  			if (checkExtendedCtrl(ctrl, qctrl))
>  				return fail("s_ext_ctrls returned invalid control contents (%08x)\n", qctrl.id);
>  		}
> -		if (qctrl.type == V4L2_CTRL_TYPE_STRING)
> +		if (qctrl.type == V4L2_CTRL_TYPE_STRING || qctrl.elems > 1)
>  			delete [] ctrl.string;
>  		ctrl.string = NULL;
>  	}
> @@ -708,6 +720,10 @@ int testExtendedControls(struct node *node)
>  			ctrl.size = qctrl.maximum + 1;
>  			ctrl.string = new char[ctrl.size];
>  		}
> +		if (qctrl.elems > 1){
> +			ctrl.size = qctrl.elem_size * qctrl.elems;
> +			ctrl.ptr = new char[ctrl.size];
> +		}
>  		ctrl.reserved2[0] = 0;
>  		if (!ctrl_class)
>  			ctrl_class = V4L2_CTRL_ID2CLASS(ctrl.id);
> 


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-09-16  9:49 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-16  9:30 [PATCH] v4l2-compliance: Basic support for array controls Ricardo Ribalda Delgado
2015-09-16  9:48 ` Hans Verkuil

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).