Attempt at fixing bug 3186
authorStevenPuttemans <steven.puttemans@lessius.eu>
Tue, 17 Sep 2013 11:05:28 +0000 (13:05 +0200)
committerStevenPuttemans <steven.puttemans@lessius.eu>
Mon, 23 Sep 2013 14:51:02 +0000 (16:51 +0200)
modules/highgui/src/cap_v4l.cpp

index 045c6f8..cfb1153 100644 (file)
@@ -248,6 +248,10 @@ make & enjoy!
 #define CHANNEL_NUMBER 1
 #define MAX_CAMERAS 8
 
+// Extra global values declared for error capture
+#define CAPV4L2_CAMERA_UNPLUGGED 2
+#define CAPV4L2_OK 1
+#define CAPV4L2_FAIL 0
 
 // default and maximum number of V4L buffers, not including last, 'special' buffer
 #define MAX_V4L_BUFFERS 10
@@ -1236,10 +1240,10 @@ static int read_frame_v4l2(CvCaptureCAM_V4L* capture) {
    //set timestamp in capture struct to be timestamp of most recent frame
    capture->timestamp = buf.timestamp;
 
-   return 1;
+   return CAPV4L2_CAMERA_UNPLUGGED;
 }
 
-static void mainloop_v4l2(CvCaptureCAM_V4L* capture) {
+static int mainloop_v4l2(CvCaptureCAM_V4L* capture) {
     unsigned int count;
 
     count = 1;
@@ -1273,8 +1277,11 @@ static void mainloop_v4l2(CvCaptureCAM_V4L* capture) {
                 break;
             }
 
-            if (read_frame_v4l2 (capture))
-                break;
+            switch(int readresult = read_frame_v4l2(capture) )
+                case CAM_UNPLUGGED:
+                  return CAPV4L2_FAIL;
+                default:
+                  return CAPV4L2_OK;
         }
     }
 }
@@ -1354,7 +1361,10 @@ static int icvGrabFrameCAM_V4L(CvCaptureCAM_V4L* capture) {
      {
         // skip first frame. it is often bad -- this is unnotied in traditional apps,
         //  but could be fatal if bad jpeg is enabled
-        mainloop_v4l2(capture);
+        if(!mainloop_v4l2(capture)){
+            fprintf( stderr, "HIGHGUI ERROR: V4L: Could not capture image.\n");
+            return 0;
+        }
      }
 #endif
 
@@ -1367,7 +1377,10 @@ static int icvGrabFrameCAM_V4L(CvCaptureCAM_V4L* capture) {
    if (V4L2_SUPPORT == 1)
    {
 
-     mainloop_v4l2(capture);
+    if(!mainloop_v4l2(capture)){
+        fprintf( stderr, "HIGHGUI ERROR: V4L: Could not capture image.\n");
+        return 0;
+    }
 
    }
 #endif /* HAVE_CAMV4L2 */