Don't check for EINTR and replace xioctl with ioctl
authorAndrey Kamaev <andrey.kamaev@itseez.com>
Mon, 28 Jan 2013 13:58:57 +0000 (17:58 +0400)
committerAndrey Kamaev <andrey.kamaev@itseez.com>
Mon, 28 Jan 2013 13:58:57 +0000 (17:58 +0400)
This should be safe todo unless we are writing a signal handler.

CMakeLists.txt
cmake/OpenCVFindLibsVideo.cmake
cmake/templates/cvconfig.h.cmake
modules/highgui/src/cap_v4l.cpp

index c977f97..f2b088a 100644 (file)
@@ -136,7 +136,7 @@ OCV_OPTION(WITH_TBB            "Include Intel TBB support"                   OFF
 OCV_OPTION(WITH_CSTRIPES       "Include C= support"                          OFF  IF WIN32 )
 OCV_OPTION(WITH_TIFF           "Include TIFF support"                        ON   IF (NOT IOS) )
 OCV_OPTION(WITH_UNICAP         "Include Unicap support (GPL)"                OFF  IF (UNIX AND NOT APPLE AND NOT ANDROID) )
-OCV_OPTION(WITH_V4L            "Include Video 4 Linux support"               ON   IF (UNIX AND NOT APPLE AND NOT ANDROID) )
+OCV_OPTION(WITH_V4L            "Include Video 4 Linux support"               ON   IF (UNIX AND NOT ANDROID) )
 OCV_OPTION(WITH_VIDEOINPUT     "Build HighGUI with DirectShow support"       ON   IF WIN32 )
 OCV_OPTION(WITH_XIMEA          "Include XIMEA cameras support"               OFF  IF (NOT ANDROID AND NOT APPLE) )
 OCV_OPTION(WITH_XINE           "Include Xine support (GPL)"                  OFF  IF (UNIX AND NOT APPLE AND NOT ANDROID) )
@@ -722,13 +722,15 @@ if(DEFINED WITH_V4L)
   else()
     set(HAVE_CAMV4L_STR "NO")
   endif()
-  if(HAVE_CAMV4L2 OR HAVE_VIDEOIO)
+  if(HAVE_CAMV4L2)
     set(HAVE_CAMV4L2_STR "YES")
+  elseif(HAVE_VIDEOIO)
+    set(HAVE_CAMV4L2_STR "YES(videoio)")
   else()
     set(HAVE_CAMV4L2_STR "NO")
   endif()
   status("    V4L/V4L2:"       HAVE_LIBV4L         THEN "Using libv4l (ver ${ALIASOF_libv4l1_VERSION})"
-                                                                                                   ELSE "${HAVE_CAMV4L_STR}/${HAVE_CAMV4L2_STR}")
+                                                   ELSE "${HAVE_CAMV4L_STR}/${HAVE_CAMV4L2_STR}")
 endif(DEFINED WITH_V4L)
 
 if(DEFINED WITH_VIDEOINPUT)
index 323b1cb..4149185 100644 (file)
@@ -85,18 +85,12 @@ if(WITH_XINE)
 endif(WITH_XINE)
 
 # --- V4L ---
-ocv_clear_vars(HAVE_LIBV4L HAVE_CAMV4L HAVE_CAMV4L2 HAVE_IOCTL_ULONG)
+ocv_clear_vars(HAVE_LIBV4L HAVE_CAMV4L HAVE_CAMV4L2 HAVE_VIDEOIO)
 if(WITH_V4L)
   CHECK_MODULE(libv4l1 HAVE_LIBV4L)
   CHECK_INCLUDE_FILE(linux/videodev.h HAVE_CAMV4L)
   CHECK_INCLUDE_FILE(linux/videodev2.h HAVE_CAMV4L2)
   CHECK_INCLUDE_FILE(sys/videoio.h HAVE_VIDEOIO)
-  INCLUDE(CheckPrototypeDefinition)
-  CHECK_PROTOTYPE_DEFINITION(ioctl
-    "int ioctl(int d, unsigned long request, ...)"
-    "-1"
-    "sys/ioctl.h"
-    HAVE_IOCTL_ULONG)
 endif(WITH_V4L)
 
 # --- OpenNI ---
index dab3ec8..e44e135 100644 (file)
@@ -25,9 +25,6 @@
 /* V4L/V4L2 capturing support via libv4l */
 #cmakedefine HAVE_LIBV4L
 
-/* ioctl takes unsigned long request rather than int */
-#cmakedefine HAVE_IOCTL_ULONG
-
 /* Carbon windowing environment */
 #cmakedefine HAVE_CARBON
 
index 3510ca3..eacd744 100644 (file)
@@ -354,20 +354,6 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h);
 static int numCameras = 0;
 static int indexList = 0;
 
-#ifdef HAVE_IOCTL_ULONG
-static int xioctl( int fd, unsigned long request, void *arg)
-#else
-static int xioctl( int fd, int request, void *arg)
-#endif
-{
-  int r;
-
-  do r = ioctl (fd, request, arg);
-  while (-1 == r && EINTR == errno);
-
-  return r;
-}
-
 /* Simple test program: Find number of Video Sources available.
    Start from 0 and go to MAX_CAMERAS while checking for the device with that name.
    If it fails on the first attempt of /dev/video0, then check if /dev/video is valid.
@@ -431,7 +417,7 @@ static int try_palette_v4l2(CvCaptureCAM_V4L* capture, unsigned long colorspace)
   capture->form.fmt.pix.width = DEFAULT_V4L_WIDTH;
   capture->form.fmt.pix.height = DEFAULT_V4L_HEIGHT;
 
-  if (-1 == xioctl (capture->deviceHandle, VIDIOC_S_FMT, &capture->form))
+  if (-1 == ioctl (capture->deviceHandle, VIDIOC_S_FMT, &capture->form))
       return -1;
 
 
@@ -511,7 +497,7 @@ static int try_init_v4l2(CvCaptureCAM_V4L* capture, char *deviceName)
   }
 
   CLEAR (capture->cap);
-  if (-1 == xioctl (capture->deviceHandle, VIDIOC_QUERYCAP, &capture->cap))
+  if (-1 == ioctl (capture->deviceHandle, VIDIOC_QUERYCAP, &capture->cap))
   {
 #ifndef NDEBUG
     fprintf(stderr, "(DEBUG) try_init_v4l2 VIDIOC_QUERYCAP \"%s\": %s\n", deviceName, strerror(errno));
@@ -521,7 +507,7 @@ static int try_init_v4l2(CvCaptureCAM_V4L* capture, char *deviceName)
   }
 
   /* Query channels number */
-  if (-1 == xioctl (capture->deviceHandle, VIDIOC_G_INPUT, &deviceIndex))
+  if (-1 == ioctl (capture->deviceHandle, VIDIOC_G_INPUT, &deviceIndex))
   {
 #ifndef NDEBUG
     fprintf(stderr, "(DEBUG) try_init_v4l2 VIDIOC_G_INPUT \"%s\": %s\n", deviceName, strerror(errno));
@@ -533,7 +519,7 @@ static int try_init_v4l2(CvCaptureCAM_V4L* capture, char *deviceName)
   /* Query information about current input */
   CLEAR (capture->inp);
   capture->inp.index = deviceIndex;
-  if (-1 == xioctl (capture->deviceHandle, VIDIOC_ENUMINPUT, &capture->inp))
+  if (-1 == ioctl (capture->deviceHandle, VIDIOC_ENUMINPUT, &capture->inp))
   {
 #ifndef NDEBUG
     fprintf(stderr, "(DEBUG) try_init_v4l2 VIDIOC_ENUMINPUT \"%s\": %s\n", deviceName, strerror(errno));
@@ -655,7 +641,7 @@ static void v4l2_scan_controls_enumerate_menu(CvCaptureCAM_V4L* capture)
        (int)capture->querymenu.index <= capture->queryctrl.maximum;
        capture->querymenu.index++)
   {
-    if (0 == xioctl (capture->deviceHandle, VIDIOC_QUERYMENU,
+    if (0 == ioctl (capture->deviceHandle, VIDIOC_QUERYMENU,
                      &capture->querymenu))
     {
 //      printf (" %s\n", capture->querymenu.name);
@@ -679,7 +665,7 @@ static void v4l2_scan_controls(CvCaptureCAM_V4L* capture)
     CLEAR (capture->queryctrl);
     capture->queryctrl.id = ctrl_id;
 
-    if (0 == xioctl (capture->deviceHandle, VIDIOC_QUERYCTRL,
+    if (0 == ioctl (capture->deviceHandle, VIDIOC_QUERYCTRL,
                      &capture->queryctrl))
     {
 
@@ -749,7 +735,7 @@ static void v4l2_scan_controls(CvCaptureCAM_V4L* capture)
     CLEAR (capture->queryctrl);
     capture->queryctrl.id = ctrl_id;
 
-    if (0 == xioctl (capture->deviceHandle, VIDIOC_QUERYCTRL,
+    if (0 == ioctl (capture->deviceHandle, VIDIOC_QUERYCTRL,
                      &capture->queryctrl))
     {
 
@@ -872,7 +858,7 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName)
        capture->inp.index = CHANNEL_NUMBER;
        /* Set only channel number to CHANNEL_NUMBER */
        /* V4L2 have a status field from selected video mode */
-       if (-1 == xioctl (capture->deviceHandle, VIDIOC_ENUMINPUT, &capture->inp))
+       if (-1 == ioctl (capture->deviceHandle, VIDIOC_ENUMINPUT, &capture->inp))
        {
          fprintf (stderr, "HIGHGUI ERROR: V4L2: Aren't able to set channel number\n");
          icvCloseCAM_V4L (capture);
@@ -884,7 +870,7 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName)
    CLEAR (capture->form);
    capture->form.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
-   if (-1 == xioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form)) {
+   if (-1 == ioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form)) {
        fprintf( stderr, "HIGHGUI ERROR: V4L2: Could not obtain specifics of capture window.\n\n");
        icvCloseCAM_V4L(capture);
        return -1;
@@ -922,7 +908,7 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName)
    capture->req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    capture->req.memory = V4L2_MEMORY_MMAP;
 
-   if (-1 == xioctl (capture->deviceHandle, VIDIOC_REQBUFS, &capture->req))
+   if (-1 == ioctl (capture->deviceHandle, VIDIOC_REQBUFS, &capture->req))
    {
        if (EINVAL == errno)
        {
@@ -962,7 +948,7 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName)
        buf.memory = V4L2_MEMORY_MMAP;
        buf.index = n_buffers;
 
-       if (-1 == xioctl (capture->deviceHandle, VIDIOC_QUERYBUF, &buf)) {
+       if (-1 == ioctl (capture->deviceHandle, VIDIOC_QUERYBUF, &buf)) {
            perror ("VIDIOC_QUERYBUF");
 
            /* free capture, and returns an error code */
@@ -1201,7 +1187,7 @@ static int read_frame_v4l2(CvCaptureCAM_V4L* capture) {
     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
     buf.memory = V4L2_MEMORY_MMAP;
 
-    if (-1 == xioctl (capture->deviceHandle, VIDIOC_DQBUF, &buf)) {
+    if (-1 == ioctl (capture->deviceHandle, VIDIOC_DQBUF, &buf)) {
         switch (errno) {
         case EAGAIN:
             return 0;
@@ -1209,7 +1195,7 @@ static int read_frame_v4l2(CvCaptureCAM_V4L* capture) {
         case EIO:
         if (!(buf.flags & (V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE)))
         {
-          if (xioctl(capture->deviceHandle, VIDIOC_QBUF, &buf) == -1)
+          if (ioctl(capture->deviceHandle, VIDIOC_QBUF, &buf) == -1)
           {
             return 0;
           }
@@ -1232,7 +1218,7 @@ static int read_frame_v4l2(CvCaptureCAM_V4L* capture) {
    //printf("got data in buff %d, len=%d, flags=0x%X, seq=%d, used=%d)\n",
    //    buf.index, buf.length, buf.flags, buf.sequence, buf.bytesused);
 
-   if (-1 == xioctl (capture->deviceHandle, VIDIOC_QBUF, &buf))
+   if (-1 == ioctl (capture->deviceHandle, VIDIOC_QBUF, &buf))
        perror ("VIDIOC_QBUF");
 
    return 1;
@@ -1308,7 +1294,7 @@ static int icvGrabFrameCAM_V4L(CvCaptureCAM_V4L* capture) {
           buf.memory      = V4L2_MEMORY_MMAP;
           buf.index       = (unsigned long)capture->bufferIndex;
 
-          if (-1 == xioctl (capture->deviceHandle, VIDIOC_QBUF, &buf)) {
+          if (-1 == ioctl (capture->deviceHandle, VIDIOC_QBUF, &buf)) {
               perror ("VIDIOC_QBUF");
               return 0;
           }
@@ -1316,7 +1302,7 @@ static int icvGrabFrameCAM_V4L(CvCaptureCAM_V4L* capture) {
 
         /* enable the streaming */
         capture->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-        if (-1 == xioctl (capture->deviceHandle, VIDIOC_STREAMON,
+        if (-1 == ioctl (capture->deviceHandle, VIDIOC_STREAMON,
                           &capture->type)) {
             /* error enabling the stream */
             perror ("VIDIOC_STREAMON");
@@ -2301,7 +2287,7 @@ static double icvGetPropertyCAM_V4L (CvCaptureCAM_V4L* capture,
 
       CLEAR (capture->form);
       capture->form.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-      if (-1 == xioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form)) {
+      if (-1 == ioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form)) {
           /* display an error message, and return an error code */
           perror ("VIDIOC_G_FMT");
           return -1;
@@ -2342,7 +2328,7 @@ static double icvGetPropertyCAM_V4L (CvCaptureCAM_V4L* capture,
         return -1;
       }
 
-      if (-1 == xioctl (capture->deviceHandle, VIDIOC_G_CTRL,
+      if (-1 == ioctl (capture->deviceHandle, VIDIOC_G_CTRL,
                         &capture->control)) {
 
           fprintf( stderr, "HIGHGUI ERROR: V4L2: ");
@@ -2480,7 +2466,7 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h) {
     CLEAR (capture->cropcap);
     capture->cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
-    if (xioctl (capture->deviceHandle, VIDIOC_CROPCAP, &capture->cropcap) < 0) {
+    if (ioctl (capture->deviceHandle, VIDIOC_CROPCAP, &capture->cropcap) < 0) {
         fprintf(stderr, "HIGHGUI ERROR: V4L/V4L2: VIDIOC_CROPCAP\n");
     } else {
 
@@ -2489,7 +2475,7 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h) {
         capture->crop.c= capture->cropcap.defrect;
 
         /* set the crop area, but don't exit if the device don't support croping */
-        if (xioctl (capture->deviceHandle, VIDIOC_S_CROP, &capture->crop) < 0) {
+        if (ioctl (capture->deviceHandle, VIDIOC_S_CROP, &capture->crop) < 0) {
             fprintf(stderr, "HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP\n");
         }
     }
@@ -2498,7 +2484,7 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h) {
     capture->form.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
     /* read the current setting, mainly to retreive the pixelformat information */
-    xioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form);
+    ioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form);
 
     /* set the values we want to change */
     capture->form.fmt.pix.width = w;
@@ -2513,7 +2499,7 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h) {
      * don't test if the set of the size is ok, because some device
      * don't allow changing the size, and we will get the real size
      * later */
-    xioctl (capture->deviceHandle, VIDIOC_S_FMT, &capture->form);
+    ioctl (capture->deviceHandle, VIDIOC_S_FMT, &capture->form);
 
     /* try to set framerate to 30 fps */
     struct v4l2_streamparm setfps;
@@ -2521,14 +2507,14 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h) {
     setfps.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
     setfps.parm.capture.timeperframe.numerator = 1;
     setfps.parm.capture.timeperframe.denominator = 30;
-    xioctl (capture->deviceHandle, VIDIOC_S_PARM, &setfps);
+    ioctl (capture->deviceHandle, VIDIOC_S_PARM, &setfps);
 
     /* we need to re-initialize some things, like buffers, because the size has
      * changed */
     capture->FirstCapture = 1;
 
     /* Get window info again, to get the real value */
-    if (-1 == xioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form))
+    if (-1 == ioctl (capture->deviceHandle, VIDIOC_G_FMT, &capture->form))
     {
       fprintf(stderr, "HIGHGUI ERROR: V4L/V4L2: Could not obtain specifics of capture window.\n\n");
 
@@ -2628,7 +2614,7 @@ static int icvSetControl (CvCaptureCAM_V4L* capture,
     }
 
     /* get the min and max values */
-    if (-1 == xioctl (capture->deviceHandle,
+    if (-1 == ioctl (capture->deviceHandle,
                       VIDIOC_G_CTRL, &capture->control)) {
 //          perror ("VIDIOC_G_CTRL for getting min/max values");
           return -1;
@@ -2698,7 +2684,7 @@ static int icvSetControl (CvCaptureCAM_V4L* capture,
     capture->control.value = (int)(value * (v4l2_max - v4l2_min) + v4l2_min);
 
     /* The driver may clamp the value or return ERANGE, ignored here */
-    if (-1 == xioctl (capture->deviceHandle,
+    if (-1 == ioctl (capture->deviceHandle,
                       VIDIOC_S_CTRL, &capture->control) && errno != ERANGE) {
         perror ("VIDIOC_S_CTRL");
         return -1;