Home | History | Annotate | Download | only in core
      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