Tegra optimization for split, merge and some color conversions
authorAndrey Kamaev <no@email>
Thu, 19 Jan 2012 11:52:25 +0000 (11:52 +0000)
committerAndrey Kamaev <no@email>
Thu, 19 Jan 2012 11:52:25 +0000 (11:52 +0000)
modules/core/src/convert.cpp
modules/imgproc/src/color.cpp

index 25418ca..aaf0f08 100644 (file)
@@ -196,14 +196,14 @@ typedef void (*MergeFunc)(const uchar** src, uchar* dst, int len, int cn);
 
 static SplitFunc splitTab[] =
 {
-    (SplitFunc)split8u, (SplitFunc)split8u, (SplitFunc)split16u, (SplitFunc)split16u,
-    (SplitFunc)split32s, (SplitFunc)split32s, (SplitFunc)split64s, 0
+    (SplitFunc)GET_OPTIMIZED(split8u), (SplitFunc)GET_OPTIMIZED(split8u), (SplitFunc)GET_OPTIMIZED(split16u), (SplitFunc)GET_OPTIMIZED(split16u),
+    (SplitFunc)GET_OPTIMIZED(split32s), (SplitFunc)GET_OPTIMIZED(split32s), (SplitFunc)GET_OPTIMIZED(split64s), 0
 };
 
 static MergeFunc mergeTab[] =
 {
-    (MergeFunc)merge8u, (MergeFunc)merge8u, (MergeFunc)merge16u, (MergeFunc)merge16u,
-    (MergeFunc)merge32s, (MergeFunc)merge32s, (MergeFunc)merge64s, 0
+    (MergeFunc)GET_OPTIMIZED(merge8u), (MergeFunc)GET_OPTIMIZED(merge8u), (MergeFunc)GET_OPTIMIZED(merge16u), (MergeFunc)GET_OPTIMIZED(merge16u),
+    (MergeFunc)GET_OPTIMIZED(merge32s), (MergeFunc)GET_OPTIMIZED(merge32s), (MergeFunc)GET_OPTIMIZED(merge64s), 0
 };
   
 }
index f54dc77..8b1adcf 100644 (file)
@@ -2858,7 +2858,12 @@ void cv::cvtColor( InputArray _src, OutputArray _dst, int code, int dcn )
             dst = _dst.getMat();
             
             if( depth == CV_8U )
-                CvtColorLoop(src, dst, RGB2RGB<uchar>(scn, dcn, bidx));
+            {
+#ifdef HAVE_TEGRA_OPTIMIZATION
+                if(!tegra::cvtBGR2RGB(src, dst, bidx))
+#endif
+                    CvtColorLoop(src, dst, RGB2RGB<uchar>(scn, dcn, bidx));
+            }
             else if( depth == CV_16U )
                 CvtColorLoop(src, dst, RGB2RGB<ushort>(scn, dcn, bidx));
             else
@@ -2870,6 +2875,12 @@ void cv::cvtColor( InputArray _src, OutputArray _dst, int code, int dcn )
             CV_Assert( (scn == 3 || scn == 4) && depth == CV_8U );
             _dst.create(sz, CV_8UC2);
             dst = _dst.getMat();
+
+#ifdef HAVE_TEGRA_OPTIMIZATION
+            if(code == CV_BGR2BGR565 || code == CV_BGRA2BGR565 || code == CV_RGB2BGR565  || code == CV_RGBA2BGR565)
+                if(tegra::cvtRGB2RGB565(src, dst, code == CV_RGB2BGR565 || code == CV_RGBA2BGR565 ? 0 : 2))
+                    break;
+#endif
         
             CvtColorLoop(src, dst, RGB2RGB5x5(scn,
                       code == CV_BGR2BGR565 || code == CV_BGR2BGR555 ||