1 /*M/////////////////////////////////////////////////////////////////////////////////////// 2 // 3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 4 // 5 // By downloading, copying, installing or using the software you agree to this license. 6 // If you do not agree to this license, do not download, install, 7 // copy or use the software. 8 // 9 // 10 // License Agreement 11 // For Open Source Computer Vision Library 12 // 13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. 14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved. 15 // Copyright (C) 2013, OpenCV Foundation, all rights reserved. 16 // Third party copyrights are property of their respective owners. 17 // 18 // Redistribution and use in source and binary forms, with or without modification, 19 // are permitted provided that the following conditions are met: 20 // 21 // * Redistribution's of source code must retain the above copyright notice, 22 // this list of conditions and the following disclaimer. 23 // 24 // * Redistribution's in binary form must reproduce the above copyright notice, 25 // this list of conditions and the following disclaimer in the documentation 26 // and/or other materials provided with the distribution. 27 // 28 // * The name of the copyright holders may not be used to endorse or promote products 29 // derived from this software without specific prior written permission. 30 // 31 // This software is provided by the copyright holders and contributors "as is" and 32 // any express or implied warranties, including, but not limited to, the implied 33 // warranties of merchantability and fitness for a particular purpose are disclaimed. 34 // In no event shall the Intel Corporation or contributors be liable for any direct, 35 // indirect, incidental, special, exemplary, or consequential damages 36 // (including, but not limited to, procurement of substitute goods or services; 37 // loss of use, data, or profits; or business interruption) however caused 38 // and on any theory of liability, whether in contract, strict liability, 39 // or tort (including negligence or otherwise) arising in any way out of 40 // the use of this software, even if advised of the possibility of such damage. 41 // 42 //M*/ 43 44 #ifndef __OPENCV_CORE_PRIVATE_HPP__ 45 #define __OPENCV_CORE_PRIVATE_HPP__ 46 47 #ifndef __OPENCV_BUILD 48 # error this is a private header which should not be used from outside of the OpenCV library 49 #endif 50 51 #include "opencv2/core.hpp" 52 #include "cvconfig.h" 53 54 #ifdef HAVE_EIGEN 55 # if defined __GNUC__ && defined __APPLE__ 56 # pragma GCC diagnostic ignored "-Wshadow" 57 # endif 58 # include <Eigen/Core> 59 # include "opencv2/core/eigen.hpp" 60 #endif 61 62 #ifdef HAVE_TBB 63 # include "tbb/tbb_stddef.h" 64 # if TBB_VERSION_MAJOR*100 + TBB_VERSION_MINOR >= 202 65 # include "tbb/tbb.h" 66 # include "tbb/task.h" 67 # undef min 68 # undef max 69 # else 70 # undef HAVE_TBB 71 # endif 72 #endif 73 74 //! @cond IGNORED 75 76 namespace cv 77 { 78 #ifdef HAVE_TBB 79 80 typedef tbb::blocked_range<int> BlockedRange; 81 82 template<typename Body> static inline 83 void parallel_for( const BlockedRange& range, const Body& body ) 84 { 85 tbb::parallel_for(range, body); 86 } 87 88 typedef tbb::split Split; 89 90 template<typename Body> static inline 91 void parallel_reduce( const BlockedRange& range, Body& body ) 92 { 93 tbb::parallel_reduce(range, body); 94 } 95 96 typedef tbb::concurrent_vector<Rect> ConcurrentRectVector; 97 #else 98 class BlockedRange 99 { 100 public: 101 BlockedRange() : _begin(0), _end(0), _grainsize(0) {} 102 BlockedRange(int b, int e, int g=1) : _begin(b), _end(e), _grainsize(g) {} 103 int begin() const { return _begin; } 104 int end() const { return _end; } 105 int grainsize() const { return _grainsize; } 106 107 protected: 108 int _begin, _end, _grainsize; 109 }; 110 111 template<typename Body> static inline 112 void parallel_for( const BlockedRange& range, const Body& body ) 113 { 114 body(range); 115 } 116 typedef std::vector<Rect> ConcurrentRectVector; 117 118 class Split {}; 119 120 template<typename Body> static inline 121 void parallel_reduce( const BlockedRange& range, Body& body ) 122 { 123 body(range); 124 } 125 #endif 126 127 // Returns a static string if there is a parallel framework, 128 // NULL otherwise. 129 CV_EXPORTS const char* currentParallelFramework(); 130 } //namespace cv 131 132 /****************************************************************************************\ 133 * Common declarations * 134 \****************************************************************************************/ 135 136 /* the alignment of all the allocated buffers */ 137 #define CV_MALLOC_ALIGN 16 138 139 /* IEEE754 constants and macros */ 140 #define CV_TOGGLE_FLT(x) ((x)^((int)(x) < 0 ? 0x7fffffff : 0)) 141 #define CV_TOGGLE_DBL(x) ((x)^((int64)(x) < 0 ? CV_BIG_INT(0x7fffffffffffffff) : 0)) 142 143 static inline void* cvAlignPtr( const void* ptr, int align = 32 ) 144 { 145 CV_DbgAssert ( (align & (align-1)) == 0 ); 146 return (void*)( ((size_t)ptr + align - 1) & ~(size_t)(align-1) ); 147 } 148 149 static inline int cvAlign( int size, int align ) 150 { 151 CV_DbgAssert( (align & (align-1)) == 0 && size < INT_MAX ); 152 return (size + align - 1) & -align; 153 } 154 155 #ifdef IPL_DEPTH_8U 156 static inline cv::Size cvGetMatSize( const CvMat* mat ) 157 { 158 return cv::Size(mat->cols, mat->rows); 159 } 160 #endif 161 162 namespace cv 163 { 164 CV_EXPORTS void scalarToRawData(const cv::Scalar& s, void* buf, int type, int unroll_to = 0); 165 } 166 167 // property implementation macros 168 169 #define CV_IMPL_PROPERTY_RO(type, name, member) \ 170 inline type get##name() const { return member; } 171 172 #define CV_HELP_IMPL_PROPERTY(r_type, w_type, name, member) \ 173 CV_IMPL_PROPERTY_RO(r_type, name, member) \ 174 inline void set##name(w_type val) { member = val; } 175 176 #define CV_HELP_WRAP_PROPERTY(r_type, w_type, name, internal_name, internal_obj) \ 177 r_type get##name() const { return internal_obj.get##internal_name(); } \ 178 void set##name(w_type val) { internal_obj.set##internal_name(val); } 179 180 #define CV_IMPL_PROPERTY(type, name, member) CV_HELP_IMPL_PROPERTY(type, type, name, member) 181 #define CV_IMPL_PROPERTY_S(type, name, member) CV_HELP_IMPL_PROPERTY(type, const type &, name, member) 182 183 #define CV_WRAP_PROPERTY(type, name, internal_name, internal_obj) CV_HELP_WRAP_PROPERTY(type, type, name, internal_name, internal_obj) 184 #define CV_WRAP_PROPERTY_S(type, name, internal_name, internal_obj) CV_HELP_WRAP_PROPERTY(type, const type &, name, internal_name, internal_obj) 185 186 #define CV_WRAP_SAME_PROPERTY(type, name, internal_obj) CV_WRAP_PROPERTY(type, name, name, internal_obj) 187 #define CV_WRAP_SAME_PROPERTY_S(type, name, internal_obj) CV_WRAP_PROPERTY_S(type, name, name, internal_obj) 188 189 /****************************************************************************************\ 190 * Structures and macros for integration with IPP * 191 \****************************************************************************************/ 192 193 #ifdef HAVE_IPP 194 # include "ipp.h" 195 196 # define IPP_VERSION_X100 (IPP_VERSION_MAJOR * 100 + IPP_VERSION_MINOR) 197 198 #define IPP_ALIGN 32 // required for AVX optimization 199 200 #define setIppErrorStatus() cv::ipp::setIppStatus(-1, CV_Func, __FILE__, __LINE__) 201 202 static inline IppiSize ippiSize(int width, int height) 203 { 204 IppiSize size = { width, height }; 205 return size; 206 } 207 208 static inline IppiSize ippiSize(const cv::Size & _size) 209 { 210 IppiSize size = { _size.width, _size.height }; 211 return size; 212 } 213 214 static inline IppiBorderType ippiGetBorderType(int borderTypeNI) 215 { 216 return borderTypeNI == cv::BORDER_CONSTANT ? ippBorderConst : 217 borderTypeNI == cv::BORDER_WRAP ? ippBorderWrap : 218 borderTypeNI == cv::BORDER_REPLICATE ? ippBorderRepl : 219 borderTypeNI == cv::BORDER_REFLECT_101 ? ippBorderMirror : 220 borderTypeNI == cv::BORDER_REFLECT ? ippBorderMirrorR : (IppiBorderType)-1; 221 } 222 223 static inline IppDataType ippiGetDataType(int depth) 224 { 225 return depth == CV_8U ? ipp8u : 226 depth == CV_8S ? ipp8s : 227 depth == CV_16U ? ipp16u : 228 depth == CV_16S ? ipp16s : 229 depth == CV_32S ? ipp32s : 230 depth == CV_32F ? ipp32f : 231 depth == CV_64F ? ipp64f : (IppDataType)-1; 232 } 233 234 #else 235 # define IPP_VERSION_X100 0 236 #endif 237 238 #define CV_IPP_CHECK_COND (cv::ipp::useIPP()) 239 #define CV_IPP_CHECK() if(CV_IPP_CHECK_COND) 240 241 #ifndef IPPI_CALL 242 # define IPPI_CALL(func) CV_Assert((func) >= 0) 243 #endif 244 245 /* IPP-compatible return codes */ 246 typedef enum CvStatus 247 { 248 CV_BADMEMBLOCK_ERR = -113, 249 CV_INPLACE_NOT_SUPPORTED_ERR= -112, 250 CV_UNMATCHED_ROI_ERR = -111, 251 CV_NOTFOUND_ERR = -110, 252 CV_BADCONVERGENCE_ERR = -109, 253 254 CV_BADDEPTH_ERR = -107, 255 CV_BADROI_ERR = -106, 256 CV_BADHEADER_ERR = -105, 257 CV_UNMATCHED_FORMATS_ERR = -104, 258 CV_UNSUPPORTED_COI_ERR = -103, 259 CV_UNSUPPORTED_CHANNELS_ERR = -102, 260 CV_UNSUPPORTED_DEPTH_ERR = -101, 261 CV_UNSUPPORTED_FORMAT_ERR = -100, 262 263 CV_BADARG_ERR = -49, //ipp comp 264 CV_NOTDEFINED_ERR = -48, //ipp comp 265 266 CV_BADCHANNELS_ERR = -47, //ipp comp 267 CV_BADRANGE_ERR = -44, //ipp comp 268 CV_BADSTEP_ERR = -29, //ipp comp 269 270 CV_BADFLAG_ERR = -12, 271 CV_DIV_BY_ZERO_ERR = -11, //ipp comp 272 CV_BADCOEF_ERR = -10, 273 274 CV_BADFACTOR_ERR = -7, 275 CV_BADPOINT_ERR = -6, 276 CV_BADSCALE_ERR = -4, 277 CV_OUTOFMEM_ERR = -3, 278 CV_NULLPTR_ERR = -2, 279 CV_BADSIZE_ERR = -1, 280 CV_NO_ERR = 0, 281 CV_OK = CV_NO_ERR 282 } 283 CvStatus; 284 285 #ifdef HAVE_TEGRA_OPTIMIZATION 286 namespace tegra { 287 288 CV_EXPORTS bool useTegra(); 289 CV_EXPORTS void setUseTegra(bool flag); 290 291 } 292 #endif 293 294 //! @endcond 295 296 #endif // __OPENCV_CORE_PRIVATE_HPP__ 297