Return false if ocl version not properly worked
authorvbystricky <user@user-pc.(none)>
Tue, 14 Jan 2014 13:53:28 +0000 (17:53 +0400)
committervbystricky <user@user-pc.(none)>
Fri, 17 Jan 2014 12:15:38 +0000 (16:15 +0400)
modules/video/src/optflowgf.cpp

index 9d156e9..b237e54 100644 (file)
@@ -605,7 +605,7 @@ public:
     double polySigma;
     int flags;
 
-    void operator ()(const UMat &frame0, const UMat &frame1, UMat &flowx, UMat &flowy)
+    bool operator ()(const UMat &frame0, const UMat &frame1, UMat &flowx, UMat &flowy)
     {
         CV_Assert(frame0.channels() == 1 && frame1.channels() == 1);
         CV_Assert(frame0.size() == frame1.size());
@@ -714,8 +714,10 @@ public:
 
             if (fastPyramids)
             {
-                polynomialExpansionOcl(pyramid0_[k], R[0]);
-                polynomialExpansionOcl(pyramid1_[k], R[1]);
+                if (!polynomialExpansionOcl(pyramid0_[k], R[0]))
+                    return false;
+                if (!polynomialExpansionOcl(pyramid1_[k], R[1]))
+                    return false;
             }
             else
             {
@@ -734,22 +736,31 @@ public:
 
                 for (int i = 0; i < 2; i++)
                 {
-                    gaussianBlurOcl(frames_[i], smoothSize/2, blurredFrame[i]);
+                    if (!gaussianBlurOcl(frames_[i], smoothSize/2, blurredFrame[i]))
+                        return false;
                     resize(blurredFrame[i], pyrLevel[i], Size(width, height), INTER_LINEAR);
-                    polynomialExpansionOcl(pyrLevel[i], R[i]);
+                    if (!polynomialExpansionOcl(pyrLevel[i], R[i]))
+                        return false;
                 }
             }
 
-            updateMatricesOcl(curFlowX, curFlowY, R[0], R[1], M);
+            if (!updateMatricesOcl(curFlowX, curFlowY, R[0], R[1], M))
+                return false;
 
             if (flags & OPTFLOW_FARNEBACK_GAUSSIAN)
                 setGaussianBlurKernel(winSize, winSize/2*0.3f);
             for (int i = 0; i < numIters; i++)
             {
                 if (flags & OPTFLOW_FARNEBACK_GAUSSIAN)
-                    updateFlow_gaussianBlur(R[0], R[1], curFlowX, curFlowY, M, bufM, winSize, i < numIters-1);
+                {
+                    if (!updateFlow_gaussianBlur(R[0], R[1], curFlowX, curFlowY, M, bufM, winSize, i < numIters-1))
+                        return false;
+                }
                 else
-                    updateFlow_boxFilter(R[0], R[1], curFlowX, curFlowY, M, bufM, winSize, i < numIters-1);
+                {
+                    if (!updateFlow_boxFilter(R[0], R[1], curFlowX, curFlowY, M, bufM, winSize, i < numIters-1))
+                        return false;
+                }
             }
 
             prevFlowX = curFlowX;
@@ -758,6 +769,7 @@ public:
 
         flowx = curFlowX;
         flowy = curFlowY;
+        return true;
     }
 
     void releaseMemory()
@@ -884,7 +896,7 @@ private:
         size_t globalsize[2] = { DIVUP(src.cols, localsize[0] - 2*polyN) * localsize[0], src.rows};
 
         const cv::ocl::Device &device = cv::ocl::Device::getDefault();
-        int useDouble = (0 != device.doubleFPConfig());
+        bool useDouble = (0 != device.doubleFPConfig());
 
         cv::String build_options = cv::format("-D polyN=%d -D USE_DOUBLE=%d", polyN, useDouble ? 1 : 0);
         ocl::Kernel kernel;
@@ -990,25 +1002,33 @@ private:
         return kernel.run(2, globalsize, localsize, false);
     }
 
-    void updateFlow_boxFilter(
+    bool updateFlow_boxFilter(
         const UMat& R0, const UMat& R1, UMat& flowx, UMat &flowy,
         UMat& M, UMat &bufM, int blockSize, bool updateMatrices)
     {
-        boxFilter5Ocl(M, blockSize/2, bufM);
+        if (!boxFilter5Ocl(M, blockSize/2, bufM))
+            return false;
         swap(M, bufM);
-        updateFlowOcl(M, flowx, flowy);
+        if (!updateFlowOcl(M, flowx, flowy))
+            return false;
         if (updateMatrices)
-            updateMatricesOcl(flowx, flowy, R0, R1, M);
+            if (!updateMatricesOcl(flowx, flowy, R0, R1, M))
+                return false;
+        return true;
     }
-    void updateFlow_gaussianBlur(
+    bool updateFlow_gaussianBlur(
         const UMat& R0, const UMat& R1, UMat& flowx, UMat& flowy,
         UMat& M, UMat &bufM, int blockSize, bool updateMatrices)
     {
-        gaussianBlur5Ocl(M, blockSize/2, bufM);
+        if (!gaussianBlur5Ocl(M, blockSize/2, bufM))
+            return false;
         swap(M, bufM);
-        updateFlowOcl(M, flowx, flowy);
+        if (!updateFlowOcl(M, flowx, flowy))
+            return false;
         if (updateMatrices)
-            updateMatricesOcl(flowx, flowy, R0, R1, M);
+            if (!updateMatricesOcl(flowx, flowy, R0, R1, M))
+                return false;
+        return true;
     }
 };
 
@@ -1043,7 +1063,8 @@ static bool ocl_calcOpticalFlowFarneback( InputArray _prev0, InputArray _next0,
         flowar.push_back(UMat());
         flowar.push_back(UMat());
     }
-    opticalFlow(_prev0.getUMat(), _next0.getUMat(), flowar[0], flowar[1]);
+    if (!opticalFlow(_prev0.getUMat(), _next0.getUMat(), flowar[0], flowar[1]))
+        return false;
     merge(flowar, _flow0);
     return true;
 }