diff --git a/3rdparty/ipphal/CMakeLists.txt b/3rdparty/ipphal/CMakeLists.txt index 376bf7d386..c80e76bfed 100644 --- a/3rdparty/ipphal/CMakeLists.txt +++ b/3rdparty/ipphal/CMakeLists.txt @@ -12,13 +12,23 @@ add_library(ipphal STATIC "${CMAKE_CURRENT_SOURCE_DIR}/src/minmax_ipp.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/norm_ipp.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/cart_polar_ipp.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/transforms_ipp.cpp" ) +#TODO: HAVE_IPP_ICV and HAVE_IPP_IW added as private macro till OpenCV itself is +# source of IPP and public definitions lead to redefinition warning +# The macro should be redefined as PUBLIC when IPP part is removed from core +# to make HAL the source of IPP integration if(HAVE_IPP_ICV) target_compile_definitions(ipphal PRIVATE HAVE_IPP_ICV) endif() +if(HAVE_IPP_IW) + target_compile_definitions(ipphal PRIVATE HAVE_IPP_IW) +endif() + target_include_directories(ipphal PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include") +ocv_warnings_disable(CMAKE_CXX_FLAGS -Wno-suggest-override) target_include_directories(ipphal PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" diff --git a/3rdparty/ipphal/include/ipp_hal_core.hpp b/3rdparty/ipphal/include/ipp_hal_core.hpp index ac2ac868f0..6707db7290 100644 --- a/3rdparty/ipphal/include/ipp_hal_core.hpp +++ b/3rdparty/ipphal/include/ipp_hal_core.hpp @@ -42,4 +42,18 @@ int ipp_hal_polarToCart64f(const double* mag, const double* angle, double* x, do #undef cv_hal_polarToCart64f #define cv_hal_polarToCart64f ipp_hal_polarToCart64f +#ifdef HAVE_IPP_IW +int ipp_hal_flip(int src_type, const uchar* src_data, size_t src_step, int src_width, int src_height, + uchar* dst_data, size_t dst_step, int flip_mode); + +#undef cv_hal_flip +#define cv_hal_flip ipp_hal_flip +#endif + +int ipp_hal_transpose2d(const uchar* src_data, size_t src_step, uchar* dst_data, size_t dst_step, int src_width, + int src_height, int element_size); + +#undef cv_hal_transpose2d +#define cv_hal_transpose2d ipp_hal_transpose2d + #endif diff --git a/3rdparty/ipphal/src/mean_ipp.cpp b/3rdparty/ipphal/src/mean_ipp.cpp index 63abe6eb9d..38412271b5 100644 --- a/3rdparty/ipphal/src/mean_ipp.cpp +++ b/3rdparty/ipphal/src/mean_ipp.cpp @@ -1,6 +1,6 @@ #include "ipp_hal_core.hpp" -#include +#include #include #if IPP_VERSION_X100 >= 700 diff --git a/3rdparty/ipphal/src/minmax_ipp.cpp b/3rdparty/ipphal/src/minmax_ipp.cpp index a87d5825e9..a8d7b7cad8 100644 --- a/3rdparty/ipphal/src/minmax_ipp.cpp +++ b/3rdparty/ipphal/src/minmax_ipp.cpp @@ -1,6 +1,6 @@ #include "ipp_hal_core.hpp" -#include +#include #include #define IPP_DISABLE_MINMAXIDX_MANY_ROWS 1 // see Core_MinMaxIdx.rows_overflow test diff --git a/3rdparty/ipphal/src/norm_ipp.cpp b/3rdparty/ipphal/src/norm_ipp.cpp index 5fc4609edb..16b0d9bd91 100644 --- a/3rdparty/ipphal/src/norm_ipp.cpp +++ b/3rdparty/ipphal/src/norm_ipp.cpp @@ -1,6 +1,6 @@ #include "ipp_hal_core.hpp" -#include +#include #include #if IPP_VERSION_X100 >= 700 diff --git a/3rdparty/ipphal/src/transforms_ipp.cpp b/3rdparty/ipphal/src/transforms_ipp.cpp new file mode 100644 index 0000000000..ae38310051 --- /dev/null +++ b/3rdparty/ipphal/src/transforms_ipp.cpp @@ -0,0 +1,142 @@ +#include "ipp_hal_core.hpp" + +#include +#include +#ifdef HAVE_IPP_IW +#include "iw++/iw.hpp" +#endif + +// HACK: Should be removed, when IPP management moved to HAL +namespace cv +{ + namespace ipp + { + unsigned long long getIppTopFeatures(); // Returns top major enabled IPP feature flag + } +} + +//bool ipp_transpose( Mat &src, Mat &dst ) +int ipp_hal_transpose2d(const uchar* src_data, size_t src_step, uchar* dst_data, size_t dst_step, int src_width, + int src_height, int element_size) +{ + typedef IppStatus (CV_STDCALL * IppiTranspose)(const void * pSrc, int srcStep, void * pDst, int dstStep, IppiSize roiSize); + typedef IppStatus (CV_STDCALL * IppiTransposeI)(const void * pSrcDst, int srcDstStep, IppiSize roiSize); + IppiTranspose ippiTranspose = nullptr; + IppiTransposeI ippiTranspose_I = nullptr; + + if (dst_data == src_data && src_width == src_height) + { + CV_SUPPRESS_DEPRECATED_START + ippiTranspose_I = + element_size == 1*sizeof(char) ? (IppiTransposeI)ippiTranspose_8u_C1IR : + element_size == 3*sizeof(char) ? (IppiTransposeI)ippiTranspose_8u_C3IR : + element_size == 1*sizeof(short) ? (IppiTransposeI)ippiTranspose_16u_C1IR : + element_size == 4*sizeof(char) ? (IppiTransposeI)ippiTranspose_8u_C4IR : + element_size == 3*sizeof(short) ? (IppiTransposeI)ippiTranspose_16u_C3IR : + element_size == 4*sizeof(short) ? (IppiTransposeI)ippiTranspose_16u_C4IR : + element_size == 3*sizeof(int) ? (IppiTransposeI)ippiTranspose_32s_C3IR : + element_size == 4*sizeof(int) ? (IppiTransposeI)ippiTranspose_32s_C4IR : 0; + CV_SUPPRESS_DEPRECATED_END + } + else + { + ippiTranspose = + element_size == 1*sizeof(char) ? (IppiTranspose)ippiTranspose_8u_C1R : + element_size == 3*sizeof(char) ? (IppiTranspose)ippiTranspose_8u_C3R : + element_size == 4*sizeof(char) ? (IppiTranspose)ippiTranspose_8u_C4R : + element_size == 1*sizeof(short) ? (IppiTranspose)ippiTranspose_16u_C1R : + element_size == 3*sizeof(short) ? (IppiTranspose)ippiTranspose_16u_C3R : + element_size == 4*sizeof(short) ? (IppiTranspose)ippiTranspose_16u_C4R : + element_size == 1*sizeof(int) ? (IppiTranspose)ippiTranspose_32s_C1R : + element_size == 3*sizeof(int) ? (IppiTranspose)ippiTranspose_32s_C3R : + element_size == 4*sizeof(int) ? (IppiTranspose)ippiTranspose_32s_C4R : 0; + } + + IppiSize roiSize = { src_width, src_height }; + if (ippiTranspose != 0) + { + if (CV_INSTRUMENT_FUN_IPP(ippiTranspose, src_data, (int)src_step, dst_data, (int)dst_step, roiSize) >= 0) + return CV_HAL_ERROR_OK; + } + else if (ippiTranspose_I != 0) + { + if (CV_INSTRUMENT_FUN_IPP(ippiTranspose_I, dst_data, (int)dst_step, roiSize) >= 0) + return CV_HAL_ERROR_OK; + } + return CV_HAL_ERROR_NOT_IMPLEMENTED; +} + +#ifdef HAVE_IPP_IW + +static inline IppDataType ippiGetDataType(int depth) +{ + depth = CV_MAT_DEPTH(depth); + return depth == CV_8U ? ipp8u : + depth == CV_8S ? ipp8s : + depth == CV_16U ? ipp16u : + depth == CV_16S ? ipp16s : + depth == CV_32S ? ipp32s : + depth == CV_32F ? ipp32f : + depth == CV_64F ? ipp64f : + (IppDataType)-1; +} + +static inline ::ipp::IwiImage ippiGetImage(int src_type, const uchar* src_data, size_t src_step, int src_width, int src_height) +{ + ::ipp::IwiImage dst; + ::ipp::IwiBorderSize inMemBorder; +// if(src.isSubmatrix()) // already have physical border +// { +// cv::Size origSize; +// cv::Point offset; +// src.locateROI(origSize, offset); +// +// inMemBorder.left = (IwSize)offset.x; +// inMemBorder.top = (IwSize)offset.y; +// inMemBorder.right = (IwSize)(origSize.width - src.cols - offset.x); +// inMemBorder.bottom = (IwSize)(origSize.height - src.rows - offset.y); +// } + + dst.Init({src_width, src_height}, ippiGetDataType(CV_MAT_DEPTH(src_type)), + CV_MAT_CN(src_type), inMemBorder, (void*)src_data, src_step); + + return dst; +} + +int ipp_hal_flip(int src_type, const uchar* src_data, size_t src_step, int src_width, int src_height, + uchar* dst_data, size_t dst_step, int flip_mode) + +{ + int64_t total = src_step*src_height*CV_ELEM_SIZE(src_type); + // Details: https://github.com/opencv/opencv/issues/12943 + if (flip_mode <= 0 /* swap rows */ + && total > 0 && total >= CV_BIG_INT(0x80000000)/*2Gb*/ + && cv::ipp::getIppTopFeatures() != ippCPUID_SSE42) + { + return CV_HAL_ERROR_NOT_IMPLEMENTED; + } + + IppiAxis ippMode; + if(flip_mode < 0) + ippMode = ippAxsBoth; + else if(flip_mode == 0) + ippMode = ippAxsHorizontal; + else + ippMode = ippAxsVertical; + + try + { + ::ipp::IwiImage iwSrc = ippiGetImage(src_type, src_data, src_step, src_width, src_height); + ::ipp::IwiImage iwDst = ippiGetImage(src_type, dst_data, dst_step, src_width, src_height); + + CV_INSTRUMENT_FUN_IPP(::ipp::iwiMirror, iwSrc, iwDst, ippMode); + } + catch(const ::ipp::IwException &) + { + return CV_HAL_ERROR_NOT_IMPLEMENTED; + } + + return CV_HAL_ERROR_OK; +} + +#endif diff --git a/modules/core/src/matrix_transform.cpp b/modules/core/src/matrix_transform.cpp index bad17e7b6b..c52fcc1e4f 100644 --- a/modules/core/src/matrix_transform.cpp +++ b/modules/core/src/matrix_transform.cpp @@ -173,74 +173,6 @@ static bool ocl_transpose( InputArray _src, OutputArray _dst ) #endif -#ifdef HAVE_IPP -static bool ipp_transpose( Mat &src, Mat &dst ) -{ - CV_INSTRUMENT_REGION_IPP(); - - int type = src.type(); - typedef IppStatus (CV_STDCALL * IppiTranspose)(const void * pSrc, int srcStep, void * pDst, int dstStep, IppiSize roiSize); - typedef IppStatus (CV_STDCALL * IppiTransposeI)(const void * pSrcDst, int srcDstStep, IppiSize roiSize); - IppiTranspose ippiTranspose = 0; - IppiTransposeI ippiTranspose_I = 0; - - if (dst.data == src.data && dst.cols == dst.rows) - { - CV_SUPPRESS_DEPRECATED_START - ippiTranspose_I = - type == CV_8UC1 ? (IppiTransposeI)ippiTranspose_8u_C1IR : - type == CV_8UC3 ? (IppiTransposeI)ippiTranspose_8u_C3IR : - type == CV_8UC4 ? (IppiTransposeI)ippiTranspose_8u_C4IR : - type == CV_16UC1 ? (IppiTransposeI)ippiTranspose_16u_C1IR : - type == CV_16UC3 ? (IppiTransposeI)ippiTranspose_16u_C3IR : - type == CV_16UC4 ? (IppiTransposeI)ippiTranspose_16u_C4IR : - type == CV_16SC1 ? (IppiTransposeI)ippiTranspose_16s_C1IR : - type == CV_16SC3 ? (IppiTransposeI)ippiTranspose_16s_C3IR : - type == CV_16SC4 ? (IppiTransposeI)ippiTranspose_16s_C4IR : - type == CV_32SC1 ? (IppiTransposeI)ippiTranspose_32s_C1IR : - type == CV_32SC3 ? (IppiTransposeI)ippiTranspose_32s_C3IR : - type == CV_32SC4 ? (IppiTransposeI)ippiTranspose_32s_C4IR : - type == CV_32FC1 ? (IppiTransposeI)ippiTranspose_32f_C1IR : - type == CV_32FC3 ? (IppiTransposeI)ippiTranspose_32f_C3IR : - type == CV_32FC4 ? (IppiTransposeI)ippiTranspose_32f_C4IR : 0; - CV_SUPPRESS_DEPRECATED_END - } - else - { - ippiTranspose = - type == CV_8UC1 ? (IppiTranspose)ippiTranspose_8u_C1R : - type == CV_8UC3 ? (IppiTranspose)ippiTranspose_8u_C3R : - type == CV_8UC4 ? (IppiTranspose)ippiTranspose_8u_C4R : - type == CV_16UC1 ? (IppiTranspose)ippiTranspose_16u_C1R : - type == CV_16UC3 ? (IppiTranspose)ippiTranspose_16u_C3R : - type == CV_16UC4 ? (IppiTranspose)ippiTranspose_16u_C4R : - type == CV_16SC1 ? (IppiTranspose)ippiTranspose_16s_C1R : - type == CV_16SC3 ? (IppiTranspose)ippiTranspose_16s_C3R : - type == CV_16SC4 ? (IppiTranspose)ippiTranspose_16s_C4R : - type == CV_32SC1 ? (IppiTranspose)ippiTranspose_32s_C1R : - type == CV_32SC3 ? (IppiTranspose)ippiTranspose_32s_C3R : - type == CV_32SC4 ? (IppiTranspose)ippiTranspose_32s_C4R : - type == CV_32FC1 ? (IppiTranspose)ippiTranspose_32f_C1R : - type == CV_32FC3 ? (IppiTranspose)ippiTranspose_32f_C3R : - type == CV_32FC4 ? (IppiTranspose)ippiTranspose_32f_C4R : 0; - } - - IppiSize roiSize = { src.cols, src.rows }; - if (ippiTranspose != 0) - { - if (CV_INSTRUMENT_FUN_IPP(ippiTranspose, src.ptr(), (int)src.step, dst.ptr(), (int)dst.step, roiSize) >= 0) - return true; - } - else if (ippiTranspose_I != 0) - { - if (CV_INSTRUMENT_FUN_IPP(ippiTranspose_I, dst.ptr(), (int)dst.step, roiSize) >= 0) - return true; - } - return false; -} -#endif - - void transpose( InputArray _src, OutputArray _dst ) { CV_INSTRUMENT_REGION(); @@ -271,8 +203,6 @@ void transpose( InputArray _src, OutputArray _dst ) CALL_HAL(transpose2d, cv_hal_transpose2d, src.data, src.step, dst.data, dst.step, src.cols, src.rows, esz); - CV_IPP_RUN_FAST(ipp_transpose(src, dst)) - if( dst.data == src.data ) { TransposeInplaceFunc func = transposeInplaceTab[esz]; @@ -735,48 +665,6 @@ static bool ocl_flip(InputArray _src, OutputArray _dst, int flipCode ) #endif -#if defined HAVE_IPP -static bool ipp_flip(Mat &src, Mat &dst, int flip_mode) -{ -#ifdef HAVE_IPP_IW - CV_INSTRUMENT_REGION_IPP(); - - // Details: https://github.com/opencv/opencv/issues/12943 - if (flip_mode <= 0 /* swap rows */ - && cv::ipp::getIppTopFeatures() != ippCPUID_SSE42 - && (int64_t)(src.total()) * src.elemSize() >= CV_BIG_INT(0x80000000)/*2Gb*/ - ) - return false; - - IppiAxis ippMode; - if(flip_mode < 0) - ippMode = ippAxsBoth; - else if(flip_mode == 0) - ippMode = ippAxsHorizontal; - else - ippMode = ippAxsVertical; - - try - { - ::ipp::IwiImage iwSrc = ippiGetImage(src); - ::ipp::IwiImage iwDst = ippiGetImage(dst); - - CV_INSTRUMENT_FUN_IPP(::ipp::iwiMirror, iwSrc, iwDst, ippMode); - } - catch(const ::ipp::IwException &) - { - return false; - } - - return true; -#else - CV_UNUSED(src); CV_UNUSED(dst); CV_UNUSED(flip_mode); - return false; -#endif -} -#endif - - void flip( InputArray _src, OutputArray _dst, int flip_mode ) { CV_INSTRUMENT_REGION(); @@ -808,8 +696,6 @@ void flip( InputArray _src, OutputArray _dst, int flip_mode ) CALL_HAL(flip, cv_hal_flip, type, src.ptr(), src.step, src.cols, src.rows, dst.ptr(), dst.step, flip_mode); - CV_IPP_RUN_FAST(ipp_flip(src, dst, flip_mode)); - size_t esz = CV_ELEM_SIZE(type); if( flip_mode <= 0 )