From 45cc8a5300674bc0259a98c381e52f410ed3fd0a Mon Sep 17 00:00:00 2001 From: Elena Gvozdeva Date: Tue, 25 Feb 2014 16:40:04 +0400 Subject: [PATCH] fixed --- modules/imgproc/src/imgwarp.cpp | 251 +++++++++++----------------------------- 1 file changed, 69 insertions(+), 182 deletions(-) diff --git a/modules/imgproc/src/imgwarp.cpp b/modules/imgproc/src/imgwarp.cpp index 3575cec..208c3c5 100644 --- a/modules/imgproc/src/imgwarp.cpp +++ b/modules/imgproc/src/imgwarp.cpp @@ -1864,6 +1864,30 @@ static int computeResizeAreaTab( int ssize, int dsize, int cn, double scale, Dec return k; } +#define CHECK_FUNC(FUNC) if( FUNC==0 ) { *ok = false; return;} +#define CHECK_STATUS(STATUS) if( STATUS!=ippStsNoErr ) { *ok = false; return;} + +#define SET_IPP_RESIZE_LINEAR_FUNC_PTR(TYPE, CN) \ + func = (ippiResizeFunc)ippiResizeLinear_##TYPE##_##CN##R; CHECK_FUNC(func);\ + status = ippiResizeGetSize_##TYPE(srcSize, dstSize, (IppiInterpolationType)mode, 0, &specSize, &initSize); CHECK_STATUS(status)\ + specBuf.allocate(specSize);\ + pSpec = (uchar*)specBuf;\ + status = ippiResizeLinearInit_##TYPE(srcSize, dstSize, (IppiResizeSpec_32f*)pSpec); CHECK_STATUS(status); + +#define SET_IPP_RESIZE_LINEAR_FUNC_64_PTR(TYPE, CN) \ + func = (ippiResizeFunc)ippiResizeLinear_##TYPE##_##CN##R; CHECK_FUNC(func);\ + status = ippiResizeGetSize_##TYPE(srcSize, dstSize, (IppiInterpolationType)mode, 0, &specSize, &initSize); CHECK_STATUS(status)\ + specBuf.allocate(specSize);\ + pSpec = (uchar*)specBuf;\ + status = ippiResizeLinearInit_##TYPE(srcSize, dstSize, (IppiResizeSpec_64f*)pSpec); CHECK_STATUS(status); + +#define SET_IPP_RESIZE_CUBIC_FUNC_PTR(TYPE, CN) \ + func = (ippiResizeFunc)ippiResizeCubic_##TYPE##_##CN##R; CHECK_FUNC(func);\ + status = ippiResizeGetSize_##TYPE(srcSize, dstSize, (IppiInterpolationType)mode, 0, &specSize, &initSize); CHECK_STATUS(status)\ + specBuf.allocate(specSize);\ + pSpec = (uchar*)specBuf;\ + status = ippiResizeCubicInit_##TYPE(srcSize, dstSize, 0.f, 0.75f, (IppiResizeSpec_32f*)pSpec, pInit); CHECK_STATUS(status); + #if defined (HAVE_IPP) && (IPP_VERSION_MAJOR*100 + IPP_VERSION_MINOR >= 701) class IPPresizeInvoker : public ParallelLoopBody @@ -1886,181 +1910,44 @@ public: { switch (type) { - case CV_8UC1: - func = (ippiResizeFunc)ippiResizeLinear_8u_C1R; - break; - case CV_8UC3: - func = (ippiResizeFunc)ippiResizeLinear_8u_C3R; - break; - case CV_8UC4: - func = (ippiResizeFunc)ippiResizeLinear_8u_C4R; - break; - case CV_16UC1: - func = (ippiResizeFunc)ippiResizeLinear_16u_C1R; - break; - case CV_16UC3: - func = (ippiResizeFunc)ippiResizeLinear_16u_C3R; - break; - case CV_16UC4: - func = (ippiResizeFunc)ippiResizeLinear_16u_C4R; - break; - case CV_16SC1: - func = (ippiResizeFunc)ippiResizeLinear_16s_C1R; - break; - case CV_16SC3: - func = (ippiResizeFunc)ippiResizeLinear_16s_C3R; - break; - case CV_16SC4: - func = (ippiResizeFunc)ippiResizeLinear_16s_C4R; - break; - case CV_32FC1: - func = (ippiResizeFunc)ippiResizeLinear_32f_C1R; - break; - case CV_32FC3: - func = (ippiResizeFunc)ippiResizeLinear_32f_C3R; - break; - case CV_32FC4: - func = (ippiResizeFunc)ippiResizeLinear_32f_C4R; - break; - case CV_64FC1: - func = (ippiResizeFunc)ippiResizeLinear_64f_C1R; - break; - case CV_64FC3: - func = (ippiResizeFunc)ippiResizeLinear_64f_C3R; - break; - case CV_64FC4: - func = (ippiResizeFunc)ippiResizeLinear_64f_C4R; - break; - default: - break; - } - } - else if (mode == (int)ippCubic) - { - switch (type) - { - case CV_8UC1: - func = (ippiResizeFunc)ippiResizeCubic_8u_C1R; - break; - case CV_8UC3: - func = (ippiResizeFunc)ippiResizeCubic_8u_C3R; - break; - case CV_8UC4: - func = (ippiResizeFunc)ippiResizeCubic_8u_C4R; - break; - case CV_16UC1: - func = (ippiResizeFunc)ippiResizeCubic_16u_C1R; - break; - case CV_16UC3: - func = (ippiResizeFunc)ippiResizeCubic_16u_C3R; - break; - case CV_16UC4: - func = (ippiResizeFunc)ippiResizeCubic_16u_C4R; - break; - case CV_16SC1: - func = (ippiResizeFunc)ippiResizeCubic_16s_C1R; - break; - case CV_16SC3: - func = (ippiResizeFunc)ippiResizeCubic_16s_C3R; - break; - case CV_16SC4: - func = (ippiResizeFunc)ippiResizeCubic_16s_C4R; - break; - case CV_32FC1: - func = (ippiResizeFunc)ippiResizeCubic_32f_C1R; - break; - case CV_32FC3: - func = (ippiResizeFunc)ippiResizeCubic_32f_C3R; - break; - case CV_32FC4: - func = (ippiResizeFunc)ippiResizeCubic_32f_C4R; - break; - default: - break; - } - } - - if( func == 0 ) - { - *ok = false; - return; - } - - switch (src.depth()) - { - case CV_8U: - status = ippiResizeGetSize_8u(srcSize, dstSize, (IppiInterpolationType)mode, 0, &specSize, &initSize); - break; - case CV_16U: - status = ippiResizeGetSize_16u(srcSize, dstSize, (IppiInterpolationType)mode, 0, &specSize, &initSize); - break; - case CV_16S: - status = ippiResizeGetSize_16s(srcSize, dstSize, (IppiInterpolationType)mode, 0, &specSize, &initSize); - break; - case CV_32F: - status = ippiResizeGetSize_32f(srcSize, dstSize, (IppiInterpolationType)mode, 0, &specSize, &initSize); - break; - case CV_64F: - status = ippiResizeGetSize_64f(srcSize, dstSize, (IppiInterpolationType)mode, 0, &specSize, &initSize); - break; - } - if (status != ippStsNoErr) - { - *ok = false; - return; - } - - specBuf.allocate(specSize); - pSpec = (uchar*)specBuf; - - status = ippStsNotSupportedModeErr; - if (mode == (int)ippLinear) - { - switch (src.depth()) - { - case CV_8U: - status = ippiResizeLinearInit_8u(srcSize, dstSize, (IppiResizeSpec_32f*)pSpec); - break; - case CV_16U: - status = ippiResizeLinearInit_16u(srcSize, dstSize, (IppiResizeSpec_32f*)pSpec); - break; - case CV_16S: - status = ippiResizeLinearInit_16s(srcSize, dstSize, (IppiResizeSpec_32f*)pSpec); - break; - case CV_32F: - status = ippiResizeLinearInit_32f(srcSize, dstSize, (IppiResizeSpec_32f*)pSpec); - break; - case CV_64F: - status = ippiResizeLinearInit_64f(srcSize, dstSize, (IppiResizeSpec_64f*)pSpec); - break; - } - if (status != ippStsNoErr) - { - *ok = false; - return; + case CV_8UC1: SET_IPP_RESIZE_LINEAR_FUNC_PTR(8u,C1); break; + case CV_8UC3: SET_IPP_RESIZE_LINEAR_FUNC_PTR(8u,C3); break; + case CV_8UC4: SET_IPP_RESIZE_LINEAR_FUNC_PTR(8u,C4); break; + case CV_16UC1: SET_IPP_RESIZE_LINEAR_FUNC_PTR(16u,C1); break; + case CV_16UC3: SET_IPP_RESIZE_LINEAR_FUNC_PTR(16u,C3); break; + case CV_16UC4: SET_IPP_RESIZE_LINEAR_FUNC_PTR(16u,C4); break; + case CV_16SC1: SET_IPP_RESIZE_LINEAR_FUNC_PTR(16s,C1); break; + case CV_16SC3: SET_IPP_RESIZE_LINEAR_FUNC_PTR(16s,C3); break; + case CV_16SC4: SET_IPP_RESIZE_LINEAR_FUNC_PTR(16s,C4); break; + case CV_32FC1: SET_IPP_RESIZE_LINEAR_FUNC_PTR(32f,C1); break; + case CV_32FC3: SET_IPP_RESIZE_LINEAR_FUNC_PTR(32f,C3); break; + case CV_32FC4: SET_IPP_RESIZE_LINEAR_FUNC_PTR(32f,C4); break; + case CV_64FC1: SET_IPP_RESIZE_LINEAR_FUNC_64_PTR(64f,C1); break; + case CV_64FC3: SET_IPP_RESIZE_LINEAR_FUNC_64_PTR(64f,C3); break; + case CV_64FC4: SET_IPP_RESIZE_LINEAR_FUNC_64_PTR(64f,C4); break; + default: { *ok = false; return;} break; } } else if (mode == (int)ippCubic) { AutoBuffer buf(initSize); uchar* pInit = (uchar*)buf; - - switch (src.depth()) + switch (type) { - case CV_8U: - status = ippiResizeCubicInit_8u(srcSize, dstSize, 0.f, 0.75f, (IppiResizeSpec_32f*)pSpec, pInit); - break; - case CV_16U: - status = ippiResizeCubicInit_16u(srcSize, dstSize, 0.f, 0.75f, (IppiResizeSpec_32f*)pSpec, pInit); - break; - case CV_16S: - status = ippiResizeCubicInit_16s(srcSize, dstSize, 0.f, 0.75f, (IppiResizeSpec_32f*)pSpec, pInit); - break; - case CV_32F: - status = ippiResizeCubicInit_32f(srcSize, dstSize, 0.f, 0.75f, (IppiResizeSpec_32f*)pSpec, pInit); - break; + case CV_8UC1: SET_IPP_RESIZE_CUBIC_FUNC_PTR(8u,C1); break; + case CV_8UC3: SET_IPP_RESIZE_CUBIC_FUNC_PTR(8u,C3); break; + case CV_8UC4: SET_IPP_RESIZE_CUBIC_FUNC_PTR(8u,C4); break; + case CV_16UC1: SET_IPP_RESIZE_CUBIC_FUNC_PTR(16u,C1); break; + case CV_16UC3: SET_IPP_RESIZE_CUBIC_FUNC_PTR(16u,C3); break; + case CV_16UC4: SET_IPP_RESIZE_CUBIC_FUNC_PTR(16u,C4); break; + case CV_16SC1: SET_IPP_RESIZE_CUBIC_FUNC_PTR(16s,C1); break; + case CV_16SC3: SET_IPP_RESIZE_CUBIC_FUNC_PTR(16s,C3); break; + case CV_16SC4: SET_IPP_RESIZE_CUBIC_FUNC_PTR(16s,C4); break; + case CV_32FC1: SET_IPP_RESIZE_CUBIC_FUNC_PTR(32f,C1); break; + case CV_32FC3: SET_IPP_RESIZE_CUBIC_FUNC_PTR(32f,C3); break; + case CV_32FC4: SET_IPP_RESIZE_CUBIC_FUNC_PTR(32f,C4); break; + default: { *ok = false; return;} break; } - if (status != ippStsNoErr) *ok = false; } } @@ -2088,45 +1975,45 @@ public: case CV_8U: itemSize = 1; status = ippiResizeGetBufferSize_8u((IppiResizeSpec_32f*)pSpec, dstSize, cn, &bufsize); - if (status == ippStsNoErr) - status = ippiResizeGetSrcOffset_8u((IppiResizeSpec_32f*)pSpec, dstOffset, &srcOffset); + CHECK_STATUS(status); + status = ippiResizeGetSrcOffset_8u((IppiResizeSpec_32f*)pSpec, dstOffset, &srcOffset); break; case CV_16U: itemSize = 2; status = ippiResizeGetBufferSize_16u((IppiResizeSpec_32f*)pSpec, dstSize, cn, &bufsize); - if (status == ippStsNoErr) - status = ippiResizeGetSrcOffset_16u((IppiResizeSpec_32f*)pSpec, dstOffset, &srcOffset); + CHECK_STATUS(status); + status = ippiResizeGetSrcOffset_16u((IppiResizeSpec_32f*)pSpec, dstOffset, &srcOffset); break; case CV_16S: itemSize = 2; status = ippiResizeGetBufferSize_16s((IppiResizeSpec_32f*)pSpec, dstSize, cn, &bufsize); - if (status == ippStsNoErr) - status = ippiResizeGetSrcOffset_16s((IppiResizeSpec_32f*)pSpec, dstOffset, &srcOffset); + CHECK_STATUS(status); + status = ippiResizeGetSrcOffset_16s((IppiResizeSpec_32f*)pSpec, dstOffset, &srcOffset); break; case CV_32F: itemSize = 4; status = ippiResizeGetBufferSize_32f((IppiResizeSpec_32f*)pSpec, dstSize, cn, &bufsize); - if (status == ippStsNoErr) - status = ippiResizeGetSrcOffset_32f((IppiResizeSpec_32f*)pSpec, dstOffset, &srcOffset); + CHECK_STATUS(status); + status = ippiResizeGetSrcOffset_32f((IppiResizeSpec_32f*)pSpec, dstOffset, &srcOffset); break; case CV_64F: itemSize = 8; status = ippiResizeGetBufferSize_64f((IppiResizeSpec_64f*)pSpec, dstSize, cn, &bufsize); - if (status == ippStsNoErr) - status = ippiResizeGetSrcOffset_64f((IppiResizeSpec_64f*)pSpec, dstOffset, &srcOffset); + CHECK_STATUS(status); + status = ippiResizeGetSrcOffset_64f((IppiResizeSpec_64f*)pSpec, dstOffset, &srcOffset); break; } - if (status != ippStsNoErr) - { - *ok = false; - return; - } + + CHECK_STATUS(status); Ipp8u* pSrc = (Ipp8u*)src.data + (int)src.step[0] * srcOffset.y + srcOffset.x * cn * itemSize; Ipp8u* pDst = (Ipp8u*)dst.data + (int)dst.step[0] * dstOffset.y + dstOffset.x * cn * itemSize; AutoBuffer buf(bufsize + 64); uchar* bufptr = alignPtr((uchar*)buf, 32); + + CHECK_FUNC(func); + if( func( pSrc, (int)src.step[0], pDst, (int)dst.step[0], dstOffset, dstSize, ippBorderRepl, 0, pSpec, bufptr ) < 0 ) *ok = false; } -- 2.7.4