This is an automatic generated email to let you know that the following patch 
were queued at the 
http://git.linuxtv.org/v4l-utils.git tree:

Subject: v4l2-compliance: add tests for VIDIOC_G/S_PARM.
Author:  Hans Verkuil <[email protected]>
Date:    Sat Apr 28 19:20:20 2012 +0200

Signed-off-by: Hans Verkuil <[email protected]>
(cherry picked from commit f55589da3f61350408a9714c6d676810c394a83d)

Signed-off-by: Gregor Jasny <[email protected]>

 utils/v4l2-compliance/v4l2-compliance.cpp   |    7 +-
 utils/v4l2-compliance/v4l2-compliance.h     |    1 +
 utils/v4l2-compliance/v4l2-test-formats.cpp |  113 ++++++++++++++++++++++++++-
 3 files changed, 116 insertions(+), 5 deletions(-)

---

http://git.linuxtv.org/v4l-utils.git?a=commitdiff;h=4655f2dc0ee9d8696ebdb915f03446a0b364e9de

diff --git a/utils/v4l2-compliance/v4l2-compliance.cpp 
b/utils/v4l2-compliance/v4l2-compliance.cpp
index f6b8045..3d5ffaf 100644
--- a/utils/v4l2-compliance/v4l2-compliance.cpp
+++ b/utils/v4l2-compliance/v4l2-compliance.cpp
@@ -609,19 +609,20 @@ int main(int argc, char **argv)
 
        printf("Format ioctls:\n");
        printf("\ttest VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: %s\n", 
ok(testEnumFormats(&node)));
+       printf("\ttest VIDIOC_G/S_PARM: %s\n", ok(testParm(&node)));
        printf("\ttest VIDIOC_G_FBUF: %s\n", ok(testFBuf(&node)));
        printf("\ttest VIDIOC_G_FMT: %s\n", ok(testFormats(&node)));
        printf("\ttest VIDIOC_G_SLICED_VBI_CAP: %s\n", 
ok(testSlicedVBICap(&node)));
 
        /* TODO:
 
-          VIDIOC_CROPCAP, VIDIOC_G/S_CROP
+          VIDIOC_CROPCAP, VIDIOC_G/S_CROP, VIDIOC_G/S_SELECTION
           VIDIOC_S_FBUF/OVERLAY
           VIDIOC_S/TRY_FMT
-          VIDIOC_G/S_PARM
           VIDIOC_(TRY_)ENCODER_CMD
+          VIDIOC_(TRY_)DECODER_CMD
           VIDIOC_G_ENC_INDEX
-          VIDIOC_REQBUFS/QBUF/DQBUF/QUERYBUF
+          VIDIOC_REQBUFS/QBUF/DQBUF/QUERYBUF/CREATE_BUFS/PREPARE_BUFS
           VIDIOC_STREAMON/OFF
 
           */
diff --git a/utils/v4l2-compliance/v4l2-compliance.h 
b/utils/v4l2-compliance/v4l2-compliance.h
index 2aa11f3..18a91e4 100644
--- a/utils/v4l2-compliance/v4l2-compliance.h
+++ b/utils/v4l2-compliance/v4l2-compliance.h
@@ -162,6 +162,7 @@ int testCustomTimings(struct node *node);
 
 // Format ioctl tests
 int testEnumFormats(struct node *node);
+int testParm(struct node *node);
 int testFBuf(struct node *node);
 int testFormats(struct node *node);
 int testSlicedVBICap(struct node *node);
diff --git a/utils/v4l2-compliance/v4l2-test-formats.cpp 
b/utils/v4l2-compliance/v4l2-test-formats.cpp
index 54e979f..c248850 100644
--- a/utils/v4l2-compliance/v4l2-test-formats.cpp
+++ b/utils/v4l2-compliance/v4l2-test-formats.cpp
@@ -375,8 +375,6 @@ static int testFormatsType(struct node *node, enum 
v4l2_buf_type type)
        if (ret)
                return fail("expected EINVAL, but got %d when getting format 
for buftype %d\n", ret, type);
        fail_on_test(fmt.type != type);
-       if (ret)
-               return 0;
        
        switch (type) {
        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
@@ -542,3 +540,114 @@ int testSlicedVBICap(struct node *node)
                return ret;
        return testSlicedVBICapType(node, V4L2_BUF_TYPE_VIDEO_CAPTURE);
 }
+
+static int testParmStruct(struct node *node, struct v4l2_streamparm &parm)
+{
+       struct v4l2_captureparm *cap = &parm.parm.capture;
+       struct v4l2_outputparm *out = &parm.parm.output;
+       int ret;
+
+       switch (parm.type) {
+       case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+       case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
+               ret = check_0(cap->reserved, sizeof(cap->reserved));
+               if (ret)
+                       return fail("reserved not zeroed\n");
+               fail_on_test(cap->readbuffers > VIDEO_MAX_FRAME);
+               if (!(node->caps & V4L2_CAP_READWRITE))
+                       fail_on_test(cap->readbuffers);
+               else if (node->caps & V4L2_CAP_STREAMING)
+                       fail_on_test(!cap->readbuffers);
+               fail_on_test(cap->capability & ~V4L2_CAP_TIMEPERFRAME);
+               fail_on_test(cap->capturemode & ~V4L2_MODE_HIGHQUALITY);
+               if (cap->capturemode & V4L2_MODE_HIGHQUALITY)
+                       warn("V4L2_MODE_HIGHQUALITY is poorly defined\n");
+               fail_on_test(cap->extendedmode);
+               if (cap->capability & V4L2_CAP_TIMEPERFRAME)
+                       fail_on_test(cap->timeperframe.numerator == 0 || 
cap->timeperframe.denominator == 0);
+               break;
+       case V4L2_BUF_TYPE_VIDEO_OUTPUT:
+       case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
+               ret = check_0(out->reserved, sizeof(out->reserved));
+               if (ret)
+                       return fail("reserved not zeroed\n");
+               fail_on_test(out->writebuffers > VIDEO_MAX_FRAME);
+               if (!(node->caps & V4L2_CAP_READWRITE))
+                       fail_on_test(out->writebuffers);
+               else if (node->caps & V4L2_CAP_STREAMING)
+                       fail_on_test(!out->writebuffers);
+               fail_on_test(out->capability & ~V4L2_CAP_TIMEPERFRAME);
+               fail_on_test(out->outputmode);
+               fail_on_test(out->extendedmode);
+               if (out->capability & V4L2_CAP_TIMEPERFRAME)
+                       fail_on_test(out->timeperframe.numerator == 0 || 
out->timeperframe.denominator == 0);
+               break;
+       default:
+               break;
+       }
+       return 0;
+}
+
+static int testParmType(struct node *node, enum v4l2_buf_type type)
+{
+       struct v4l2_streamparm parm;
+       int ret;
+
+       memset(&parm, 0, sizeof(parm));
+       parm.type = type;
+       ret = doioctl(node, VIDIOC_G_PARM, &parm);
+       if (ret == ENOTTY)
+               return ret;
+       if (ret == EINVAL)
+               return ENOTTY;
+       if (ret)
+               return fail("expected EINVAL, but got %d when getting parms for 
buftype %d\n", ret, type);
+       fail_on_test(parm.type != type);
+       ret = testParmStruct(node, parm);
+       if (ret)
+               return ret;
+
+       memset(&parm, 0, sizeof(parm));
+       parm.type = type;
+       ret = doioctl(node, VIDIOC_S_PARM, &parm);
+       if (ret == ENOTTY)
+               return 0;
+       if (ret)
+               return fail("got error %d when setting parms for buftype %d\n", 
ret, type);
+       fail_on_test(parm.type != type);
+       return testParmStruct(node, parm);
+}
+
+int testParm(struct node *node)
+{
+       bool supported = false;
+       int type;
+       int ret;
+
+       for (type = 0; type <= V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; type++) {
+               ret = testParmType(node, (enum v4l2_buf_type)type);
+
+               if (ret && ret != ENOTTY)
+                       return ret;
+               if (!ret) {
+                       supported = true;
+                       if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
+                           type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE &&
+                           type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE &&
+                           type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
+                               return fail("G/S_PARM is only allowed for video 
capture/output\n");
+                       if (!(node->caps & buftype2cap[type]))
+                               return fail("%s cap not set, but G/S_PARM 
worked\n",
+                                               buftype2s(type).c_str());
+               }
+       }
+
+       ret = testParmType(node, V4L2_BUF_TYPE_PRIVATE);
+       if (ret && ret != ENOTTY)
+               return ret;
+       if (!ret) {
+               supported = true;
+               warn("Buffer type PRIVATE allowed!\n");
+       }
+       return supported ? 0 : ENOTTY;
+}

_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to