workaround for ocl::absSum (eliminated error: unreachable executed)
authorIlya Lavrenov <ilya.lavrenov@itseez.com>
Mon, 18 Nov 2013 14:50:40 +0000 (18:50 +0400)
committerIlya Lavrenov <ilya.lavrenov@itseez.com>
Mon, 18 Nov 2013 16:38:39 +0000 (20:38 +0400)
modules/ocl/src/arithm.cpp

index 68c5269..8a2390d 100644 (file)
@@ -394,12 +394,16 @@ Scalar cv::ocl::sum(const oclMat &src)
 
 Scalar cv::ocl::absSum(const oclMat &src)
 {
-    if (!src.clCxt->supportsFeature(FEATURE_CL_DOUBLE) && src.depth() == CV_64F)
+    int sdepth = src.depth();
+    if (!src.clCxt->supportsFeature(FEATURE_CL_DOUBLE) && sdepth == CV_64F)
     {
         CV_Error(CV_OpenCLDoubleNotSupported, "Selected device doesn't support double");
         return cv::Scalar::all(0);
     }
 
+    if (sdepth == CV_8U || sdepth == CV_16U)
+        return sum(src);
+
     static sumFunc functab[3] =
     {
         arithmetic_sum<int>,
@@ -407,7 +411,7 @@ Scalar cv::ocl::absSum(const oclMat &src)
         arithmetic_sum<double>
     };
 
-    int ddepth = std::max(src.depth(), CV_32S);
+    int ddepth = std::max(sdepth, CV_32S);
     sumFunc func = functab[ddepth - CV_32S];
     return func(src, ABS_SUM, ddepth);
 }