From 6880dbfd95a4796eae1b590f2080c4e696f0e3f9 Mon Sep 17 00:00:00 2001 From: Elena Gvozdeva Date: Wed, 16 Apr 2014 14:31:44 +0400 Subject: [PATCH 1/4] IPP: cv::dct --- modules/core/perf/perf_dft.cpp | 31 +++++++ modules/core/src/dxt.cpp | 155 ++++++++++++++++++++++++++++----- 2 files changed, 165 insertions(+), 21 deletions(-) diff --git a/modules/core/perf/perf_dft.cpp b/modules/core/perf/perf_dft.cpp index a2d3d503d1..f3e1d24e36 100644 --- a/modules/core/perf/perf_dft.cpp +++ b/modules/core/perf/perf_dft.cpp @@ -6,6 +6,8 @@ using namespace perf; using std::tr1::make_tuple; using std::tr1::get; +///////////////////////////////////////////////////////dft////////////////////////////////////////////////////////////// + #define MAT_TYPES_DFT CV_32FC1, CV_32FC2, CV_64FC1 #define MAT_SIZES_DFT cv::Size(320, 480), cv::Size(800, 600), cv::Size(1280, 1024), sz1080p, sz2K CV_ENUM(FlagsType, 0, DFT_INVERSE, DFT_SCALE, DFT_COMPLEX_OUTPUT, DFT_ROWS, DFT_INVERSE|DFT_COMPLEX_OUTPUT) @@ -27,5 +29,34 @@ PERF_TEST_P(Size_MatType_FlagsType, dft, TEST_MATS_DFT) TEST_CYCLE() dft(src, dst, flags); + SANITY_CHECK(dst, 1e-5, ERROR_RELATIVE); + +///////////////////////////////////////////////////////dct////////////////////////////////////////////////////// + +CV_ENUM(FlagsType, 0, DCT_INVERSE , DCT_ROWS, DCT_INVERSE|DCT_ROWS) + +typedef std::tr1::tuple Size_MatType_Flag_t; +typedef perf::TestBaseWithParam Size_MatType_Flag; + +PERF_TEST_P(Size_MatType_Flag, dct, testing::Combine( + testing::Values(cv::Size(320, 240),cv::Size(800, 600), + cv::Size(1024, 768), cv::Size(1280, 1024), + sz1080p, sz2K), + testing::Values(CV_32FC1, CV_64FC1), FlagsType::all())) +{ + Size sz = get<0>(GetParam()); + int type = get<1>(GetParam()); + int flags = get<2>(GetParam()); + + Mat src(sz, type); + Mat dst(sz, type); + + declare + .in(src, WARMUP_RNG) + .out(dst) + .time(60); + + TEST_CYCLE() dct(src, dst,flags); + SANITY_CHECK(dst, 1e-5, ERROR_RELATIVE); } \ No newline at end of file diff --git a/modules/core/src/dxt.cpp b/modules/core/src/dxt.cpp index 0c12e1948a..f7ee8dc8c4 100644 --- a/modules/core/src/dxt.cpp +++ b/modules/core/src/dxt.cpp @@ -2880,6 +2880,132 @@ static void IDCT_64f(const double* src, int src_step, double* dft_src, double* d } +namespace cv +{ +#if defined HAVE_IPP && IPP_VERSION_MAJOR >= 7 + +typedef IppStatus (CV_STDCALL * ippiDCTFwdFunc)(const Ipp32f*, int, Ipp32f*, int, const IppiDCTFwdSpec_32f*, Ipp8u*); +typedef IppStatus (CV_STDCALL * ippiDCTInvFunc)(const Ipp32f*, int, Ipp32f*, int, const IppiDCTInvSpec_32f*, Ipp8u*); + +static bool ippi_DCT_Fwd(const Mat& src, Mat& dst, bool row) +{ + if (src.type() != CV_32F) + return false; + + IppStatus status; + IppiDCTFwdSpec_32f* pDCTSpec; + Ipp8u *pBuffer; + int bufSize=0; + + ippiDCTFwdFunc ippFunc = (ippiDCTFwdFunc)ippiDCTFwd_32f_C1R; + + if (ippFunc==0) + return false; + + IppiSize srcRoiSize = {src.cols, row ? 1 : src.rows}; + + CV_SUPPRESS_DEPRECATED_START + status = ippiDCTFwdInitAlloc_32f (&pDCTSpec, srcRoiSize, ippAlgHintNone); + + if ( status < 0 ) + { + ippiDCTFwdFree_32f(pDCTSpec); + return false; + } + + status = ippiDCTFwdGetBufSize_32f (pDCTSpec, &bufSize); + if ( status < 0 ) + { + ippiDCTFwdFree_32f(pDCTSpec); + return false; + } + + pBuffer = ippsMalloc_8u( bufSize ); + + if (row) + { + for (int i=0; i= 0; +} + +static bool ippi_DCT_Inv(const Mat& src, Mat& dst, bool row) +{ + if (src.type() != CV_32F) + return false; + + IppStatus status; + IppiDCTInvSpec_32f* pDCTSpec; + Ipp8u *pBuffer; + int bufSize=0; + + ippiDCTInvFunc ippFunc = (ippiDCTInvFunc)ippiDCTInv_32f_C1R; + + if (ippFunc==0) + return false; + + IppiSize srcRoiSize = {src.cols, row ? 1 : src.rows}; + + CV_SUPPRESS_DEPRECATED_START + status = ippiDCTInvInitAlloc_32f (&pDCTSpec, srcRoiSize, ippAlgHintNone); + + if ( status < 0 ) + { + ippiDCTInvFree_32f(pDCTSpec); + return false; + } + + status = ippiDCTInvGetBufSize_32f (pDCTSpec, &bufSize); + if ( status < 0 ) + { + ippiDCTInvFree_32f(pDCTSpec); + return false; + } + + pBuffer = ippsMalloc_8u( bufSize ); + + if (row) + { + for (int i=0; i= 0; +} + +#endif +} + void cv::dct( InputArray _src0, OutputArray _dst, int flags ) { static DCTFunc dct_tbl[4] = @@ -2910,6 +3036,14 @@ void cv::dct( InputArray _src0, OutputArray _dst, int flags ) _dst.create( src.rows, src.cols, type ); Mat dst = _dst.getMat(); +#if defined HAVE_IPP && IPP_VERSION_MAJOR >= 7 + bool row = (flags & DCT_ROWS) != 0; + if (inv && ippi_DCT_Inv(src,dst,row)) + return; + if(ippi_DCT_Fwd(src,dst,row)) + return; +#endif + DCTFunc dct_func = dct_tbl[(int)inv + (depth == CV_64F)*2]; if( (flags & DCT_ROWS) || src.rows == 1 || @@ -2962,27 +3096,6 @@ void cv::dct( InputArray _src0, OutputArray _dst, int flags ) spec = 0; inplace_transform = 1; - /*if( len*count >= 64 && DFTInitAlloc_R_32f_p ) - { - int ipp_sz = 0; - if( depth == CV_32F ) - { - if( spec_dft ) - IPPI_CALL( DFTFree_R_32f_p( spec_dft )); - IPPI_CALL( DFTInitAlloc_R_32f_p( &spec_dft, len, 8, cvAlgHintNone )); - IPPI_CALL( DFTGetBufSize_R_32f_p( spec_dft, &ipp_sz )); - } - else - { - if( spec_dft ) - IPPI_CALL( DFTFree_R_64f_p( spec_dft )); - IPPI_CALL( DFTInitAlloc_R_64f_p( &spec_dft, len, 8, cvAlgHintNone )); - IPPI_CALL( DFTGetBufSize_R_64f_p( spec_dft, &ipp_sz )); - } - spec = spec_dft; - sz += ipp_sz; - } - else*/ { sz += len*(complex_elem_size + sizeof(int)) + complex_elem_size; From 16629bff4cff3db73100306dff45d79c29f17a1e Mon Sep 17 00:00:00 2001 From: Elena Gvozdeva Date: Mon, 21 Apr 2014 12:43:26 +0400 Subject: [PATCH 2/4] Added parallel version for DCT_ROWS --- modules/core/src/dxt.cpp | 228 +++++++++++++++------------ modules/imgproc/src/distransform.cpp | 2 +- 2 files changed, 130 insertions(+), 100 deletions(-) diff --git a/modules/core/src/dxt.cpp b/modules/core/src/dxt.cpp index f7ee8dc8c4..a5976a3cc4 100644 --- a/modules/core/src/dxt.cpp +++ b/modules/core/src/dxt.cpp @@ -2882,125 +2882,153 @@ static void IDCT_64f(const double* src, int src_step, double* dft_src, double* d namespace cv { -#if defined HAVE_IPP && IPP_VERSION_MAJOR >= 7 +#if defined HAVE_IPP && IPP_VERSION_MAJOR >= 7 && !defined HAVE_IPP_ICV_ONLY -typedef IppStatus (CV_STDCALL * ippiDCTFwdFunc)(const Ipp32f*, int, Ipp32f*, int, const IppiDCTFwdSpec_32f*, Ipp8u*); -typedef IppStatus (CV_STDCALL * ippiDCTInvFunc)(const Ipp32f*, int, Ipp32f*, int, const IppiDCTInvSpec_32f*, Ipp8u*); +typedef IppStatus (CV_STDCALL * ippiDCTFunc)(const Ipp32f*, int, Ipp32f*, int, const void*, Ipp8u*); +typedef IppStatus (CV_STDCALL * ippiDCTInitAlloc)(void**, IppiSize, IppHintAlgorithm); +typedef IppStatus (CV_STDCALL * ippiDCTFree)(void* pDCTSpec); +typedef IppStatus (CV_STDCALL * ippiDCTGetBufSize)(const void*, int*); -static bool ippi_DCT_Fwd(const Mat& src, Mat& dst, bool row) +template +class DctIPPLoop_Invoker : public ParallelLoopBody { - if (src.type() != CV_32F) - return false; +public: - IppStatus status; - IppiDCTFwdSpec_32f* pDCTSpec; - Ipp8u *pBuffer; - int bufSize=0; - - ippiDCTFwdFunc ippFunc = (ippiDCTFwdFunc)ippiDCTFwd_32f_C1R; - - if (ippFunc==0) - return false; - - IppiSize srcRoiSize = {src.cols, row ? 1 : src.rows}; - - CV_SUPPRESS_DEPRECATED_START - status = ippiDCTFwdInitAlloc_32f (&pDCTSpec, srcRoiSize, ippAlgHintNone); - - if ( status < 0 ) + DctIPPLoop_Invoker(const Mat& _src, Mat& _dst, const Dct& _ippidct, bool _inv, bool *_ok) : + ParallelLoopBody(), src(_src), dst(_dst), ippidct(_ippidct), inv(_inv), ok(_ok) { - ippiDCTFwdFree_32f(pDCTSpec); - return false; + *ok = true; } - status = ippiDCTFwdGetBufSize_32f (pDCTSpec, &bufSize); - if ( status < 0 ) + virtual void operator()(const Range& range) const { - ippiDCTFwdFree_32f(pDCTSpec); - return false; - } + IppStatus status; + void* pDCTSpec; + AutoBuffer buf; + uchar* pBuffer = 0; + int bufSize=0; - pBuffer = ippsMalloc_8u( bufSize ); + IppiSize srcRoiSize = {src.cols, 1}; - if (row) - { - for (int i=0; i= 0; + const DctIPPLoop_Invoker& operator= (const DctIPPLoop_Invoker&); +}; + +template +bool DctIPPLoop(const Mat& src, Mat& dst, const Dct& ippidct, bool inv) +{ + bool ok; + parallel_for_(Range(0, src.rows), DctIPPLoop_Invoker(src, dst, ippidct, inv, &ok), src.total()/(double)(1<<16) ); + return ok; } -static bool ippi_DCT_Inv(const Mat& src, Mat& dst, bool row) +struct IPPDCTFunctor +{ + IPPDCTFunctor(ippiDCTFunc _func) : func(_func){} + + bool operator()(const Ipp32f* src, int srcStep, Ipp32f* dst, int dstStep, const void* pDCTSpec, Ipp8u* pBuffer) const + { + return func ? func(src, srcStep, dst, dstStep, pDCTSpec, pBuffer) >= 0 : false; + } +private: + ippiDCTFunc func; +}; + +static bool ippi_DCT(const Mat& src, Mat& dst, bool inv, bool row) { if (src.type() != CV_32F) return false; - IppStatus status; - IppiDCTInvSpec_32f* pDCTSpec; - Ipp8u *pBuffer; - int bufSize=0; - - ippiDCTInvFunc ippFunc = (ippiDCTInvFunc)ippiDCTInv_32f_C1R; - - if (ippFunc==0) - return false; - - IppiSize srcRoiSize = {src.cols, row ? 1 : src.rows}; - - CV_SUPPRESS_DEPRECATED_START - status = ippiDCTInvInitAlloc_32f (&pDCTSpec, srcRoiSize, ippAlgHintNone); - - if ( status < 0 ) - { - ippiDCTInvFree_32f(pDCTSpec); - return false; - } - - status = ippiDCTInvGetBufSize_32f (pDCTSpec, &bufSize); - if ( status < 0 ) - { - ippiDCTInvFree_32f(pDCTSpec); - return false; - } - - pBuffer = ippsMalloc_8u( bufSize ); + ippiDCTFunc ippFunc = inv ? (ippiDCTFunc)ippiDCTInv_32f_C1R : (ippiDCTFunc)ippiDCTFwd_32f_C1R ; if (row) - { - for (int i=0; i buf; + uchar* pBuffer = 0; + int bufSize=0; - ippFree( pBuffer ); - ippiDCTInvFree_32f(pDCTSpec); - CV_SUPPRESS_DEPRECATED_END + IppiSize srcRoiSize = {src.cols, src.rows}; - return status >= 0; + CV_SUPPRESS_DEPRECATED_START + + ippiDCTInitAlloc ippInitAlloc = inv ? (ippiDCTInitAlloc)ippiDCTInvInitAlloc_32f : (ippiDCTInitAlloc)ippiDCTFwdInitAlloc_32f; + ippiDCTFree ippFree = inv ? (ippiDCTFree)ippiDCTInvFree_32f : (ippiDCTFree)ippiDCTFwdFree_32f; + ippiDCTGetBufSize ippGetBufSize = inv ? (ippiDCTGetBufSize)ippiDCTInvGetBufSize_32f : (ippiDCTGetBufSize)ippiDCTFwdGetBufSize_32f; + + status = ippInitAlloc(&pDCTSpec, srcRoiSize, ippAlgHintNone); + + if ( status < 0 ) + { + ippFree(pDCTSpec); + return false; + } + + status = ippGetBufSize(pDCTSpec, &bufSize); + if ( status < 0 ) + { + ippFree(pDCTSpec); + return false; + } + + buf.allocate( bufSize ); + pBuffer = (uchar*)buf; + + status = ippFunc((float*)src.data, (int)src.step, (float*)dst.data, (int)dst.step, pDCTSpec, (Ipp8u*)pBuffer); + + ippFree(pDCTSpec); + CV_SUPPRESS_DEPRECATED_END + + return status >= 0; + } } #endif @@ -3019,7 +3047,7 @@ void cv::dct( InputArray _src0, OutputArray _dst, int flags ) bool inv = (flags & DCT_INVERSE) != 0; Mat src0 = _src0.getMat(), src = src0; int type = src.type(), depth = src.depth(); - void /* *spec_dft = 0, */ *spec = 0; + void *spec = 0; double scale = 1.; int prev_len = 0, nf = 0, stage, end_stage; @@ -3036,12 +3064,14 @@ void cv::dct( InputArray _src0, OutputArray _dst, int flags ) _dst.create( src.rows, src.cols, type ); Mat dst = _dst.getMat(); -#if defined HAVE_IPP && IPP_VERSION_MAJOR >= 7 +#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7) && !defined HAVE_IPP_ICV_ONLY bool row = (flags & DCT_ROWS) != 0; - if (inv && ippi_DCT_Inv(src,dst,row)) - return; - if(ippi_DCT_Fwd(src,dst,row)) - return; + if(!row || src.rows>(int)(1<<8)) + { + if(ippi_DCT(src,dst,inv, row)) + return; + setIppErrorStatus(); + } #endif DCTFunc dct_func = dct_tbl[(int)inv + (depth == CV_64F)*2]; diff --git a/modules/imgproc/src/distransform.cpp b/modules/imgproc/src/distransform.cpp index c03d4b9a8e..55a58c7fe5 100644 --- a/modules/imgproc/src/distransform.cpp +++ b/modules/imgproc/src/distransform.cpp @@ -577,7 +577,7 @@ trueDistTrans( const Mat& src, Mat& dst ) for( ; i <= m*3; i++ ) sat_tab[i] = i - shift; - cv::parallel_for_(cv::Range(0, n), cv::DTColumnInvoker(&src, &dst, sat_tab, sqr_tab)); + cv::parallel_for_(cv::Range(0, n), cv::DTColumnInvoker(&src, &dst, sat_tab, sqr_tab), src.total()/(double)(1<<16)); // stage 2: compute modified distance transform for each row float* inv_tab = sqr_tab + n; From 507ea95265686e17987abff0c1003320e9f854a3 Mon Sep 17 00:00:00 2001 From: Elena Gvozdeva Date: Fri, 25 Apr 2014 12:30:30 +0400 Subject: [PATCH 3/4] fixed --- modules/core/perf/perf_dft.cpp | 9 +++++---- modules/core/src/dxt.cpp | 11 ++++------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/modules/core/perf/perf_dft.cpp b/modules/core/perf/perf_dft.cpp index f3e1d24e36..1a025affc3 100644 --- a/modules/core/perf/perf_dft.cpp +++ b/modules/core/perf/perf_dft.cpp @@ -30,19 +30,20 @@ PERF_TEST_P(Size_MatType_FlagsType, dft, TEST_MATS_DFT) TEST_CYCLE() dft(src, dst, flags); SANITY_CHECK(dst, 1e-5, ERROR_RELATIVE); +} ///////////////////////////////////////////////////////dct////////////////////////////////////////////////////// -CV_ENUM(FlagsType, 0, DCT_INVERSE , DCT_ROWS, DCT_INVERSE|DCT_ROWS) +CV_ENUM(DCT_FlagsType, 0, DCT_INVERSE , DCT_ROWS, DCT_INVERSE|DCT_ROWS) -typedef std::tr1::tuple Size_MatType_Flag_t; +typedef std::tr1::tuple Size_MatType_Flag_t; typedef perf::TestBaseWithParam Size_MatType_Flag; PERF_TEST_P(Size_MatType_Flag, dct, testing::Combine( testing::Values(cv::Size(320, 240),cv::Size(800, 600), cv::Size(1024, 768), cv::Size(1280, 1024), sz1080p, sz2K), - testing::Values(CV_32FC1, CV_64FC1), FlagsType::all())) + testing::Values(CV_32FC1, CV_64FC1), DCT_FlagsType::all())) { Size sz = get<0>(GetParam()); int type = get<1>(GetParam()); @@ -56,7 +57,7 @@ PERF_TEST_P(Size_MatType_Flag, dct, testing::Combine( .out(dst) .time(60); - TEST_CYCLE() dct(src, dst,flags); + TEST_CYCLE() dct(src, dst, flags); SANITY_CHECK(dst, 1e-5, ERROR_RELATIVE); } \ No newline at end of file diff --git a/modules/core/src/dxt.cpp b/modules/core/src/dxt.cpp index a5976a3cc4..31c375c492 100644 --- a/modules/core/src/dxt.cpp +++ b/modules/core/src/dxt.cpp @@ -2960,7 +2960,7 @@ template bool DctIPPLoop(const Mat& src, Mat& dst, const Dct& ippidct, bool inv) { bool ok; - parallel_for_(Range(0, src.rows), DctIPPLoop_Invoker(src, dst, ippidct, inv, &ok), src.total()/(double)(1<<16) ); + parallel_for_(Range(0, src.rows), DctIPPLoop_Invoker(src, dst, ippidct, inv, &ok), src.rows/(double)(1<<4) ); return ok; } @@ -2976,11 +2976,8 @@ private: ippiDCTFunc func; }; -static bool ippi_DCT(const Mat& src, Mat& dst, bool inv, bool row) +static bool ippi_DCT_32f(const Mat& src, Mat& dst, bool inv, bool row) { - if (src.type() != CV_32F) - return false; - ippiDCTFunc ippFunc = inv ? (ippiDCTFunc)ippiDCTInv_32f_C1R : (ippiDCTFunc)ippiDCTFwd_32f_C1R ; if (row) @@ -3066,9 +3063,9 @@ void cv::dct( InputArray _src0, OutputArray _dst, int flags ) #if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7) && !defined HAVE_IPP_ICV_ONLY bool row = (flags & DCT_ROWS) != 0; - if(!row || src.rows>(int)(1<<8)) + if (src.type() == CV_32F) { - if(ippi_DCT(src,dst,inv, row)) + if(ippi_DCT_32f(src,dst,inv, row)) return; setIppErrorStatus(); } From 12279e26313615e16a05f10b47c06ce4395d89c8 Mon Sep 17 00:00:00 2001 From: Elena Gvozdeva Date: Mon, 5 May 2014 16:42:47 +0400 Subject: [PATCH 4/4] fixed --- modules/core/src/dxt.cpp | 76 +++++++++++++--------------------------- 1 file changed, 25 insertions(+), 51 deletions(-) diff --git a/modules/core/src/dxt.cpp b/modules/core/src/dxt.cpp index 31c375c492..f4e54e901b 100644 --- a/modules/core/src/dxt.cpp +++ b/modules/core/src/dxt.cpp @@ -2894,21 +2894,20 @@ class DctIPPLoop_Invoker : public ParallelLoopBody { public: - DctIPPLoop_Invoker(const Mat& _src, Mat& _dst, const Dct& _ippidct, bool _inv, bool *_ok) : - ParallelLoopBody(), src(_src), dst(_dst), ippidct(_ippidct), inv(_inv), ok(_ok) + DctIPPLoop_Invoker(const Mat& _src, Mat& _dst, const Dct* _ippidct, bool _inv, bool *_ok) : + ParallelLoopBody(), src(&_src), dst(&_dst), ippidct(_ippidct), inv(_inv), ok(_ok) { *ok = true; } virtual void operator()(const Range& range) const { - IppStatus status; void* pDCTSpec; AutoBuffer buf; uchar* pBuffer = 0; int bufSize=0; - IppiSize srcRoiSize = {src.cols, 1}; + IppiSize srcRoiSize = {src->cols, 1}; CV_SUPPRESS_DEPRECATED_START @@ -2916,51 +2915,37 @@ public: ippiDCTFree ippFree = inv ? (ippiDCTFree)ippiDCTInvFree_32f : (ippiDCTFree)ippiDCTFwdFree_32f; ippiDCTGetBufSize ippGetBufSize = inv ? (ippiDCTGetBufSize)ippiDCTInvGetBufSize_32f : (ippiDCTGetBufSize)ippiDCTFwdGetBufSize_32f; - status = ippInitAlloc(&pDCTSpec, srcRoiSize, ippAlgHintNone); - - if ( status < 0 ) + if (ippInitAlloc(&pDCTSpec, srcRoiSize, ippAlgHintNone)>=0 && ippGetBufSize(pDCTSpec, &bufSize)>=0) { - ippFree(pDCTSpec); - *ok = false; - return; + buf.allocate( bufSize ); + pBuffer = (uchar*)buf; + + for( int i = range.start; i < range.end; ++i) + if(!(*ippidct)((float*)(src->data+i*src->step), (int)src->step,(float*)(dst->data+i*dst->step), (int)dst->step, pDCTSpec, (Ipp8u*)pBuffer)) + *ok = false; } - - status = ippGetBufSize(pDCTSpec, &bufSize); - if ( status < 0 ) - { - ippFree(pDCTSpec); + else *ok = false; - return; - } - buf.allocate( bufSize ); - pBuffer = (uchar*)buf; + if (pDCTSpec) + ippFree(pDCTSpec); - for( int i = range.start; i < range.end; ++i) - if(!ippidct((float*)(src.data+i*src.step), (int)src.step,(float*)(dst.data+i*dst.step), (int)dst.step, pDCTSpec, (Ipp8u*)pBuffer)) - { - *ok = false; - } - - ippFree( pDCTSpec); CV_SUPPRESS_DEPRECATED_END } private: - const Mat& src; - Mat& dst; - const Dct& ippidct; + const Mat* src; + Mat* dst; + const Dct* ippidct; bool inv; bool *ok; - - const DctIPPLoop_Invoker& operator= (const DctIPPLoop_Invoker&); }; template bool DctIPPLoop(const Mat& src, Mat& dst, const Dct& ippidct, bool inv) { bool ok; - parallel_for_(Range(0, src.rows), DctIPPLoop_Invoker(src, dst, ippidct, inv, &ok), src.rows/(double)(1<<4) ); + parallel_for_(Range(0, src.rows), DctIPPLoop_Invoker(src, dst, &ippidct, inv, &ok), src.rows/(double)(1<<4) ); return ok; } @@ -2981,10 +2966,7 @@ static bool ippi_DCT_32f(const Mat& src, Mat& dst, bool inv, bool row) ippiDCTFunc ippFunc = inv ? (ippiDCTFunc)ippiDCTInv_32f_C1R : (ippiDCTFunc)ippiDCTFwd_32f_C1R ; if (row) - if(DctIPPLoop(src,dst,IPPDCTFunctor(ippFunc),inv)) - return true; - else - return false; + return(DctIPPLoop(src,dst,IPPDCTFunctor(ippFunc),inv)); else { IppStatus status; @@ -3001,27 +2983,19 @@ static bool ippi_DCT_32f(const Mat& src, Mat& dst, bool inv, bool row) ippiDCTFree ippFree = inv ? (ippiDCTFree)ippiDCTInvFree_32f : (ippiDCTFree)ippiDCTFwdFree_32f; ippiDCTGetBufSize ippGetBufSize = inv ? (ippiDCTGetBufSize)ippiDCTInvGetBufSize_32f : (ippiDCTGetBufSize)ippiDCTFwdGetBufSize_32f; - status = ippInitAlloc(&pDCTSpec, srcRoiSize, ippAlgHintNone); + status = ippStsErr; - if ( status < 0 ) + if (ippInitAlloc(&pDCTSpec, srcRoiSize, ippAlgHintNone)>=0 && ippGetBufSize(pDCTSpec, &bufSize)>=0) { - ippFree(pDCTSpec); - return false; + buf.allocate( bufSize ); + pBuffer = (uchar*)buf; + + status = ippFunc((float*)src.data, (int)src.step, (float*)dst.data, (int)dst.step, pDCTSpec, (Ipp8u*)pBuffer); } - status = ippGetBufSize(pDCTSpec, &bufSize); - if ( status < 0 ) - { + if (pDCTSpec) ippFree(pDCTSpec); - return false; - } - buf.allocate( bufSize ); - pBuffer = (uchar*)buf; - - status = ippFunc((float*)src.data, (int)src.step, (float*)dst.data, (int)dst.step, pDCTSpec, (Ipp8u*)pBuffer); - - ippFree(pDCTSpec); CV_SUPPRESS_DEPRECATED_END return status >= 0;