diff --git a/3rdparty/openvx/include/openvx_hal.hpp b/3rdparty/openvx/include/openvx_hal.hpp index e150bed4e4..c5941e7b83 100644 --- a/3rdparty/openvx/include/openvx_hal.hpp +++ b/3rdparty/openvx/include/openvx_hal.hpp @@ -21,6 +21,12 @@ #define VX_INTERPOLATION_BILINEAR VX_INTERPOLATION_TYPE_BILINEAR #define VX_INTERPOLATION_AREA VX_INTERPOLATION_TYPE_AREA #define VX_INTERPOLATION_NEAREST_NEIGHBOR VX_INTERPOLATION_TYPE_NEAREST_NEIGHBOR +#define VX_IMAGE_RANGE VX_IMAGE_ATTRIBUTE_RANGE +#define VX_IMAGE_SPACE VX_IMAGE_ATTRIBUTE_SPACE +#define vx_border_t vx_border_mode_t +#define VX_BORDER_CONSTANT VX_BORDER_MODE_CONSTANT +#define VX_BORDER_REPLICATE VX_BORDER_MODE_REPLICATE +#define VX_CONTEXT_IMMEDIATE_BORDER VX_CONTEXT_ATTRIBUTE_IMMEDIATE_BORDER_MODE #endif @@ -100,6 +106,24 @@ struct VX_Traits }; }; +template <> +struct VX_Traits +{ + enum { + ImgType = VX_DF_IMAGE_U32, + DataType = VX_TYPE_UINT32 + }; +}; + +template <> +struct VX_Traits +{ + enum { + ImgType = VX_DF_IMAGE_S32, + DataType = VX_TYPE_INT32 + }; +}; + template <> struct VX_Traits { @@ -190,7 +214,12 @@ struct vxImage vxImage(vxContext &ctx, int imgType, const uchar *data, size_t step, int w, int h) { if (h == 1) - step = w; + step = w * ((imgType == VX_DF_IMAGE_RGBX || + imgType == VX_DF_IMAGE_U32 || imgType == VX_DF_IMAGE_S32) ? 4 : + imgType == VX_DF_IMAGE_RGB ? 3 : + (imgType == VX_DF_IMAGE_U16 || imgType == VX_DF_IMAGE_S16 || + imgType == VX_DF_IMAGE_UYVY || imgType == VX_DF_IMAGE_YUYV) ? 2 : 1); + vx_imagepatch_addressing_t addr[4]; void *ptrs[4]; switch (imgType) @@ -270,7 +299,11 @@ struct vxMatrix { mtx = vxCreateMatrix(ctx.ctx, VX_Traits::DataType, w, h); vxErr::check(mtx); +#if VX_VERSION > VX_VERSION_1_0 vxErr::check(vxCopyMatrix(mtx, const_cast(data), VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST)); +#else + vxErr::check(vxWriteMatrix(mtx, const_cast(data))); +#endif } ~vxMatrix() { @@ -278,8 +311,6 @@ struct vxMatrix } }; -#if VX_VERSION > VX_VERSION_1_0 - struct vxConvolution { vx_convolution cnv; @@ -288,7 +319,11 @@ struct vxConvolution { cnv = vxCreateConvolution(ctx.ctx, w, h); vxErr::check(cnv); +#if VX_VERSION > VX_VERSION_1_0 vxErr::check(vxCopyConvolutionCoefficients(cnv, const_cast(data), VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST)); +#else + vxErr::check(vxWriteConvolutionCoefficients(cnv, const_cast(data))); +#endif } ~vxConvolution() { @@ -296,7 +331,15 @@ struct vxConvolution } }; +inline void setConstantBorder(vx_border_t &border, vx_uint8 val) +{ + border.mode = VX_BORDER_CONSTANT; +#if VX_VERSION > VX_VERSION_1_0 + border.constant_value.U8 = val; +#else + border.constant_value = val; #endif +} //================================================================================================== // real code starts here @@ -444,8 +487,6 @@ inline int ovx_hal_resize(int atype, const uchar *a, size_t astep, int aw, int a return CV_HAL_ERROR_OK; } -#if VX_VERSION > VX_VERSION_1_0 - inline 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]) { try @@ -461,8 +502,7 @@ inline int ovx_hal_warpAffine(int atype, const uchar *a, size_t astep, int aw, i switch (borderType) { case CV_HAL_BORDER_CONSTANT: - border.mode = VX_BORDER_CONSTANT; - border.constant_value.U8 = (vx_uint8)(borderValue[0]); + setConstantBorder(border, (vx_uint8)borderValue[0]); break; case CV_HAL_BORDER_REPLICATE: border.mode = VX_BORDER_REPLICATE; @@ -519,8 +559,7 @@ inline int ovx_hal_warpPerspectve(int atype, const uchar *a, size_t astep, int a switch (borderType) { case CV_HAL_BORDER_CONSTANT: - border.mode = VX_BORDER_CONSTANT; - border.constant_value.U8 = (vx_uint8)(borderValue[0]); + setConstantBorder(border, (vx_uint8)borderValue[0]); break; case CV_HAL_BORDER_REPLICATE: border.mode = VX_BORDER_REPLICATE; @@ -585,8 +624,7 @@ inline int ovx_hal_filterInit(cvhalFilter2D **filter_context, uchar *kernel_data switch (borderType) { case CV_HAL_BORDER_CONSTANT: - border.mode = VX_BORDER_CONSTANT; - border.constant_value.U8 = 0; + setConstantBorder(border, 0); break; case CV_HAL_BORDER_REPLICATE: border.mode = VX_BORDER_REPLICATE; @@ -698,8 +736,7 @@ inline int ovx_hal_sepFilterInit(cvhalFilter2D **filter_context, int src_type, i switch (borderType) { case CV_HAL_BORDER_CONSTANT: - border.mode = VX_BORDER_CONSTANT; - border.constant_value.U8 = 0; + setConstantBorder(border, 0); break; case CV_HAL_BORDER_REPLICATE: border.mode = VX_BORDER_REPLICATE; @@ -737,6 +774,8 @@ inline int ovx_hal_sepFilterInit(cvhalFilter2D **filter_context, int src_type, i return CV_HAL_ERROR_OK; } +#if VX_VERSION > VX_VERSION_1_0 + struct MorphCtx { vxMatrix mask; @@ -759,18 +798,17 @@ inline int ovx_hal_morphInit(cvhalFilter2D **filter_context, int operation, int switch (borderType) { case CV_HAL_BORDER_CONSTANT: - border.mode = VX_BORDER_CONSTANT; if (borderValue[0] == DBL_MAX && borderValue[1] == DBL_MAX && borderValue[2] == DBL_MAX && borderValue[3] == DBL_MAX) { if (operation == MORPH_ERODE) - border.constant_value.U8 = UCHAR_MAX; + setConstantBorder(border, UCHAR_MAX); else - border.constant_value.U8 = 0; + setConstantBorder(border, 0); } else { - int rounded = round(borderValue[0]); - border.constant_value.U8 = (uchar)((unsigned)rounded <= UCHAR_MAX ? rounded : rounded > 0 ? UCHAR_MAX : 0); + int rounded = (int)round(borderValue[0]); + setConstantBorder(border, (vx_uint8)((unsigned)rounded <= UCHAR_MAX ? rounded : rounded > 0 ? UCHAR_MAX : 0)); } break; case CV_HAL_BORDER_REPLICATE: @@ -784,7 +822,7 @@ inline int ovx_hal_morphInit(cvhalFilter2D **filter_context, int operation, int vx_size maxKernelDim; vxErr::check(vxQueryContext(ctx->ctx, VX_CONTEXT_NONLINEAR_MAX_DIMENSION, &maxKernelDim, sizeof(maxKernelDim))); - if (kernel_width > maxKernelDim || kernel_height > maxKernelDim) + if ((vx_size)kernel_width > maxKernelDim || (vx_size)kernel_height > maxKernelDim) return CV_HAL_ERROR_NOT_IMPLEMENTED; std::vector kernel_mat; @@ -951,7 +989,7 @@ inline int ovx_hal_cvtTwoPlaneYUVtoBGR(const uchar * a, size_t astep, uchar * b, inline 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 (!swapBlue || (bcn != 3 && bcn != 4) || uIdx || w / 2 != astep - w / 2) + if (!swapBlue || (bcn != 3 && bcn != 4) || uIdx || (size_t)w / 2 != astep - (size_t)w / 2) return CV_HAL_ERROR_NOT_IMPLEMENTED; if (w & 1 || h & 1) // It's not described in spec but sample implementation unable to convert odd sized images @@ -978,7 +1016,7 @@ inline int ovx_hal_cvtThreePlaneYUVtoBGR(const uchar * a, size_t astep, uchar * inline 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 (!swapBlue || (acn != 3 && acn != 4) || uIdx || w / 2 != bstep - w / 2) + if (!swapBlue || (acn != 3 && acn != 4) || uIdx || (size_t)w / 2 != bstep - (size_t)w / 2) return CV_HAL_ERROR_NOT_IMPLEMENTED; if (w & 1 || h & 1) // It's not described in spec but sample implementation unable to convert odd sized images @@ -1064,8 +1102,6 @@ inline int ovx_hal_cvtOnePlaneYUVtoBGR(const uchar * a, size_t astep, uchar * b, #undef cv_hal_resize #define cv_hal_resize ovx_hal_resize -#if VX_VERSION > VX_VERSION_1_0 - #undef cv_hal_warpAffine #define cv_hal_warpAffine ovx_hal_warpAffine #undef cv_hal_warpPerspective @@ -1085,6 +1121,8 @@ inline int ovx_hal_cvtOnePlaneYUVtoBGR(const uchar * a, size_t astep, uchar * b, #undef cv_hal_sepFilterFree #define cv_hal_sepFilterFree ovx_hal_filterFree +#if VX_VERSION > VX_VERSION_1_0 + #undef cv_hal_morphInit #define cv_hal_morphInit ovx_hal_morphInit #undef cv_hal_morph