From f8bd4252dbaa5f4ff1438cbbd98abf002c4b00e6 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Thu, 19 Jan 2012 11:52:25 +0000 Subject: [PATCH] Tegra optimization for split, merge and some color conversions --- modules/core/src/convert.cpp | 8 ++++---- modules/imgproc/src/color.cpp | 13 ++++++++++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/modules/core/src/convert.cpp b/modules/core/src/convert.cpp index 25418ca196..aaf0f08094 100644 --- a/modules/core/src/convert.cpp +++ b/modules/core/src/convert.cpp @@ -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 }; } diff --git a/modules/imgproc/src/color.cpp b/modules/imgproc/src/color.cpp index f54dc77bcd..8b1adcf61b 100644 --- a/modules/imgproc/src/color.cpp +++ b/modules/imgproc/src/color.cpp @@ -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(scn, dcn, bidx)); + { +#ifdef HAVE_TEGRA_OPTIMIZATION + if(!tegra::cvtBGR2RGB(src, dst, bidx)) +#endif + CvtColorLoop(src, dst, RGB2RGB(scn, dcn, bidx)); + } else if( depth == CV_16U ) CvtColorLoop(src, dst, RGB2RGB(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 ||