openvx_cvt disabled for Khronos, fixed sstep and dstep usage
authorRostislav Vasilikhin <rostislav.vasilikhin@intel.com>
Fri, 16 Dec 2016 20:00:55 +0000 (23:00 +0300)
committerRostislav Vasilikhin <rostislav.vasilikhin@intel.com>
Fri, 16 Dec 2016 20:00:55 +0000 (23:00 +0300)
modules/core/src/convert.cpp

index 1580033..e04d89e 100644 (file)
@@ -4644,31 +4644,50 @@ static bool _openvx_cvt(const T* src, size_t sstep,
 {
     using namespace ivx;
 
-    if(!(continuousSize.width > 0 && continuousSize.height > 0 && sstep > 0 && dstep > 0))
+    if(!(continuousSize.width > 0 && continuousSize.height > 0))
     {
         return true;
     }
 
-    CV_Assert(sstep / sizeof(T) == dstep / sizeof(DT));
-
     //.height is for number of continuous pieces
     //.width  is for length of one piece
     Size imgSize = continuousSize;
     if(continuousSize.height == 1)
     {
-        //continuous case
-        imgSize.width  = sstep / sizeof(T);
-        imgSize.height = continuousSize.width / (sstep / sizeof(T));
+        if(sstep / sizeof(T) == dstep / sizeof(DT) && sstep / sizeof(T) > 0 &&
+           continuousSize.width % (sstep / sizeof(T)) == 0)
+        {
+            //continuous n-lines image
+            imgSize.width  = sstep / sizeof(T);
+            imgSize.height = continuousSize.width / (sstep / sizeof(T));
+        }
+        else
+        {
+            //1-row image with possibly incorrect step
+            sstep = continuousSize.width * sizeof(T);
+            dstep = continuousSize.width * sizeof(DT);
+        }
     }
 
+    int srcType = DataType<T>::type, dstType = DataType<DT>::type;
+
     try
     {
         Context context = Context::create();
-        Image srcImage = Image::createFromHandle(context, Image::matTypeToFormat(DataType<T>::type),
+
+        // Other conversions are marked as "experimental"
+        if(context.vendorID() == VX_ID_KHRONOS &&
+           !(srcType == CV_8U  && dstType == CV_16S) &&
+           !(srcType == CV_16S && dstType == CV_8U))
+        {
+            return false;
+        }
+
+        Image srcImage = Image::createFromHandle(context, Image::matTypeToFormat(srcType),
                                                  Image::createAddressing(imgSize.width, imgSize.height,
                                                                          (vx_uint32)sizeof(T), (vx_uint32)sstep),
                                                  (void*)src);
-        Image dstImage = Image::createFromHandle(context, Image::matTypeToFormat(DataType<DT>::type),
+        Image dstImage = Image::createFromHandle(context, Image::matTypeToFormat(dstType),
                                                  Image::createAddressing(imgSize.width, imgSize.height,
                                                                          (vx_uint32)sizeof(DT), (vx_uint32)dstep),
                                                  (void*)dst);