Fix setting of FPS after frame width and height with DShow cameras
authorAndrey Kamaev <andrey.kamaev@itseez.com>
Fri, 1 Feb 2013 14:01:13 +0000 (18:01 +0400)
committerAndrey Kamaev <andrey.kamaev@itseez.com>
Fri, 1 Feb 2013 14:01:13 +0000 (18:01 +0400)
Issue #2114

modules/highgui/src/cap_dshow.cpp

index b1b142c..c2513d7 100644 (file)
@@ -3120,6 +3120,7 @@ protected:
     void init();
 
     int index, width, height,fourcc;
+    int widthSet, heightSet;
     IplImage* frame;
     static videoInput VI;
 };
@@ -3138,6 +3139,7 @@ CvCaptureCAM_DShow::CvCaptureCAM_DShow()
     index = -1;
     frame = 0;
     width = height = fourcc = -1;
+    widthSet = heightSet = -1;
     CoInitialize(0);
 }
 
@@ -3155,7 +3157,7 @@ void CvCaptureCAM_DShow::close()
         index = -1;
         cvReleaseImage(&frame);
     }
-    width = height = -1;
+    widthSet = heightSet = width = height = -1;
 }
 
 // Initialize camera input
@@ -3282,9 +3284,12 @@ bool CvCaptureCAM_DShow::setProperty( int property_id, double value )
         {
             VI.stopDevice(index);
             VI.setIdealFramerate(index,fps);
-            VI.setupDevice(index);
+            if (widthSet > 0 && heightSet > 0)
+                VI.setupDevice(index, widthSet, heightSet);
+            else
+                VI.setupDevice(index);
         }
-        break;
+        return VI.isDeviceSetup(index);
 
     }
 
@@ -3299,8 +3304,15 @@ bool CvCaptureCAM_DShow::setProperty( int property_id, double value )
                 VI.setIdealFramerate(index, fps);
                 VI.setupDeviceFourcc(index, width, height, fourcc);
             }
-            width = height = fourcc = -1;
-            return VI.isDeviceSetup(index);
+
+            bool success = VI.isDeviceSetup(index);
+            if (success)
+            {
+                widthSet = width;
+                heightSet = height;
+                width = height = fourcc = -1;
+            }
+            return success;
         }
         return true;
     }