@ -81,6 +81,15 @@ inline bool dimTooBig(int size)
return false ;
}
inline bool skipSmallImages ( int w , int h , int kernel_id )
{
//OpenVX calls have essential overhead so it make sense to skip them for small images
if ( w * h < 1920 * 1080 )
return true ;
else
return false ;
}
inline void setConstantBorder ( ivx : : border_t & border , vx_uint8 val )
{
border . mode = VX_BORDER_CONSTANT ;
@ -122,10 +131,12 @@ public:
// real code starts here
// ...
# define OVX_BINARY_OP(hal_func, ovx_call) \
# define OVX_BINARY_OP(hal_func, ovx_call, kernel_id) \
template < typename T > \
int ovx_hal_ # # hal_func ( const T * a , size_t astep , const T * b , size_t bstep , T * c , size_t cstep , int w , int h ) \
{ \
if ( skipSmallImages ( w , h , kernel_id ) ) \
return CV_HAL_ERROR_NOT_IMPLEMENTED ; \
if ( dimTooBig ( w ) | | dimTooBig ( h ) ) \
return CV_HAL_ERROR_NOT_IMPLEMENTED ; \
refineStep ( w , h , ivx : : TypeToEnum < T > : : imgType , astep ) ; \
@ -156,18 +167,20 @@ int ovx_hal_##hal_func(const T *a, size_t astep, const T *b, size_t bstep, T *c,
return CV_HAL_ERROR_OK ; \
}
OVX_BINARY_OP ( add , { ivx : : IVX_CHECK_STATUS ( vxuAdd ( ctx , ia , ib , VX_CONVERT_POLICY_SATURATE , ic ) ) ; } )
OVX_BINARY_OP ( sub , { ivx : : IVX_CHECK_STATUS ( vxuSubtract ( ctx , ia , ib , VX_CONVERT_POLICY_SATURATE , ic ) ) ; } )
OVX_BINARY_OP ( add , { ivx : : IVX_CHECK_STATUS ( vxuAdd ( ctx , ia , ib , VX_CONVERT_POLICY_SATURATE , ic ) ) ; } , VX_KERNEL_ADD )
OVX_BINARY_OP ( sub , { ivx : : IVX_CHECK_STATUS ( vxuSubtract ( ctx , ia , ib , VX_CONVERT_POLICY_SATURATE , ic ) ) ; } , VX_KERNEL_SUBTRACT )
OVX_BINARY_OP ( absdiff , { ivx : : IVX_CHECK_STATUS ( vxuAbsDiff ( ctx , ia , ib , ic ) ) ; } )
OVX_BINARY_OP ( absdiff , { ivx : : IVX_CHECK_STATUS ( vxuAbsDiff ( ctx , ia , ib , ic ) ) ; } , VX_KERNEL_ABSDIFF )
OVX_BINARY_OP ( and , { ivx : : IVX_CHECK_STATUS ( vxuAnd ( ctx , ia , ib , ic ) ) ; } )
OVX_BINARY_OP ( or , { ivx : : IVX_CHECK_STATUS ( vxuOr ( ctx , ia , ib , ic ) ) ; } )
OVX_BINARY_OP ( xor , { ivx : : IVX_CHECK_STATUS ( vxuXor ( ctx , ia , ib , ic ) ) ; } )
OVX_BINARY_OP ( and , { ivx : : IVX_CHECK_STATUS ( vxuAnd ( ctx , ia , ib , ic ) ) ; } , VX_KERNEL_AND )
OVX_BINARY_OP ( or , { ivx : : IVX_CHECK_STATUS ( vxuOr ( ctx , ia , ib , ic ) ) ; } , VX_KERNEL_OR )
OVX_BINARY_OP ( xor , { ivx : : IVX_CHECK_STATUS ( vxuXor ( ctx , ia , ib , ic ) ) ; } , VX_KERNEL_XOR )
template < typename T >
int ovx_hal_mul ( const T * a , size_t astep , const T * b , size_t bstep , T * c , size_t cstep , int w , int h , double scale )
{
if ( skipSmallImages ( w , h , VX_KERNEL_MULTIPLY ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( dimTooBig ( w ) | | dimTooBig ( h ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
refineStep ( w , h , ivx : : TypeToEnum < T > : : imgType , astep ) ;
@ -234,6 +247,8 @@ template int ovx_hal_mul<short>(const short *a, size_t astep, const short *b, si
int ovx_hal_not ( const uchar * a , size_t astep , uchar * c , size_t cstep , int w , int h )
{
if ( skipSmallImages ( w , h , VX_KERNEL_NOT ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( dimTooBig ( w ) | | dimTooBig ( h ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
refineStep ( w , h , VX_DF_IMAGE_U8 , astep ) ;
@ -263,6 +278,8 @@ int ovx_hal_not(const uchar *a, size_t astep, uchar *c, size_t cstep, int w, int
int ovx_hal_merge8u ( const uchar * * src_data , uchar * dst_data , int len , int cn )
{
if ( skipSmallImages ( len , 1 , VX_KERNEL_CHANNEL_COMBINE ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( dimTooBig ( len ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( cn ! = 3 & & cn ! = 4 )
@ -299,6 +316,8 @@ int ovx_hal_merge8u(const uchar **src_data, uchar *dst_data, int len, int cn)
int ovx_hal_resize ( int atype , const uchar * a , size_t astep , int aw , int ah , uchar * b , size_t bstep , int bw , int bh , double inv_scale_x , double inv_scale_y , int interpolation )
{
if ( skipSmallImages ( aw , ah , VX_KERNEL_SCALE_IMAGE ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( dimTooBig ( aw ) | | dimTooBig ( ah ) | | dimTooBig ( bw ) | | dimTooBig ( bh ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
refineStep ( aw , ah , VX_DF_IMAGE_U8 , astep ) ;
@ -350,6 +369,8 @@ int ovx_hal_resize(int atype, const uchar *a, size_t astep, int aw, int ah, ucha
int ovx_hal_warpAffine ( int atype , const uchar * a , size_t astep , int aw , int ah , uchar * b , size_t bstep , int bw , int bh , const double M [ 6 ] , int interpolation , int borderType , const double borderValue [ 4 ] )
{
if ( skipSmallImages ( aw , ah , VX_KERNEL_WARP_AFFINE ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( dimTooBig ( aw ) | | dimTooBig ( ah ) | | dimTooBig ( bw ) | | dimTooBig ( bh ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
refineStep ( aw , ah , VX_DF_IMAGE_U8 , astep ) ;
@ -410,6 +431,8 @@ int ovx_hal_warpAffine(int atype, const uchar *a, size_t astep, int aw, int ah,
int ovx_hal_warpPerspectve ( int atype , const uchar * a , size_t astep , int aw , int ah , uchar * b , size_t bstep , int bw , int bh , const double M [ 9 ] , int interpolation , int borderType , const double borderValue [ 4 ] )
{
if ( skipSmallImages ( aw , ah , VX_KERNEL_WARP_PERSPECTIVE ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( dimTooBig ( aw ) | | dimTooBig ( ah ) | | dimTooBig ( bw ) | | dimTooBig ( bh ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
refineStep ( aw , ah , VX_DF_IMAGE_U8 , astep ) ;
@ -558,6 +581,8 @@ int ovx_hal_filterFree(cvhalFilter2D *filter_context)
int ovx_hal_filter ( cvhalFilter2D * filter_context , uchar * a , size_t astep , uchar * b , size_t bstep , int w , int h , int , int , int , int )
{
if ( skipSmallImages ( w , h , VX_KERNEL_CUSTOM_CONVOLUTION ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( dimTooBig ( w ) | | dimTooBig ( h ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
try
@ -782,6 +807,8 @@ int ovx_hal_morphFree(cvhalFilter2D *filter_context)
int ovx_hal_morph ( cvhalFilter2D * filter_context , uchar * a , size_t astep , uchar * b , size_t bstep , int w , int h , int , int , int , int , int , int , int , int )
{
if ( skipSmallImages ( w , h , VX_KERNEL_DILATE_3x3 ) ) //Actually it make sense to separate checks if implementations of dilation and erosion have different performance gain
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( dimTooBig ( w ) | | dimTooBig ( h ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
refineStep ( w , h , VX_DF_IMAGE_U8 , astep ) ;
@ -823,6 +850,8 @@ int ovx_hal_morph(cvhalFilter2D *filter_context, uchar *a, size_t astep, uchar *
int ovx_hal_cvtBGRtoBGR ( const uchar * a , size_t astep , uchar * b , size_t bstep , int w , int h , int depth , int acn , int bcn , bool swapBlue )
{
if ( skipSmallImages ( w , h , VX_KERNEL_COLOR_CONVERT ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( dimTooBig ( w ) | | dimTooBig ( h ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( depth ! = CV_8U | | swapBlue | | acn = = bcn | | ( acn ! = 3 & & acn ! = 4 ) | | ( bcn ! = 3 & & bcn ! = 4 ) )
@ -857,6 +886,8 @@ int ovx_hal_cvtBGRtoBGR(const uchar * a, size_t astep, uchar * b, size_t bstep,
int ovx_hal_cvtGraytoBGR ( const uchar * a , size_t astep , uchar * b , size_t bstep , int w , int h , int depth , int bcn )
{
if ( skipSmallImages ( w , h , VX_KERNEL_CHANNEL_COMBINE ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( dimTooBig ( w ) | | dimTooBig ( h ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( depth ! = CV_8U | | ( bcn ! = 3 & & bcn ! = 4 ) )
@ -890,6 +921,8 @@ int ovx_hal_cvtGraytoBGR(const uchar * a, size_t astep, uchar * b, size_t bstep,
int ovx_hal_cvtTwoPlaneYUVtoBGR ( const uchar * a , size_t astep , uchar * b , size_t bstep , int w , int h , int bcn , bool swapBlue , int uIdx )
{
if ( skipSmallImages ( w , h , VX_KERNEL_COLOR_CONVERT ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( dimTooBig ( w ) | | dimTooBig ( h ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( ! swapBlue | | ( bcn ! = 3 & & bcn ! = 4 ) )
@ -934,6 +967,8 @@ int ovx_hal_cvtTwoPlaneYUVtoBGR(const uchar * a, size_t astep, uchar * b, size_t
int ovx_hal_cvtThreePlaneYUVtoBGR ( const uchar * a , size_t astep , uchar * b , size_t bstep , int w , int h , int bcn , bool swapBlue , int uIdx )
{
if ( skipSmallImages ( w , h , VX_KERNEL_COLOR_CONVERT ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( dimTooBig ( w ) | | dimTooBig ( h ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( ! swapBlue | | ( bcn ! = 3 & & bcn ! = 4 ) | | uIdx | | ( size_t ) w / 2 ! = astep - ( size_t ) w / 2 )
@ -982,6 +1017,8 @@ int ovx_hal_cvtThreePlaneYUVtoBGR(const uchar * a, size_t astep, uchar * b, size
int ovx_hal_cvtBGRtoThreePlaneYUV ( const uchar * a , size_t astep , uchar * b , size_t bstep , int w , int h , int acn , bool swapBlue , int uIdx )
{
if ( skipSmallImages ( w , h , VX_KERNEL_COLOR_CONVERT ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( dimTooBig ( w ) | | dimTooBig ( h ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( ! swapBlue | | ( acn ! = 3 & & acn ! = 4 ) | | uIdx | | ( size_t ) w / 2 ! = bstep - ( size_t ) w / 2 )
@ -1028,6 +1065,8 @@ int ovx_hal_cvtBGRtoThreePlaneYUV(const uchar * a, size_t astep, uchar * b, size
int ovx_hal_cvtOnePlaneYUVtoBGR ( const uchar * a , size_t astep , uchar * b , size_t bstep , int w , int h , int bcn , bool swapBlue , int uIdx , int ycn )
{
if ( skipSmallImages ( w , h , VX_KERNEL_COLOR_CONVERT ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( dimTooBig ( w ) | | dimTooBig ( h ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( ! swapBlue | | ( bcn ! = 3 & & bcn ! = 4 ) | | uIdx )
@ -1065,6 +1104,8 @@ int ovx_hal_cvtOnePlaneYUVtoBGR(const uchar * a, size_t astep, uchar * b, size_t
int ovx_hal_integral ( int depth , int sdepth , int , const uchar * a , size_t astep , uchar * b , size_t bstep , uchar * c , size_t , uchar * d , size_t , int w , int h , int cn )
{
if ( skipSmallImages ( w , h , VX_KERNEL_INTEGRAL_IMAGE ) )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
if ( depth ! = CV_8U | | sdepth ! = CV_32S | | c ! = NULL | | d ! = NULL | | cn ! = 1 )
return CV_HAL_ERROR_NOT_IMPLEMENTED ;
refineStep ( w , h , VX_DF_IMAGE_U8 , astep ) ;