copyTo: fix for big data (4Gb+)
authorAlexander Alekhin <alexander.alekhin@itseez.com>
Thu, 25 Jun 2015 16:59:27 +0000 (19:59 +0300)
committerAlexander Alekhin <alexander.alekhin@itseez.com>
Thu, 25 Jun 2015 18:08:37 +0000 (21:08 +0300)
modules/core/src/copy.cpp

index 0d483ed..67b81c4 100644 (file)
@@ -288,11 +288,17 @@ void Mat::copyTo( OutputArray _dst ) const
             const uchar* sptr = data;
             uchar* dptr = dst.data;
 
+            CV_IPP_RUN(
+                    (size_t)cols*elemSize() <= (size_t)INT_MAX &&
+                    (size_t)step <= (size_t)INT_MAX &&
+                    (size_t)dst.step <= (size_t)INT_MAX
+                    ,
+                    ippiCopy_8u_C1R(sptr, (int)step, dptr, (int)dst.step, ippiSize((int)(cols*elemSize()), rows)) >= 0
+            )
+
             Size sz = getContinuousSize(*this, dst);
             size_t len = sz.width*elemSize();
 
-            CV_IPP_RUN(true, ippiCopy_8u_C1R(sptr, (int)step, dptr, (int)dst.step, ippiSize((int)len, sz.height)) >= 0)
-
             for( ; sz.height--; sptr += step, dptr += dst.step )
                 memcpy( dptr, sptr, len );
         }