diff --git a/adapters/opencv/intrinsiccv_hal.cpp b/adapters/opencv/intrinsiccv_hal.cpp index f5a4cbf546a8efc1ff4a327a56bddc43b6ff44ae..8881de16ae647ad2060e026ab799aef58434f558 100644 --- a/adapters/opencv/intrinsiccv_hal.cpp +++ b/adapters/opencv/intrinsiccv_hal.cpp @@ -26,11 +26,15 @@ namespace intrinsiccv::hal { #define INTRINSICCV_EXIT_WITH_NOT_IMPLEMENTED_IF_NEEDED() #endif -// Invokes a function through 'void*'. -template -R invoke_any(void *impl, Args... args) { - using T = R (*)(Args...); - return reinterpret_cast(impl)(args...); +static int convert_error(intrinsiccv_error_t e) { + switch (e) { + case INTRINSICCV_OK: + return CV_HAL_ERROR_OK; + case INTRINSICCV_ERROR_NOT_IMPLEMENTED: + return CV_HAL_ERROR_NOT_IMPLEMENTED; + default: + return CV_HAL_ERROR_UNKNOWN; + } } // Returns the size in bytes of an OpenCV type. @@ -60,16 +64,13 @@ int gray_to_bgr(const uchar *src_data, size_t src_step, uchar *dst_data, if (depth == CV_8U) { if (dcn == 3) { - intrinsiccv_gray_to_rgb_u8( - reinterpret_cast(src_data), src_step, - reinterpret_cast(dst_data), dst_step, width, height); - } else { - intrinsiccv_gray_to_rgba_u8( + return convert_error(intrinsiccv_gray_to_rgb_u8( reinterpret_cast(src_data), src_step, - reinterpret_cast(dst_data), dst_step, width, height); + reinterpret_cast(dst_data), dst_step, width, height)); } - - return CV_HAL_ERROR_OK; + return convert_error(intrinsiccv_gray_to_rgba_u8( + reinterpret_cast(src_data), src_step, + reinterpret_cast(dst_data), dst_step, width, height)); } return CV_HAL_ERROR_NOT_IMPLEMENTED; @@ -88,53 +89,47 @@ int bgr_to_bgr(const uchar *src_data, size_t src_step, uchar *dst_data, if (depth == CV_8U) { if (scn == 3 && dcn == 3) { if (swapBlue) { - intrinsiccv_rgb_to_bgr_u8( + return convert_error(intrinsiccv_rgb_to_bgr_u8( reinterpret_cast(src_data), src_step, - reinterpret_cast(dst_data), dst_step, width, height); - } else { - intrinsiccv_rgb_to_rgb_u8( - reinterpret_cast(src_data), src_step, - reinterpret_cast(dst_data), dst_step, width, height); + reinterpret_cast(dst_data), dst_step, width, height)); } + return convert_error(intrinsiccv_rgb_to_rgb_u8( + reinterpret_cast(src_data), src_step, + reinterpret_cast(dst_data), dst_step, width, height)); } if (scn == 4 && dcn == 4) { if (swapBlue) { - intrinsiccv_rgba_to_bgra_u8( + return convert_error(intrinsiccv_rgba_to_bgra_u8( reinterpret_cast(src_data), src_step, - reinterpret_cast(dst_data), dst_step, width, height); - } else { - intrinsiccv_rgba_to_rgba_u8( - reinterpret_cast(src_data), src_step, - reinterpret_cast(dst_data), dst_step, width, height); + reinterpret_cast(dst_data), dst_step, width, height)); } + return convert_error(intrinsiccv_rgba_to_rgba_u8( + reinterpret_cast(src_data), src_step, + reinterpret_cast(dst_data), dst_step, width, height)); } if (scn == 3 && dcn == 4) { if (swapBlue) { - intrinsiccv_rgb_to_bgra_u8( + return convert_error(intrinsiccv_rgb_to_bgra_u8( reinterpret_cast(src_data), src_step, - reinterpret_cast(dst_data), dst_step, width, height); - } else { - intrinsiccv_rgb_to_rgba_u8( - reinterpret_cast(src_data), src_step, - reinterpret_cast(dst_data), dst_step, width, height); + reinterpret_cast(dst_data), dst_step, width, height)); } + return convert_error(intrinsiccv_rgb_to_rgba_u8( + reinterpret_cast(src_data), src_step, + reinterpret_cast(dst_data), dst_step, width, height)); } if (scn == 4 && dcn == 3) { if (swapBlue) { - intrinsiccv_rgba_to_bgr_u8( + return convert_error(intrinsiccv_rgba_to_bgr_u8( reinterpret_cast(src_data), src_step, - reinterpret_cast(dst_data), dst_step, width, height); - } else { - intrinsiccv_rgba_to_rgb_u8( - reinterpret_cast(src_data), src_step, - reinterpret_cast(dst_data), dst_step, width, height); + reinterpret_cast(dst_data), dst_step, width, height)); } + return convert_error(intrinsiccv_rgba_to_rgb_u8( + reinterpret_cast(src_data), src_step, + reinterpret_cast(dst_data), dst_step, width, height)); } - - return CV_HAL_ERROR_OK; } return CV_HAL_ERROR_NOT_IMPLEMENTED; @@ -160,36 +155,32 @@ int yuv_to_bgr_ex(const uchar *y_data, size_t y_step, const uchar *uv_data, if (dcn == 3) { if (is_bgr) { - intrinsiccv_yuv_sp_to_bgr_u8( + return convert_error(intrinsiccv_yuv_sp_to_bgr_u8( reinterpret_cast(y_data), y_step, reinterpret_cast(uv_data), uv_step, reinterpret_cast(dst_data), dst_step, dst_width, - dst_height, is_nv21); - } else { - intrinsiccv_yuv_sp_to_rgb_u8( - reinterpret_cast(y_data), y_step, - reinterpret_cast(uv_data), uv_step, - reinterpret_cast(dst_data), dst_step, dst_width, - dst_height, is_nv21); + dst_height, is_nv21)); } - return CV_HAL_ERROR_OK; + return convert_error(intrinsiccv_yuv_sp_to_rgb_u8( + reinterpret_cast(y_data), y_step, + reinterpret_cast(uv_data), uv_step, + reinterpret_cast(dst_data), dst_step, dst_width, dst_height, + is_nv21)); } if (dcn == 4) { if (is_bgr) { - intrinsiccv_yuv_sp_to_bgra_u8( + return convert_error(intrinsiccv_yuv_sp_to_bgra_u8( reinterpret_cast(y_data), y_step, reinterpret_cast(uv_data), uv_step, reinterpret_cast(dst_data), dst_step, dst_width, - dst_height, is_nv21); - } else { - intrinsiccv_yuv_sp_to_rgba_u8( - reinterpret_cast(y_data), y_step, - reinterpret_cast(uv_data), uv_step, - reinterpret_cast(dst_data), dst_step, dst_width, - dst_height, is_nv21); + dst_height, is_nv21)); } - return CV_HAL_ERROR_OK; + return convert_error(intrinsiccv_yuv_sp_to_rgba_u8( + reinterpret_cast(y_data), y_step, + reinterpret_cast(uv_data), uv_step, + reinterpret_cast(dst_data), dst_step, dst_width, dst_height, + is_nv21)); } return CV_HAL_ERROR_NOT_IMPLEMENTED; @@ -203,11 +194,10 @@ int threshold(const uchar *src_data, size_t src_step, uchar *dst_data, (void)cn; if ((depth == CV_8U) && (thresholdType == 0 /* THRESH_BINARY */)) { - intrinsiccv_threshold_binary_u8( + return convert_error(intrinsiccv_threshold_binary_u8( reinterpret_cast(src_data), src_step, reinterpret_cast(dst_data), dst_step, width, height, - static_cast(thresh), static_cast(maxValue)); - return CV_HAL_ERROR_OK; + static_cast(thresh), static_cast(maxValue))); } return CV_HAL_ERROR_NOT_IMPLEMENTED; @@ -291,13 +281,13 @@ int gaussian_blur(const uchar *src_data, size_t src_step, uchar *dst_data, return CV_HAL_ERROR_NOT_IMPLEMENTED; } - void *impl{nullptr}; + decltype(intrinsiccv_gaussian_blur_3x3_u8) *impl{nullptr}; if ((ksize_width == 3) && (ksize_height == 3) && (width >= 3) && (height >= 3)) { - impl = reinterpret_cast(intrinsiccv_gaussian_blur_3x3_u8); + impl = intrinsiccv_gaussian_blur_3x3_u8; } else if ((ksize_width == 5) && (ksize_height == 5) && (width >= 5) && (height >= 5)) { - impl = reinterpret_cast(intrinsiccv_gaussian_blur_5x5_u8); + impl = intrinsiccv_gaussian_blur_5x5_u8; } else { return CV_HAL_ERROR_NOT_IMPLEMENTED; } @@ -309,17 +299,19 @@ int gaussian_blur(const uchar *src_data, size_t src_step, uchar *dst_data, intrinsiccv_rectangle_t image = { .width = static_cast(width), .height = static_cast(height)}; - if (!intrinsiccv_filter_create(¶ms, image)) { - return CV_HAL_ERROR_UNKNOWN; + if (intrinsiccv_error_t create_err = + intrinsiccv_filter_create(¶ms, image)) { + return convert_error(create_err); } - invoke_any(impl, reinterpret_cast(src_data), src_step, - reinterpret_cast(dst_data), dst_step, width, height, cn, - intrinsiccv_border_type, ¶ms); + intrinsiccv_error_t blur_err = + impl(reinterpret_cast(src_data), src_step, + reinterpret_cast(dst_data), dst_step, width, height, cn, + intrinsiccv_border_type, ¶ms); - intrinsiccv_filter_release(¶ms); + intrinsiccv_error_t release_err = intrinsiccv_filter_release(¶ms); - return CV_HAL_ERROR_OK; + return convert_error(blur_err ? blur_err : release_err); } int morphology_init(cvhalFilter2D **context, int operation, int src_type, @@ -356,13 +348,18 @@ int morphology_init(cvhalFilter2D **context, int operation, int src_type, size_t kernel_area = kernel_width_sz * kernel_height_sz; switch (CV_MAT_DEPTH(kernel_type)) { - case CV_8U: - if (intrinsiccv_count_nonzeros_u8(static_cast(kernel_data), - kernel_step, kernel_width_sz, - kernel_height_sz) != kernel_area) { + case CV_8U: { + size_t nonzero_count = 0; + if (intrinsiccv_error_t err = intrinsiccv_count_nonzeros_u8( + static_cast(kernel_data), kernel_step, kernel_width_sz, + kernel_height_sz, &nonzero_count)) { + return convert_error(err); + } + if (nonzero_count != kernel_area) { return CV_HAL_ERROR_NOT_IMPLEMENTED; } break; + } default: return CV_HAL_ERROR_NOT_IMPLEMENTED; } @@ -424,8 +421,9 @@ int morphology_init(cvhalFilter2D **context, int operation, int src_type, .width = static_cast(max_width), .height = static_cast(max_height)}; - if (!intrinsiccv_morphology_create(params.get(), image)) { - return CV_HAL_ERROR_UNKNOWN; + if (intrinsiccv_error_t err = + intrinsiccv_morphology_create(params.get(), image)) { + return convert_error(err); } *context = reinterpret_cast(params.release()); @@ -451,10 +449,11 @@ int morphology_operation(cvhalFilter2D *context, uchar *src_data, (void)dst_roi_y; auto params = reinterpret_cast(context); - invoke_any(params->impl, reinterpret_cast(src_data), - src_step, reinterpret_cast(dst_data), dst_step, - static_cast(width), static_cast(height), params); - return CV_HAL_ERROR_OK; + auto impl = reinterpret_cast(params->impl); + return convert_error(impl(reinterpret_cast(src_data), + src_step, reinterpret_cast(dst_data), + dst_step, static_cast(width), + static_cast(height), params)); } int morphology_free(cvhalFilter2D *context) { @@ -462,8 +461,7 @@ int morphology_free(cvhalFilter2D *context) { auto params = std::unique_ptr( reinterpret_cast(context)); - intrinsiccv_morphology_release(params.get()); - return CV_HAL_ERROR_OK; + return convert_error(intrinsiccv_morphology_release(params.get())); } int sobel(const uchar *src_data, size_t src_step, uchar *dst_data, @@ -510,17 +508,15 @@ int sobel(const uchar *src_data, size_t src_step, uchar *dst_data, } if (dx == 1 && dy == 0) { - intrinsiccv_sobel_3x3_horizontal_s16_u8( + return convert_error(intrinsiccv_sobel_3x3_horizontal_s16_u8( src_data, src_step, reinterpret_cast(dst_data), dst_step, - width, height, cn); - return CV_HAL_ERROR_OK; + width, height, cn)); } if (dx == 0 && dy == 1) { - intrinsiccv_sobel_3x3_vertical_s16_u8(src_data, src_step, - reinterpret_cast(dst_data), - dst_step, width, height, cn); - return CV_HAL_ERROR_OK; + return convert_error(intrinsiccv_sobel_3x3_vertical_s16_u8( + src_data, src_step, reinterpret_cast(dst_data), dst_step, + width, height, cn)); } return CV_HAL_ERROR_NOT_IMPLEMENTED; @@ -547,11 +543,11 @@ int canny(const uchar *src_data, size_t src_step, uchar *dst_data, return CV_HAL_ERROR_NOT_IMPLEMENTED; } - intrinsiccv_canny_u8(reinterpret_cast(src_data), src_step, - reinterpret_cast(dst_data), dst_step, - static_cast(width), static_cast(height), - lowThreshold, highThreshold); - return CV_HAL_ERROR_OK; + return convert_error(intrinsiccv_canny_u8( + reinterpret_cast(src_data), src_step, + reinterpret_cast(dst_data), dst_step, + static_cast(width), static_cast(height), lowThreshold, + highThreshold)); } int transpose(const uchar *src_data, size_t src_step, uchar *dst_data, @@ -568,44 +564,46 @@ int transpose(const uchar *src_data, size_t src_step, uchar *dst_data, return CV_HAL_ERROR_NOT_IMPLEMENTED; } - intrinsiccv_transpose(reinterpret_cast(src_data), src_step, - reinterpret_cast(dst_data), dst_step, - static_cast(src_width), - static_cast(src_height), - static_cast(element_size)); - return CV_HAL_ERROR_OK; + return convert_error(intrinsiccv_transpose( + reinterpret_cast(src_data), src_step, + reinterpret_cast(dst_data), dst_step, + static_cast(src_width), static_cast(src_height), + static_cast(element_size))); } template -void call_min_max(FunctionType min_max_func, const uchar *src_data, - size_t src_stride, int width, int height, double *min_value, - double *max_value) { +INTRINSICCV_NODISCARD intrinsiccv_error_t call_min_max( + FunctionType min_max_func, const uchar *src_data, size_t src_stride, + int width, int height, double *min_value, double *max_value) { T tmp_min_value, tmp_max_value; T *p_min_value = min_value ? &tmp_min_value : nullptr; T *p_max_value = max_value ? &tmp_max_value : nullptr; - min_max_func(reinterpret_cast(src_data), src_stride, - static_cast(width), static_cast(height), - p_min_value, p_max_value); + intrinsiccv_error_t err = + min_max_func(reinterpret_cast(src_data), src_stride, + static_cast(width), static_cast(height), + p_min_value, p_max_value); if (min_value) { *min_value = static_cast(tmp_min_value); } if (max_value) { *max_value = static_cast(tmp_max_value); } + return err; } template -void call_min_max_loc(FunctionType min_max_loc_func, const uchar *src_data, - size_t src_stride, int width, int height, - double *min_value, double *max_value, int *min_index, - int *max_index) { +INTRINSICCV_NODISCARD intrinsiccv_error_t +call_min_max_loc(FunctionType min_max_loc_func, const uchar *src_data, + size_t src_stride, int width, int height, double *min_value, + double *max_value, int *min_index, int *max_index) { size_t tmp_min_offset, tmp_max_offset; size_t *p_min_offset = (min_value || min_index) ? &tmp_min_offset : nullptr; size_t *p_max_offset = (max_value || max_index) ? &tmp_max_offset : nullptr; - min_max_loc_func(reinterpret_cast(src_data), src_stride, - static_cast(width), static_cast(height), - p_min_offset, p_max_offset); + intrinsiccv_error_t err = + min_max_loc_func(reinterpret_cast(src_data), src_stride, + static_cast(width), static_cast(height), + p_min_offset, p_max_offset); if (min_value) { *min_value = static_cast(src_data[tmp_min_offset]); } @@ -620,6 +618,7 @@ void call_min_max_loc(FunctionType min_max_loc_func, const uchar *src_data, /* row */ max_index[0] = tmp_max_offset / src_stride; /* col */ max_index[1] = (tmp_max_offset % src_stride) / sizeof(T); } + return err; } int min_max_idx(const uchar *src_data, size_t src_step, int width, int height, @@ -633,39 +632,37 @@ int min_max_idx(const uchar *src_data, size_t src_step, int width, int height, if (minIdx || maxIdx) { if (depth == CV_8U) { - call_min_max_loc(intrinsiccv_min_max_loc_u8, src_data, src_step, - width, height, minVal, maxVal, minIdx, maxIdx); - } else { - return CV_HAL_ERROR_NOT_IMPLEMENTED; - } - } else { - switch (depth) { - case CV_8S: - call_min_max(intrinsiccv_min_max_s8, src_data, src_step, width, - height, minVal, maxVal); - break; - case CV_8U: - call_min_max(intrinsiccv_min_max_u8, src_data, src_step, width, - height, minVal, maxVal); - break; - case CV_16S: - call_min_max(intrinsiccv_min_max_s16, src_data, src_step, - width, height, minVal, maxVal); - break; - case CV_16U: - call_min_max(intrinsiccv_min_max_u16, src_data, src_step, - width, height, minVal, maxVal); - break; - case CV_32S: - call_min_max(intrinsiccv_min_max_s32, src_data, src_step, - width, height, minVal, maxVal); - break; - default: - return CV_HAL_ERROR_NOT_IMPLEMENTED; + return convert_error(call_min_max_loc( + intrinsiccv_min_max_loc_u8, src_data, src_step, width, height, minVal, + maxVal, minIdx, maxIdx)); } + return CV_HAL_ERROR_NOT_IMPLEMENTED; } - return CV_HAL_ERROR_OK; + switch (depth) { + case CV_8S: + return convert_error(call_min_max(intrinsiccv_min_max_s8, + src_data, src_step, width, + height, minVal, maxVal)); + case CV_8U: + return convert_error(call_min_max(intrinsiccv_min_max_u8, + src_data, src_step, width, + height, minVal, maxVal)); + case CV_16S: + return convert_error(call_min_max(intrinsiccv_min_max_s16, + src_data, src_step, width, + height, minVal, maxVal)); + case CV_16U: + return convert_error(call_min_max(intrinsiccv_min_max_u16, + src_data, src_step, width, + height, minVal, maxVal)); + case CV_32S: + return convert_error(call_min_max(intrinsiccv_min_max_s32, + src_data, src_step, width, + height, minVal, maxVal)); + default: + return CV_HAL_ERROR_NOT_IMPLEMENTED; + } } int convertTo(const uchar *src_data, size_t src_step, int src_depth, @@ -684,15 +681,12 @@ int convertTo(const uchar *src_data, size_t src_step, int src_depth, } if (src_depth == CV_8U) { - intrinsiccv_scale_u8(reinterpret_cast(src_data), src_step, - reinterpret_cast(dst_data), dst_step, width, - height, static_cast(scale), - static_cast(shift)); - } else { - return CV_HAL_ERROR_NOT_IMPLEMENTED; + return convert_error(intrinsiccv_scale_u8( + reinterpret_cast(src_data), src_step, + reinterpret_cast(dst_data), dst_step, width, height, + static_cast(scale), static_cast(shift))); } - - return CV_HAL_ERROR_OK; + return CV_HAL_ERROR_NOT_IMPLEMENTED; } } // namespace intrinsiccv::hal diff --git a/intrinsiccv/include/arithmetics/transpose.h b/intrinsiccv/include/arithmetics/transpose.h index c07399405612f17032163ac36d83dda89a15f537..2fdac909e55d654f42d8768f2631abaaa5778cf2 100644 --- a/intrinsiccv/include/arithmetics/transpose.h +++ b/intrinsiccv/include/arithmetics/transpose.h @@ -8,11 +8,14 @@ #include #include +#include "ctypes.h" + namespace intrinsiccv { namespace neon { -void transpose(const void *src, size_t src_stride, void *dst, size_t dst_stride, - size_t width, size_t height, size_t element_size); +intrinsiccv_error_t transpose(const void *src, size_t src_stride, void *dst, + size_t dst_stride, size_t width, size_t height, + size_t element_size); } // namespace neon namespace sve2 {} // namespace sve2 diff --git a/intrinsiccv/include/config.h b/intrinsiccv/include/config.h index 4777522bfd9de0afacfd6fbf27ce3df9d2f98ded..d4f9a8a27fa2b3ed5aeb18032bd7bbd95637bb7a 100644 --- a/intrinsiccv/include/config.h +++ b/intrinsiccv/include/config.h @@ -81,4 +81,11 @@ #define INTRINSICCV_FORCE_LOOP_UNROLL _Pragma("clang loop unroll(full)") +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) || \ + (defined(__cplusplus) && __cplusplus >= 201703L) +#define INTRINSICCV_NODISCARD [[nodiscard]] +#else +#define INTRINSICCV_NODISCARD +#endif + #endif // INTRINSICCV_CONFIG_H diff --git a/intrinsiccv/include/conversions/gray_to_rgb.h b/intrinsiccv/include/conversions/gray_to_rgb.h index c9c0d5ffa6e8eafd859542fec0e85ecf3cb53369..3f2725cf4489f05528906f0a073eafa7c9041e4f 100644 --- a/intrinsiccv/include/conversions/gray_to_rgb.h +++ b/intrinsiccv/include/conversions/gray_to_rgb.h @@ -11,31 +11,37 @@ namespace intrinsiccv { namespace neon { -void gray_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); +intrinsiccv_error_t gray_to_rgb_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); -void gray_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); +intrinsiccv_error_t gray_to_rgba_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); } // namespace neon namespace sve2 { -void gray_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); +intrinsiccv_error_t gray_to_rgb_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); -void gray_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); +intrinsiccv_error_t gray_to_rgba_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); } // namespace sve2 namespace sme2 { -void gray_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); +intrinsiccv_error_t gray_to_rgb_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); -void gray_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); +intrinsiccv_error_t gray_to_rgba_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); } // namespace sme2 diff --git a/intrinsiccv/include/conversions/merge.h b/intrinsiccv/include/conversions/merge.h index 9c9b4d48dd595e99aa5eabbbf92c469284aad4ae..7043a4fa2a51b55857b57276b65a523c0a8d7cb5 100644 --- a/intrinsiccv/include/conversions/merge.h +++ b/intrinsiccv/include/conversions/merge.h @@ -11,9 +11,9 @@ namespace intrinsiccv { namespace neon { -void merge(const void **srcs, const size_t *src_strides, void *dst, - size_t dst_stride, size_t width, size_t height, size_t channels, - size_t element_size); +intrinsiccv_error_t merge(const void **srcs, const size_t *src_strides, + void *dst, size_t dst_stride, size_t width, + size_t height, size_t channels, size_t element_size); } // namespace neon diff --git a/intrinsiccv/include/conversions/rgb_to_rgb.h b/intrinsiccv/include/conversions/rgb_to_rgb.h index 71879ead9e01f78b751baf0b31380d3583397c33..15d84cd1f22b71f38f3aef946c5581d06e775b62 100644 --- a/intrinsiccv/include/conversions/rgb_to_rgb.h +++ b/intrinsiccv/include/conversions/rgb_to_rgb.h @@ -11,57 +11,75 @@ namespace intrinsiccv { namespace neon { -void rgb_to_bgr_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); -void rgba_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); -void rgb_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); -void rgb_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); -void rgba_to_bgr_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); -void rgba_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); +intrinsiccv_error_t rgb_to_bgr_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, size_t width, + size_t height); +intrinsiccv_error_t rgba_to_bgra_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); +intrinsiccv_error_t rgb_to_bgra_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); +intrinsiccv_error_t rgb_to_rgba_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); +intrinsiccv_error_t rgba_to_bgr_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); +intrinsiccv_error_t rgba_to_rgb_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); } // namespace neon namespace sve2 { -void rgb_to_bgr_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); -void rgba_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); -void rgb_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); -void rgb_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); -void rgba_to_bgr_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); -void rgba_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); +intrinsiccv_error_t rgb_to_bgr_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, size_t width, + size_t height); +intrinsiccv_error_t rgba_to_bgra_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); +intrinsiccv_error_t rgb_to_bgra_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); +intrinsiccv_error_t rgb_to_rgba_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); +intrinsiccv_error_t rgba_to_bgr_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); +intrinsiccv_error_t rgba_to_rgb_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); } // namespace sve2 namespace sme2 { -void rgb_to_bgr_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); +intrinsiccv_error_t rgb_to_bgr_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, size_t width, + size_t height); -void rgba_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); +intrinsiccv_error_t rgba_to_bgra_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); -void rgb_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); +intrinsiccv_error_t rgb_to_bgra_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); -void rgb_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); +intrinsiccv_error_t rgb_to_rgba_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); -void rgba_to_bgr_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); +intrinsiccv_error_t rgba_to_bgr_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); -void rgba_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height); +intrinsiccv_error_t rgba_to_rgb_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height); } // namespace sme2 diff --git a/intrinsiccv/include/conversions/split.h b/intrinsiccv/include/conversions/split.h index d4a5e603c3051e251ff38f67adf8a111db80b8a7..93493e8f5ed52a608cd8119f5467478e05fd18d7 100644 --- a/intrinsiccv/include/conversions/split.h +++ b/intrinsiccv/include/conversions/split.h @@ -7,13 +7,16 @@ #include +#include "ctypes.h" + namespace intrinsiccv { namespace neon { -void split(const void *src_data, size_t src_stride, void **dst_data, - const size_t *dst_strides, size_t width, size_t height, - size_t channels, size_t element_size); +intrinsiccv_error_t split(const void *src_data, size_t src_stride, + void **dst_data, const size_t *dst_strides, + size_t width, size_t height, size_t channels, + size_t element_size); } // namespace neon diff --git a/intrinsiccv/include/conversions/yuv_to_rgb.h b/intrinsiccv/include/conversions/yuv_to_rgb.h index 9348b618fe4125e247adeaae88109f3cfa1fbc33..82fb447054a0b5eacb03a09b79bc01d0e92905c8 100644 --- a/intrinsiccv/include/conversions/yuv_to_rgb.h +++ b/intrinsiccv/include/conversions/yuv_to_rgb.h @@ -87,69 +87,81 @@ static constexpr int32_t kUVWeights[4] = { }; namespace neon { -void yuv_sp_to_rgb_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - bool is_nv21); - -void yuv_sp_to_rgba_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, bool is_nv21); - -void yuv_sp_to_bgr_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - bool is_nv21); - -void yuv_sp_to_bgra_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, bool is_nv21); +intrinsiccv_error_t yuv_sp_to_rgb_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21); + +intrinsiccv_error_t yuv_sp_to_rgba_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21); + +intrinsiccv_error_t yuv_sp_to_bgr_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21); + +intrinsiccv_error_t yuv_sp_to_bgra_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21); } // namespace neon namespace sve2 { -void yuv_sp_to_rgb_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - bool is_nv21); - -void yuv_sp_to_rgba_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, bool is_nv21); - -void yuv_sp_to_bgr_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - bool is_nv21); - -void yuv_sp_to_bgra_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, bool is_nv21); +intrinsiccv_error_t yuv_sp_to_rgb_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21); + +intrinsiccv_error_t yuv_sp_to_rgba_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21); + +intrinsiccv_error_t yuv_sp_to_bgr_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21); + +intrinsiccv_error_t yuv_sp_to_bgra_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21); } // namespace sve2 namespace sme2 { -void yuv_sp_to_rgb_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - bool is_nv21); - -void yuv_sp_to_rgba_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, bool is_nv21); - -void yuv_sp_to_bgr_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - bool is_nv21); - -void yuv_sp_to_bgra_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, bool is_nv21); +intrinsiccv_error_t yuv_sp_to_rgb_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21); + +intrinsiccv_error_t yuv_sp_to_rgba_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21); + +intrinsiccv_error_t yuv_sp_to_bgr_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21); + +intrinsiccv_error_t yuv_sp_to_bgra_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21); } // namespace sme2 } // namespace intrinsiccv diff --git a/intrinsiccv/include/ctypes.h b/intrinsiccv/include/ctypes.h index c465240e70c27cf297b12f00c1d5c9512d7e00d6..5713bc177b32a715805f9f16ef7e63a3ad74aadb 100644 --- a/intrinsiccv/include/ctypes.h +++ b/intrinsiccv/include/ctypes.h @@ -13,6 +13,19 @@ #include "stddef.h" #endif // __cplusplus +typedef enum { + /// Success. + INTRINSICCV_OK = 0, + /// Requested operation is not implemented. + INTRINSICCV_ERROR_NOT_IMPLEMENTED, + /// Null pointer was passed as an argument. + INTRINSICCV_ERROR_NULL_POINTER, + /// A value was encountered outside the representable range. + INTRINSICCV_ERROR_RANGE, + /// Could not allocate memory. + INTRINSICCV_ERROR_ALLOCATION, +} intrinsiccv_error_t; + typedef struct { size_t x; size_t y; diff --git a/intrinsiccv/include/dispatch.h b/intrinsiccv/include/dispatch.h index 1947b0c3dc26755615ef5f2b615851bb7e1c42d4..c2df7160fdfd3c4ace46d83d0c1b9e548b7cf9e9 100644 --- a/intrinsiccv/include/dispatch.h +++ b/intrinsiccv/include/dispatch.h @@ -61,22 +61,22 @@ static inline bool hwcaps_has_sme2(HwCaps hwcaps) { #endif // Creates a multiversioned C API with an ifunc resolver for it -#define INTRINSICCV_MULTIVERSION_C_API(api_name, neon_impl, sve2_impl, \ - sme2_impl, return_type, ...) \ - typedef return_type (*api_name##_function_type)(__VA_ARGS__); \ - \ - extern "C" INTRINSICCV_IFUNC_RESOLVER api_name##_function_type \ - api_name##_ifunc_resolver(HwCapTy, __ifunc_arg_t *arg); \ - \ - extern "C" api_name##_function_type api_name##_ifunc_resolver( \ - HwCapTy hwcap, __ifunc_arg_t *arg) { \ - [[maybe_unused]] HwCaps hwcaps = make_hwcaps(hwcap, arg); \ - INTRINSICCV_SME2_RESOLVE_IFUNC(sme2_impl); \ - INTRINSICCV_SVE2_RESOLVE_IFUNC(sve2_impl); \ - return neon_impl; \ - } \ - \ - extern "C" return_type api_name(__VA_ARGS__) \ +#define INTRINSICCV_MULTIVERSION_C_API(api_name, neon_impl, sve2_impl, \ + sme2_impl, ...) \ + typedef intrinsiccv_error_t (*api_name##_function_type)(__VA_ARGS__); \ + \ + extern "C" INTRINSICCV_IFUNC_RESOLVER api_name##_function_type \ + api_name##_ifunc_resolver(HwCapTy, __ifunc_arg_t *arg); \ + \ + extern "C" api_name##_function_type api_name##_ifunc_resolver( \ + HwCapTy hwcap, __ifunc_arg_t *arg) { \ + [[maybe_unused]] HwCaps hwcaps = make_hwcaps(hwcap, arg); \ + INTRINSICCV_SME2_RESOLVE_IFUNC(sme2_impl); \ + INTRINSICCV_SVE2_RESOLVE_IFUNC(sve2_impl); \ + return neon_impl; \ + } \ + \ + extern "C" intrinsiccv_error_t api_name(__VA_ARGS__) \ INTRINSICCV_ATTR_IFUNC(#api_name "_ifunc_resolver") } // namespace intrinsiccv diff --git a/intrinsiccv/include/filters/gaussian_blur.h b/intrinsiccv/include/filters/gaussian_blur.h index c9042b0b9e50490d6bc084c67995a323cbf54ce8..10eb43beb2d3559c2dba893641605e17137ab49f 100644 --- a/intrinsiccv/include/filters/gaussian_blur.h +++ b/intrinsiccv/include/filters/gaussian_blur.h @@ -12,37 +12,37 @@ namespace intrinsiccv { namespace neon { -void gaussian_blur_3x3_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - size_t channels, - intrinsiccv_border_type_t border_type, - const intrinsiccv_filter_params_t *params); - -void gaussian_blur_5x5_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - size_t channels, - intrinsiccv_border_type_t border_type, - const intrinsiccv_filter_params_t *params); +intrinsiccv_error_t gaussian_blur_3x3_u8( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height, size_t channels, + intrinsiccv_border_type_t border_type, + const intrinsiccv_filter_params_t *params); + +intrinsiccv_error_t gaussian_blur_5x5_u8( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height, size_t channels, + intrinsiccv_border_type_t border_type, + const intrinsiccv_filter_params_t *params); } // namespace neon namespace sve2 { -void gaussian_blur_5x5_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - size_t channels, - intrinsiccv_border_type_t border_type, - const intrinsiccv_filter_params_t *params); +intrinsiccv_error_t gaussian_blur_5x5_u8( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height, size_t channels, + intrinsiccv_border_type_t border_type, + const intrinsiccv_filter_params_t *params); } // namespace sve2 namespace sme2 { -void gaussian_blur_5x5_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - size_t channels, - intrinsiccv_border_type_t border_type, - const intrinsiccv_filter_params_t *params); +intrinsiccv_error_t gaussian_blur_5x5_u8( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height, size_t channels, + intrinsiccv_border_type_t border_type, + const intrinsiccv_filter_params_t *params); } // namespace sme2 diff --git a/intrinsiccv/include/filters/sobel.h b/intrinsiccv/include/filters/sobel.h index 5abed2d218da80e4d575a2fb0c3355be10dfe0d2..01620853a6f508f7ab6e23801e3ce1cdbb7fc157 100644 --- a/intrinsiccv/include/filters/sobel.h +++ b/intrinsiccv/include/filters/sobel.h @@ -10,30 +10,36 @@ namespace intrinsiccv { namespace neon { -void sobel_3x3_horizontal_s16_u8(const uint8_t *src, size_t src_stride, - int16_t *dst, size_t dst_stride, size_t width, - size_t height, size_t channels); -void sobel_3x3_vertical_s16_u8(const uint8_t *src, size_t src_stride, - int16_t *dst, size_t dst_stride, size_t width, - size_t height, size_t channels); +intrinsiccv_error_t sobel_3x3_horizontal_s16_u8(const uint8_t *src, + size_t src_stride, int16_t *dst, + size_t dst_stride, size_t width, + size_t height, size_t channels); +intrinsiccv_error_t sobel_3x3_vertical_s16_u8(const uint8_t *src, + size_t src_stride, int16_t *dst, + size_t dst_stride, size_t width, + size_t height, size_t channels); } // namespace neon namespace sve2 { -void sobel_3x3_horizontal_s16_u8(const uint8_t *src, size_t src_stride, - int16_t *dst, size_t dst_stride, size_t width, - size_t height, size_t channels); -void sobel_3x3_vertical_s16_u8(const uint8_t *src, size_t src_stride, - int16_t *dst, size_t dst_stride, size_t width, - size_t height, size_t channels); +intrinsiccv_error_t sobel_3x3_horizontal_s16_u8(const uint8_t *src, + size_t src_stride, int16_t *dst, + size_t dst_stride, size_t width, + size_t height, size_t channels); +intrinsiccv_error_t sobel_3x3_vertical_s16_u8(const uint8_t *src, + size_t src_stride, int16_t *dst, + size_t dst_stride, size_t width, + size_t height, size_t channels); } // namespace sve2 namespace sme2 { -void sobel_3x3_horizontal_s16_u8(const uint8_t *src, size_t src_stride, - int16_t *dst, size_t dst_stride, size_t width, - size_t height, size_t channels); -void sobel_3x3_vertical_s16_u8(const uint8_t *src, size_t src_stride, - int16_t *dst, size_t dst_stride, size_t width, - size_t height, size_t channels); +intrinsiccv_error_t sobel_3x3_horizontal_s16_u8(const uint8_t *src, + size_t src_stride, int16_t *dst, + size_t dst_stride, size_t width, + size_t height, size_t channels); +intrinsiccv_error_t sobel_3x3_vertical_s16_u8(const uint8_t *src, + size_t src_stride, int16_t *dst, + size_t dst_stride, size_t width, + size_t height, size_t channels); } // namespace sme2 } // namespace intrinsiccv diff --git a/intrinsiccv/include/intrinsiccv.h b/intrinsiccv/include/intrinsiccv.h index 1fcb3ec98533d59fbfa16532751a5e1059b6104b..d987ce82750e949663f931494c37a20f62b104a8 100644 --- a/intrinsiccv/include/intrinsiccv.h +++ b/intrinsiccv/include/intrinsiccv.h @@ -24,15 +24,17 @@ extern "C" { #endif // __cplusplus -#define INTRINSICCV_BINARY_OP(name, type) \ - void name(const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height) - -#define INTRINSICCV_BINARY_OP_SCALE(name, type, scaletype) \ - void name(const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height, scaletype scale) +#define INTRINSICCV_BINARY_OP(name, type) \ + INTRINSICCV_NODISCARD intrinsiccv_error_t name( \ + const type *src_a, size_t src_a_stride, const type *src_b, \ + size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ + size_t height) + +#define INTRINSICCV_BINARY_OP_SCALE(name, type, scaletype) \ + INTRINSICCV_NODISCARD intrinsiccv_error_t name( \ + const type *src_a, size_t src_a_stride, const type *src_b, \ + size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ + size_t height, scaletype scale) /// Adds the values of the corresponding elements in `src_a` and `src_b`, and /// puts the result into `dst`. @@ -204,9 +206,9 @@ INTRINSICCV_BINARY_OP_SCALE(intrinsiccv_add_abs_with_threshold, int16_t, /// @param width Number of elements in a row. /// @param height Number of rows in the data. /// -void intrinsiccv_gray_to_rgb_u8(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_gray_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height); /// Converts a grayscale image to RGBA. All channels are 8-bit wide. /// @@ -226,9 +228,9 @@ void intrinsiccv_gray_to_rgb_u8(const uint8_t *src, size_t src_stride, /// @param width Number of elements in a row. /// @param height Number of rows in the data. /// -void intrinsiccv_gray_to_rgba_u8(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_gray_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height); /// Converts an RGB image to BGR. All channels are 8-bit wide. /// @@ -248,9 +250,9 @@ void intrinsiccv_gray_to_rgba_u8(const uint8_t *src, size_t src_stride, /// @param width Number of elements in a row. /// @param height Number of rows in the data. /// -void intrinsiccv_rgb_to_bgr_u8(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_rgb_to_bgr_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height); /// Copies a source RBG image to destination buffer. /// All channels are 8-bit wide. @@ -266,9 +268,9 @@ void intrinsiccv_rgb_to_bgr_u8(const uint8_t *src, size_t src_stride, /// @param width Number of elements in a row. /// @param height Number of rows in the data. /// -void intrinsiccv_rgb_to_rgb_u8(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_rgb_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height); /// Converts an RGBA image to BGRA. All channels are 8-bit wide. /// @@ -288,9 +290,9 @@ void intrinsiccv_rgb_to_rgb_u8(const uint8_t *src, size_t src_stride, /// @param width Number of elements in a row. /// @param height Number of rows in the data. /// -void intrinsiccv_rgba_to_bgra_u8(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_rgba_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height); /// Copies a source RBGA image to destination buffer. /// All channels are 8-bit wide. @@ -306,9 +308,9 @@ void intrinsiccv_rgba_to_bgra_u8(const uint8_t *src, size_t src_stride, /// @param width Number of elements in a row. /// @param height Number of rows in the data. /// -void intrinsiccv_rgba_to_rgba_u8(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_rgba_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height); /// Converts an RGB image to BGRA. All channels are 8-bit wide. /// @@ -329,9 +331,9 @@ void intrinsiccv_rgba_to_rgba_u8(const uint8_t *src, size_t src_stride, /// @param width Number of elements in a row. /// @param height Number of rows in the data. /// -void intrinsiccv_rgb_to_bgra_u8(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_rgb_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height); /// Converts an RGB image to RGBA. All channels are 8-bit wide. /// @@ -352,9 +354,9 @@ void intrinsiccv_rgb_to_bgra_u8(const uint8_t *src, size_t src_stride, /// @param width Number of elements in a row. /// @param height Number of rows in the data. /// -void intrinsiccv_rgb_to_rgba_u8(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_rgb_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height); /// Converts an RGBA image to BGR. All channels are 8-bit wide. /// @@ -375,9 +377,9 @@ void intrinsiccv_rgb_to_rgba_u8(const uint8_t *src, size_t src_stride, /// @param width Number of elements in a row. /// @param height Number of rows in the data. /// -void intrinsiccv_rgba_to_bgr_u8(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_rgba_to_bgr_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height); /// Converts an RGBA image to RGB. All channels are 8-bit wide. /// @@ -398,9 +400,9 @@ void intrinsiccv_rgba_to_bgr_u8(const uint8_t *src, size_t src_stride, /// @param width Number of elements in a row. /// @param height Number of rows in the data. /// -void intrinsiccv_rgba_to_rgb_u8(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_rgba_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height); /// Converts an NV12 or NV21 YUV image to RGB. All channels are 8-bit wide. /// @@ -431,10 +433,10 @@ void intrinsiccv_rgba_to_rgb_u8(const uint8_t *src, size_t src_stride, /// @param is_nv21 If true, input is treated as NV21, otherwise treated /// as NV12. /// -void intrinsiccv_yuv_sp_to_rgb_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, bool is_nv21); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_yuv_sp_to_rgb_u8( + const uint8_t *src_y, size_t src_y_stride, const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, size_t dst_stride, size_t width, + size_t height, bool is_nv21); /// Converts an NV12 or NV21 YUV image to BGR. All channels are 8-bit wide. /// @@ -465,10 +467,10 @@ void intrinsiccv_yuv_sp_to_rgb_u8(const uint8_t *src_y, size_t src_y_stride, /// @param is_nv21 If true, input is treated as NV21, otherwise treated /// as NV12. /// -void intrinsiccv_yuv_sp_to_bgr_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, bool is_nv21); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_yuv_sp_to_bgr_u8( + const uint8_t *src_y, size_t src_y_stride, const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, size_t dst_stride, size_t width, + size_t height, bool is_nv21); /// Converts an NV12 or NV21 YUV image to RGBA. All channels are 8-bit wide. /// Alpha channel is set to 0xFF. @@ -498,10 +500,10 @@ void intrinsiccv_yuv_sp_to_bgr_u8(const uint8_t *src_y, size_t src_y_stride, /// @param is_nv21 If true, input is treated as NV21, otherwise treated /// as NV12. /// -void intrinsiccv_yuv_sp_to_rgba_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, - size_t width, size_t height, bool is_nv21); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_yuv_sp_to_rgba_u8( + const uint8_t *src_y, size_t src_y_stride, const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, size_t dst_stride, size_t width, + size_t height, bool is_nv21); /// Converts an NV12 or NV21 YUV image to BGRA. All channels are 8-bit wide. /// Alpha channel is set to 0xFF. @@ -531,10 +533,10 @@ void intrinsiccv_yuv_sp_to_rgba_u8(const uint8_t *src_y, size_t src_y_stride, /// @param is_nv21 If true, input is treated as NV21, otherwise treated /// as NV12. /// -void intrinsiccv_yuv_sp_to_bgra_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, - size_t width, size_t height, bool is_nv21); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_yuv_sp_to_bgra_u8( + const uint8_t *src_y, size_t src_y_stride, const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, size_t dst_stride, size_t width, + size_t height, bool is_nv21); /// Performs a comparison of each element's value in `src` with respect to a /// caller defined threshold. The strictly larger elements are set to @@ -554,23 +556,23 @@ void intrinsiccv_yuv_sp_to_bgra_u8(const uint8_t *src_y, size_t src_y_stride, /// compared to. /// @param value The value that the larger elements are set to. /// -void intrinsiccv_threshold_binary_u8(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, - size_t width, size_t height, - uint8_t threshold, uint8_t value); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_threshold_binary_u8( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height, uint8_t threshold, uint8_t value); -intrinsiccv_morphology_params_t *intrinsiccv_morphology_create( +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_morphology_create( intrinsiccv_morphology_params_t *params, intrinsiccv_rectangle_t image); -void intrinsiccv_morphology_release(intrinsiccv_morphology_params_t *params); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_morphology_release(intrinsiccv_morphology_params_t *params); -void intrinsiccv_dilate_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - const intrinsiccv_morphology_params_t *params); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_dilate_u8( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height, const intrinsiccv_morphology_params_t *params); -void intrinsiccv_erode_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - const intrinsiccv_morphology_params_t *params); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_erode_u8( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height, const intrinsiccv_morphology_params_t *params); /// Counts how many nonzero elements are in the source data. /// @@ -580,41 +582,43 @@ void intrinsiccv_erode_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, /// Must not be less than width * sizeof(type). /// @param width Number of elements in a row. /// @param height Number of rows in the data. +/// @param count Pointer to variable to store result. Must be non-null. /// -size_t intrinsiccv_count_nonzeros_u8(const uint8_t *src, size_t src_stride, - size_t width, size_t height); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_count_nonzeros_u8(const uint8_t *src, size_t src_stride, + size_t width, size_t height, size_t *count); -void intrinsiccv_resize_to_quarter_u8(const uint8_t *src, size_t src_stride, - size_t src_width, size_t src_height, - uint8_t *dst, size_t dst_stride, - size_t dst_width, size_t dst_height); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_resize_to_quarter_u8( + const uint8_t *src, size_t src_stride, size_t src_width, size_t src_height, + uint8_t *dst, size_t dst_stride, size_t dst_width, size_t dst_height); -void intrinsiccv_sobel_3x3_vertical_s16_u8(const uint8_t *src, - size_t src_stride, int16_t *dst, - size_t dst_stride, size_t width, - size_t height, size_t channel); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_sobel_3x3_vertical_s16_u8( + const uint8_t *src, size_t src_stride, int16_t *dst, size_t dst_stride, + size_t width, size_t height, size_t channel); -void intrinsiccv_sobel_3x3_horizontal_s16_u8(const uint8_t *src, - size_t src_stride, int16_t *dst, - size_t dst_stride, size_t width, - size_t height, size_t channel); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_sobel_3x3_horizontal_s16_u8(const uint8_t *src, size_t src_stride, + int16_t *dst, size_t dst_stride, + size_t width, size_t height, + size_t channel); -void intrinsiccv_canny_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - double low_threshold, double high_threshold); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_canny_u8( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height, double low_threshold, double high_threshold); -intrinsiccv_filter_params_t *intrinsiccv_filter_create( +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_filter_create( intrinsiccv_filter_params_t *params, intrinsiccv_rectangle_t image); -void intrinsiccv_filter_release(intrinsiccv_filter_params_t *params); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_filter_release(intrinsiccv_filter_params_t *params); -void intrinsiccv_gaussian_blur_3x3_u8( +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_gaussian_blur_3x3_u8( const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, size_t height, size_t channels, intrinsiccv_border_type_t border_type, const intrinsiccv_filter_params_t *params); -void intrinsiccv_gaussian_blur_5x5_u8( +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_gaussian_blur_5x5_u8( const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, size_t height, size_t channels, intrinsiccv_border_type_t border_type, @@ -641,13 +645,14 @@ void intrinsiccv_gaussian_blur_5x5_u8( /// @param channels Number of channels in the data. /// @param element_size Size of one element in bytes. /// -void intrinsiccv_split(const void *src_data, size_t src_stride, void **dst_data, - const size_t *dst_strides, size_t width, size_t height, - size_t channels, size_t element_size); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_split(const void *src_data, size_t src_stride, void **dst_data, + const size_t *dst_strides, size_t width, size_t height, + size_t channels, size_t element_size); -void intrinsiccv_transpose(const void *src, size_t src_stride, void *dst, - size_t dst_stride, size_t src_width, - size_t src_height, size_t element_size); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_transpose( + const void *src, size_t src_stride, void *dst, size_t dst_stride, + size_t src_width, size_t src_height, size_t element_size); /// Merges separate 1-channel source streams to one multi channel stream. /// @@ -670,9 +675,9 @@ void intrinsiccv_transpose(const void *src, size_t src_stride, void *dst, /// @param channels Number of channels in the destination data. /// @param element_size Size of one element in bytes. /// -void intrinsiccv_merge(const void **srcs, const size_t *src_strides, void *dst, - size_t dst_stride, size_t width, size_t height, - size_t channels, size_t element_size); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_merge( + const void **srcs, const size_t *src_strides, void *dst, size_t dst_stride, + size_t width, size_t height, size_t channels, size_t element_size); /// Calculates minimum and maximum element value across the source data. /// @@ -687,25 +692,25 @@ void intrinsiccv_merge(const void **srcs, const size_t *src_strides, void *dst, /// @param max_value Pointer to save result maximum value to, or nullptr if /// maximum is not to be calculated. /// -void intrinsiccv_min_max_u8(const uint8_t *src, size_t src_stride, size_t width, - size_t height, uint8_t *min_value, - uint8_t *max_value); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_min_max_u8(const uint8_t *src, size_t src_stride, size_t width, + size_t height, uint8_t *min_value, uint8_t *max_value); /// @copydoc intrinsiccv_min_max_u8 -void intrinsiccv_min_max_s8(const int8_t *src, size_t src_stride, size_t width, - size_t height, int8_t *min_value, - int8_t *max_value); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_min_max_s8(const int8_t *src, size_t src_stride, size_t width, + size_t height, int8_t *min_value, int8_t *max_value); /// @copydoc intrinsiccv_min_max_u8 -void intrinsiccv_min_max_u16(const uint16_t *src, size_t src_stride, - size_t width, size_t height, uint16_t *min_value, - uint16_t *max_value); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_min_max_u16( + const uint16_t *src, size_t src_stride, size_t width, size_t height, + uint16_t *min_value, uint16_t *max_value); /// @copydoc intrinsiccv_min_max_u8 -void intrinsiccv_min_max_s16(const int16_t *src, size_t src_stride, - size_t width, size_t height, int16_t *min_value, - int16_t *max_value); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_min_max_s16(const int16_t *src, size_t src_stride, size_t width, + size_t height, int16_t *min_value, int16_t *max_value); /// @copydoc intrinsiccv_min_max_u8 -void intrinsiccv_min_max_s32(const int32_t *src, size_t src_stride, - size_t width, size_t height, int32_t *min_value, - int32_t *max_value); +INTRINSICCV_NODISCARD intrinsiccv_error_t +intrinsiccv_min_max_s32(const int32_t *src, size_t src_stride, size_t width, + size_t height, int32_t *min_value, int32_t *max_value); /// Finds minimum and maximum element value across the source data, /// and returns their location in the source data as offset in bytes @@ -722,13 +727,13 @@ void intrinsiccv_min_max_s32(const int32_t *src, size_t src_stride, /// @param max_offset Pointer to save result offset of maximum value to, or /// nullptr if maximum is not to be calculated. /// -void intrinsiccv_min_max_loc_u8(const uint8_t *src, size_t src_stride, - size_t width, size_t height, size_t *min_offset, - size_t *max_offset); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_min_max_loc_u8( + const uint8_t *src, size_t src_stride, size_t width, size_t height, + size_t *min_offset, size_t *max_offset); -void intrinsiccv_scale_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - float scale, float shift); +INTRINSICCV_NODISCARD intrinsiccv_error_t intrinsiccv_scale_u8( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height, float scale, float shift); #ifdef __cplusplus } // extern "C" diff --git a/intrinsiccv/include/resize/resize.h b/intrinsiccv/include/resize/resize.h index 361b820aa44a0cc969c5cbac2449a7467a5d8915..b7c2d7236b353120452008c359c0a8900cf683cb 100644 --- a/intrinsiccv/include/resize/resize.h +++ b/intrinsiccv/include/resize/resize.h @@ -10,24 +10,24 @@ namespace intrinsiccv { namespace neon { -void resize_to_quarter_u8(const uint8_t *src, size_t src_stride, - size_t src_width, size_t src_height, uint8_t *dst, - size_t dst_stride, size_t dst_width, - size_t dst_height); +intrinsiccv_error_t resize_to_quarter_u8(const uint8_t *src, size_t src_stride, + size_t src_width, size_t src_height, + uint8_t *dst, size_t dst_stride, + size_t dst_width, size_t dst_height); } // namespace neon namespace sve2 { -void resize_to_quarter_u8(const uint8_t *src, size_t src_stride, - size_t src_width, size_t src_height, uint8_t *dst, - size_t dst_stride, size_t dst_width, - size_t dst_height); +intrinsiccv_error_t resize_to_quarter_u8(const uint8_t *src, size_t src_stride, + size_t src_width, size_t src_height, + uint8_t *dst, size_t dst_stride, + size_t dst_width, size_t dst_height); } // namespace sve2 namespace sme2 { -void resize_to_quarter_u8(const uint8_t *src, size_t src_stride, - size_t src_width, size_t src_height, uint8_t *dst, - size_t dst_stride, size_t dst_width, - size_t dst_height); +intrinsiccv_error_t resize_to_quarter_u8(const uint8_t *src, size_t src_stride, + size_t src_width, size_t src_height, + uint8_t *dst, size_t dst_stride, + size_t dst_width, size_t dst_height); } // namespace sme2 } // namespace intrinsiccv diff --git a/intrinsiccv/src/analysis/canny_neon.cpp b/intrinsiccv/src/analysis/canny_neon.cpp index 8ffb7729c382a23f63816f2de1772936f1fda5a6..73aa15d0770067724bb4f9ef725083df0687061e 100644 --- a/intrinsiccv/src/analysis/canny_neon.cpp +++ b/intrinsiccv/src/analysis/canny_neon.cpp @@ -465,7 +465,7 @@ static void perform_hysteresis(StrongEdgeStack &strong_edge_pixels, } } -extern "C" INTRINSICCV_TARGET_FN_ATTRS void intrinsiccv_canny_u8( +extern "C" INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t intrinsiccv_canny_u8( const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, size_t height, double low_threshold, double high_threshold) { Rectangle dst_rect{width, height}; @@ -474,41 +474,45 @@ extern "C" INTRINSICCV_TARGET_FN_ATTRS void intrinsiccv_canny_u8( SobelBuffer horizontal_gradient{dst_rect}; SobelBuffer vertical_gradient{dst_rect}; if (!horizontal_gradient.data() || !vertical_gradient.data()) { - // FIXME: add error handling - return; + return INTRINSICCV_ERROR_ALLOCATION; } MagnitudeBuffer magnitudes{horizontal_gradient.rect()}; if (!magnitudes.data()) { - // FIXME: add error handling - return; + return INTRINSICCV_ERROR_ALLOCATION; } HysteresisBuffer hysteresis{horizontal_gradient.rect()}; if (!hysteresis.data()) { - // FIXME: add error handling - return; + return INTRINSICCV_ERROR_ALLOCATION; } // Calculate horizontal dervatives using 3x3 Sobel operator. - intrinsiccv_sobel_3x3_horizontal_s16_u8( - src, src_stride, horizontal_gradient.data(), - horizontal_gradient.rows().stride(), width, height, 1); + if (auto err = intrinsiccv_sobel_3x3_horizontal_s16_u8( + src, src_stride, horizontal_gradient.data(), + horizontal_gradient.rows().stride(), width, height, 1)) { + return err; + } // Calculate vertical dervatives using 3x3 Sobel operator. - intrinsiccv_sobel_3x3_vertical_s16_u8( - src, src_stride, vertical_gradient.data(), - vertical_gradient.rows().stride(), width, height, 1); + if (auto err = intrinsiccv_sobel_3x3_vertical_s16_u8( + src, src_stride, vertical_gradient.data(), + vertical_gradient.rows().stride(), width, height, 1)) { + return err; + } // Calculate magnitude from the horizontal and vertical derivatives, and apply // lower threshold. - intrinsiccv_add_abs_with_threshold( - &horizontal_gradient.rows()[0], horizontal_gradient.rows().stride(), - &vertical_gradient.rows()[0], vertical_gradient.rows().stride(), - &magnitudes.rows_without_margin()[0], - magnitudes.rows_without_margin().stride(), - horizontal_gradient.rect().width(), horizontal_gradient.rect().height(), - static_cast(low_threshold)); + if (auto err = intrinsiccv_add_abs_with_threshold( + &horizontal_gradient.rows()[0], horizontal_gradient.rows().stride(), + &vertical_gradient.rows()[0], vertical_gradient.rows().stride(), + &magnitudes.rows_without_margin()[0], + magnitudes.rows_without_margin().stride(), + horizontal_gradient.rect().width(), + horizontal_gradient.rect().height(), + static_cast(low_threshold))) { + return err; + } // Perform non-maxima supression and high thresholding. StrongEdgeStack strong_edge_pixels; @@ -523,9 +527,10 @@ extern "C" INTRINSICCV_TARGET_FN_ATTRS void intrinsiccv_canny_u8( hysteresis.rows_without_margin().stride()); // Finalize results by supressing weak edges. - intrinsiccv_threshold_binary_u8(&hysteresis.rows_without_margin()[0], - hysteresis.rows_without_margin().stride(), - dst, dst_stride, width, height, 0x80, 0xFF); + return intrinsiccv_threshold_binary_u8( + &hysteresis.rows_without_margin()[0], + hysteresis.rows_without_margin().stride(), dst, dst_stride, width, height, + 0x80, 0xFF); } } // namespace intrinsiccv::neon diff --git a/intrinsiccv/src/analysis/count_nonzeros_neon.cpp b/intrinsiccv/src/analysis/count_nonzeros_neon.cpp index 0f99fa44d31bf13cf6ed5c55d40a633693ac7cda..86106a54541e24f60b9827eea915eafaf3af58a8 100644 --- a/intrinsiccv/src/analysis/count_nonzeros_neon.cpp +++ b/intrinsiccv/src/analysis/count_nonzeros_neon.cpp @@ -63,9 +63,15 @@ INTRINSICCV_TARGET_FN_ATTRS static size_t count_nonzeros(const T *src, extern "C" { INTRINSICCV_TARGET_FN_ATTRS -size_t intrinsiccv_count_nonzeros_u8(const uint8_t *src, size_t src_stride, - size_t width, size_t height) { - return count_nonzeros(src, src_stride, width, height); +intrinsiccv_error_t intrinsiccv_count_nonzeros_u8(const uint8_t *src, + size_t src_stride, + size_t width, size_t height, + size_t *count) { + if (count == nullptr) { + return INTRINSICCV_ERROR_NULL_POINTER; + } + *count = count_nonzeros(src, src_stride, width, height); + return INTRINSICCV_OK; } } // extern "C" diff --git a/intrinsiccv/src/analysis/min_max_api.cpp b/intrinsiccv/src/analysis/min_max_api.cpp index f96938aa5f8cc5cc10e1bdf1d216816d3a0b6100..57eb4f22a50206482797154f9f39446752dd8519 100644 --- a/intrinsiccv/src/analysis/min_max_api.cpp +++ b/intrinsiccv/src/analysis/min_max_api.cpp @@ -11,12 +11,13 @@ namespace intrinsiccv { namespace neon { template -void min_max(const T *src, size_t src_stride, size_t width, size_t height, - T *min_value, T *max_value); +intrinsiccv_error_t min_max(const T *src, size_t src_stride, size_t width, + size_t height, T *min_value, T *max_value); template -void min_max_loc(const T *src, size_t src_stride, size_t width, size_t height, - size_t *min_offset, size_t *max_offset); +intrinsiccv_error_t min_max_loc(const T *src, size_t src_stride, size_t width, + size_t height, size_t *min_offset, + size_t *max_offset); } // namespace neon @@ -24,9 +25,9 @@ namespace sve2 {} // namespace sve2 namespace sme2 {} // namespace sme2 -#define INTRINSICCV_DEFINE_MINMAX_API(name, type) \ - INTRINSICCV_MULTIVERSION_C_API(name, intrinsiccv::neon::min_max, \ - nullptr, nullptr, void, const type *, size_t, \ +#define INTRINSICCV_DEFINE_MINMAX_API(name, type) \ + INTRINSICCV_MULTIVERSION_C_API(name, intrinsiccv::neon::min_max, \ + nullptr, nullptr, const type *, size_t, \ size_t, size_t, type *, type *) INTRINSICCV_DEFINE_MINMAX_API(intrinsiccv_min_max_u8, uint8_t); @@ -35,9 +36,9 @@ INTRINSICCV_DEFINE_MINMAX_API(intrinsiccv_min_max_u16, uint16_t); INTRINSICCV_DEFINE_MINMAX_API(intrinsiccv_min_max_s16, int16_t); INTRINSICCV_DEFINE_MINMAX_API(intrinsiccv_min_max_s32, int32_t); -#define INTRINSICCV_DEFINE_MINMAXLOC_API(name, type) \ - INTRINSICCV_MULTIVERSION_C_API(name, intrinsiccv::neon::min_max_loc, \ - nullptr, nullptr, void, const type *, size_t, \ +#define INTRINSICCV_DEFINE_MINMAXLOC_API(name, type) \ + INTRINSICCV_MULTIVERSION_C_API(name, intrinsiccv::neon::min_max_loc, \ + nullptr, nullptr, const type *, size_t, \ size_t, size_t, size_t *, size_t *) INTRINSICCV_DEFINE_MINMAXLOC_API(intrinsiccv_min_max_loc_u8, uint8_t); diff --git a/intrinsiccv/src/analysis/min_max_loc_neon.cpp b/intrinsiccv/src/analysis/min_max_loc_neon.cpp index a0040be6e73b887be3d2fb5b4f1a697c0ed1b4cb..338a58653383f480aeac65cd829612b9d83feb31 100644 --- a/intrinsiccv/src/analysis/min_max_loc_neon.cpp +++ b/intrinsiccv/src/analysis/min_max_loc_neon.cpp @@ -307,8 +307,9 @@ class MinMaxLoc final : public UnrollTwice { }; // end of class MinMaxLoc template -void min_max_loc(const ScalarType *src, size_t src_stride, size_t width, - size_t height, size_t *min_offset, size_t *max_offset) { +intrinsiccv_error_t min_max_loc(const ScalarType *src, size_t src_stride, + size_t width, size_t height, size_t *min_offset, + size_t *max_offset) { Rectangle rect{width, height}; Rows src_rows{src, src_stride}; MinMaxLoc operation; @@ -320,11 +321,12 @@ void min_max_loc(const ScalarType *src, size_t src_stride, size_t width, if (max_offset) { *max_offset = src_rows.offset_for_index(operation.max_index(), width); } + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void min_max_loc( \ - const type *src, size_t src_stride, size_t width, size_t height, \ +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t min_max_loc( \ + const type *src, size_t src_stride, size_t width, size_t height, \ size_t *min_offset, size_t *max_offset) INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); diff --git a/intrinsiccv/src/analysis/min_max_neon.cpp b/intrinsiccv/src/analysis/min_max_neon.cpp index d3ec27c5657b673cc4477ed813b2da7a0240ba6c..cd13c4b93abc6c5c4d3e52bc1b2ba1c19c82df9f 100644 --- a/intrinsiccv/src/analysis/min_max_neon.cpp +++ b/intrinsiccv/src/analysis/min_max_neon.cpp @@ -45,8 +45,9 @@ class MinMax final : public UnrollTwice { }; // end of class MinMax template -void min_max(const ScalarType *src, size_t src_stride, size_t width, - size_t height, ScalarType *min_value, ScalarType *max_value) { +intrinsiccv_error_t min_max(const ScalarType *src, size_t src_stride, + size_t width, size_t height, ScalarType *min_value, + ScalarType *max_value) { Rectangle rect{width, height}; Rows src_rows{src, src_stride}; MinMax operation; @@ -57,11 +58,12 @@ void min_max(const ScalarType *src, size_t src_stride, size_t width, if (max_value) { *max_value = operation.get_max(); } + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void min_max( \ - const type *src, size_t src_stride, size_t width, size_t height, \ +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t min_max( \ + const type *src, size_t src_stride, size_t width, size_t height, \ type *min_value, type *max_value) INTRINSICCV_INSTANTIATE_TEMPLATE(int8_t); diff --git a/intrinsiccv/src/arithmetics/absdiff_api.cpp b/intrinsiccv/src/arithmetics/absdiff_api.cpp index 117281d0777ad0ad84e5a61192f331d24d4d4e82..a4620e73f809bfc57c037ebec6ad3425af3d7e35 100644 --- a/intrinsiccv/src/arithmetics/absdiff_api.cpp +++ b/intrinsiccv/src/arithmetics/absdiff_api.cpp @@ -11,35 +11,37 @@ namespace intrinsiccv { namespace neon { template -void saturating_absdiff(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height); +intrinsiccv_error_t saturating_absdiff(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, + T *dst, size_t dst_stride, size_t width, + size_t height); } // namespace neon namespace sve2 { template -void saturating_absdiff(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height); +intrinsiccv_error_t saturating_absdiff(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, + T *dst, size_t dst_stride, size_t width, + size_t height); } // namespace sve2 namespace sme2 { - template -void saturating_absdiff(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height); +intrinsiccv_error_t saturating_absdiff(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, + T *dst, size_t dst_stride, size_t width, + size_t height); } // namespace sme2 -#define INTRINSICCV_DEFINE_C_API(name, type) \ - INTRINSICCV_MULTIVERSION_C_API( \ - name, intrinsiccv::neon::saturating_absdiff, \ - INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::saturating_absdiff), \ - intrinsiccv::sme2::saturating_absdiff, void, const type *, size_t, \ +#define INTRINSICCV_DEFINE_C_API(name, type) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::saturating_absdiff, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::saturating_absdiff), \ + intrinsiccv::sme2::saturating_absdiff, const type *, size_t, \ const type *, size_t, type *, size_t, size_t, size_t) INTRINSICCV_DEFINE_C_API(intrinsiccv_saturating_absdiff_u8, uint8_t); diff --git a/intrinsiccv/src/arithmetics/absdiff_neon.cpp b/intrinsiccv/src/arithmetics/absdiff_neon.cpp index f484941c462d93f92c8e065dd481be2a5140aed4..7252fe77a90da2c3a1f3715c0e78c51dce12d62b 100644 --- a/intrinsiccv/src/arithmetics/absdiff_neon.cpp +++ b/intrinsiccv/src/arithmetics/absdiff_neon.cpp @@ -36,9 +36,10 @@ class SaturatingAbsDiff final : public UnrollTwice { }; // end of class SaturatingAbsDiff template -void saturating_absdiff(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height) { +intrinsiccv_error_t saturating_absdiff(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, + T *dst, size_t dst_stride, size_t width, + size_t height) { SaturatingAbsDiff operation; Rectangle rect{width, height}; Rows src_a_rows{src_a, src_a_stride}; @@ -46,13 +47,14 @@ void saturating_absdiff(const T *src_a, size_t src_a_stride, const T *src_b, Rows dst_rows{dst, dst_stride}; neon::apply_operation_by_rows(operation, rect, src_a_rows, src_b_rows, dst_rows); + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void saturating_absdiff( \ - const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + saturating_absdiff(const type *src_a, size_t src_a_stride, \ + const type *src_b, size_t src_b_stride, type *dst, \ + size_t dst_stride, size_t width, size_t height) INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); INTRINSICCV_INSTANTIATE_TEMPLATE(int8_t); diff --git a/intrinsiccv/src/arithmetics/absdiff_sme2.cpp b/intrinsiccv/src/arithmetics/absdiff_sme2.cpp index 2d43fe1895d1249733646ee0245bfc8d92d6678c..e0007922517447984f47ebbfb93a9739cc77ccac 100644 --- a/intrinsiccv/src/arithmetics/absdiff_sme2.cpp +++ b/intrinsiccv/src/arithmetics/absdiff_sme2.cpp @@ -37,7 +37,7 @@ class SaturatingAbsDiff final : public UnrollTwice { }; // end of class SaturatingAbsDiff template -INTRINSICCV_LOCALLY_STREAMING void saturating_absdiff( +INTRINSICCV_LOCALLY_STREAMING intrinsiccv_error_t saturating_absdiff( const T *src_a, size_t src_a_stride, const T *src_b, size_t src_b_stride, T *dst, size_t dst_stride, size_t width, size_t height) { SaturatingAbsDiff operation; @@ -47,13 +47,14 @@ INTRINSICCV_LOCALLY_STREAMING void saturating_absdiff( Rows dst_rows{dst, dst_stride}; sve2::apply_operation_by_rows(operation, rect, src_a_rows, src_b_rows, dst_rows); + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void saturating_absdiff( \ - const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + saturating_absdiff(const type *src_a, size_t src_a_stride, \ + const type *src_b, size_t src_b_stride, type *dst, \ + size_t dst_stride, size_t width, size_t height) INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); INTRINSICCV_INSTANTIATE_TEMPLATE(int8_t); diff --git a/intrinsiccv/src/arithmetics/absdiff_sve2.cpp b/intrinsiccv/src/arithmetics/absdiff_sve2.cpp index fae233708fba983046a096d895e4fb6c7a0bbe67..3d146d361c9304275edf5f2327c10054eaba73ac 100644 --- a/intrinsiccv/src/arithmetics/absdiff_sve2.cpp +++ b/intrinsiccv/src/arithmetics/absdiff_sve2.cpp @@ -34,9 +34,10 @@ class SaturatingAbsDiff final : public UnrollTwice { }; // end of class SaturatingAbsDiff template -void saturating_absdiff(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height) { +intrinsiccv_error_t saturating_absdiff(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, + T *dst, size_t dst_stride, size_t width, + size_t height) { SaturatingAbsDiff operation; Rectangle rect{width, height}; Rows src_a_rows{src_a, src_a_stride}; @@ -44,13 +45,14 @@ void saturating_absdiff(const T *src_a, size_t src_a_stride, const T *src_b, Rows dst_rows{dst, dst_stride}; sve2::apply_operation_by_rows(operation, rect, src_a_rows, src_b_rows, dst_rows); + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void saturating_absdiff( \ - const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + saturating_absdiff(const type *src_a, size_t src_a_stride, \ + const type *src_b, size_t src_b_stride, type *dst, \ + size_t dst_stride, size_t width, size_t height) INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); INTRINSICCV_INSTANTIATE_TEMPLATE(int8_t); diff --git a/intrinsiccv/src/arithmetics/add_abs_with_threshold_api.cpp b/intrinsiccv/src/arithmetics/add_abs_with_threshold_api.cpp index dab85558896f336c7ab74504abee04ec5e20c138..2d994c0fac249b63a6cf2156f2b104e2cab48c8a 100644 --- a/intrinsiccv/src/arithmetics/add_abs_with_threshold_api.cpp +++ b/intrinsiccv/src/arithmetics/add_abs_with_threshold_api.cpp @@ -11,37 +11,40 @@ namespace intrinsiccv { namespace neon { template -void add_abs_with_threshold(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height, T threshold); +intrinsiccv_error_t add_abs_with_threshold(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, + T *dst, size_t dst_stride, + size_t width, size_t height, + T threshold); } // namespace neon namespace sve2 { - template -void add_abs_with_threshold(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height, T threshold); +intrinsiccv_error_t add_abs_with_threshold(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, + T *dst, size_t dst_stride, + size_t width, size_t height, + T threshold); } // namespace sve2 - namespace sme2 { - template -void add_abs_with_threshold(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height, T threshold); +intrinsiccv_error_t add_abs_with_threshold(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, + T *dst, size_t dst_stride, + size_t width, size_t height, + T threshold); } // namespace sme2 -#define INTRINSICCV_DEFINE_C_API(name, type) \ - INTRINSICCV_MULTIVERSION_C_API( \ - name, intrinsiccv::neon::add_abs_with_threshold, \ - INTRINSICCV_SVE2_IMPL_IF( \ - intrinsiccv::sve2::add_abs_with_threshold), \ - intrinsiccv::sme2::add_abs_with_threshold, void, const type *, \ - size_t, const type *, size_t, type *, size_t, size_t, size_t, type) +#define INTRINSICCV_DEFINE_C_API(name, type) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::add_abs_with_threshold, \ + INTRINSICCV_SVE2_IMPL_IF( \ + intrinsiccv::sve2::add_abs_with_threshold), \ + intrinsiccv::sme2::add_abs_with_threshold, const type *, size_t, \ + const type *, size_t, type *, size_t, size_t, size_t, type) INTRINSICCV_DEFINE_C_API(intrinsiccv_add_abs_with_threshold, int16_t); diff --git a/intrinsiccv/src/arithmetics/add_abs_with_threshold_neon.cpp b/intrinsiccv/src/arithmetics/add_abs_with_threshold_neon.cpp index 24fccea5b16cd564a80c16cb2b8fcc3767b3e07e..89464ac6c6efd4a3da1417fa5bc4e415a9adc654 100644 --- a/intrinsiccv/src/arithmetics/add_abs_with_threshold_neon.cpp +++ b/intrinsiccv/src/arithmetics/add_abs_with_threshold_neon.cpp @@ -34,22 +34,26 @@ class AddAbsWithThreshold final : public UnrollOnce, public UnrollTwice { }; // end of class AddAbsWithThreshold template -void add_abs_with_threshold(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height, T threshold) { +intrinsiccv_error_t add_abs_with_threshold(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, + T *dst, size_t dst_stride, + size_t width, size_t height, + T threshold) { AddAbsWithThreshold operation{threshold}; Rectangle rect{width, height}; Rows src_a_rows{src_a, src_a_stride}; Rows src_b_rows{src_b, src_b_stride}; Rows dst_rows{dst, dst_stride}; apply_operation_by_rows(operation, rect, src_a_rows, src_b_rows, dst_rows); + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void add_abs_with_threshold( \ - const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height, type threshold) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + add_abs_with_threshold(const type *src_a, size_t src_a_stride, \ + const type *src_b, size_t src_b_stride, \ + type *dst, size_t dst_stride, size_t width, \ + size_t height, type threshold) INTRINSICCV_INSTANTIATE_TEMPLATE(int16_t); diff --git a/intrinsiccv/src/arithmetics/add_abs_with_threshold_sc.h b/intrinsiccv/src/arithmetics/add_abs_with_threshold_sc.h index 2a7297b6691d95a31192c4291bee87614bd0bde1..2faf46e3f6f72c8b368962c05d61e24f79d4c8c3 100644 --- a/intrinsiccv/src/arithmetics/add_abs_with_threshold_sc.h +++ b/intrinsiccv/src/arithmetics/add_abs_with_threshold_sc.h @@ -35,10 +35,10 @@ class AddAbsWithThreshold final : public UnrollTwice { }; // end of class AddAbsWithThreshold template -void add_abs_with_threshold_sc(const T *src_a, size_t src_a_stride, - const T *src_b, size_t src_b_stride, T *dst, - size_t dst_stride, size_t width, size_t height, - T threshold) INTRINSICCV_STREAMING_COMPATIBLE { +intrinsiccv_error_t add_abs_with_threshold_sc( + const T *src_a, size_t src_a_stride, const T *src_b, size_t src_b_stride, + T *dst, size_t dst_stride, size_t width, size_t height, + T threshold) INTRINSICCV_STREAMING_COMPATIBLE { AddAbsWithThreshold operation{threshold}; Rectangle rect{width, height}; Rows src_a_rows{src_a, src_a_stride}; @@ -46,6 +46,7 @@ void add_abs_with_threshold_sc(const T *src_a, size_t src_a_stride, Rows dst_rows{dst, dst_stride}; sve2::apply_operation_by_rows(operation, rect, src_a_rows, src_b_rows, dst_rows); + return INTRINSICCV_OK; } } // namespace intrinsiccv::sve2 diff --git a/intrinsiccv/src/arithmetics/add_abs_with_threshold_sme2.cpp b/intrinsiccv/src/arithmetics/add_abs_with_threshold_sme2.cpp index 358fe66706a7c861c25a3417388e5e57b14c81b4..ffb4925b137be6a1838996724f22b3bee4263ccf 100644 --- a/intrinsiccv/src/arithmetics/add_abs_with_threshold_sme2.cpp +++ b/intrinsiccv/src/arithmetics/add_abs_with_threshold_sme2.cpp @@ -7,19 +7,21 @@ namespace intrinsiccv::sme2 { template -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t add_abs_with_threshold(const T *src_a, size_t src_a_stride, const T *src_b, size_t src_b_stride, T *dst, size_t dst_stride, size_t width, size_t height, T threshold) { - sve2::add_abs_with_threshold_sc(src_a, src_a_stride, src_b, src_b_stride, dst, - dst_stride, width, height, threshold); + return sve2::add_abs_with_threshold_sc(src_a, src_a_stride, src_b, + src_b_stride, dst, dst_stride, width, + height, threshold); } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void add_abs_with_threshold( \ - const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height, type threshold) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + add_abs_with_threshold(const type *src_a, size_t src_a_stride, \ + const type *src_b, size_t src_b_stride, \ + type *dst, size_t dst_stride, size_t width, \ + size_t height, type threshold) INTRINSICCV_INSTANTIATE_TEMPLATE(int16_t); diff --git a/intrinsiccv/src/arithmetics/add_abs_with_threshold_sve2.cpp b/intrinsiccv/src/arithmetics/add_abs_with_threshold_sve2.cpp index f3f0cf2fe4f3e1da08994e386cb2a8ec53f19057..091747b2b6a3e37b5dfaa9da85855d9ece77e200 100644 --- a/intrinsiccv/src/arithmetics/add_abs_with_threshold_sve2.cpp +++ b/intrinsiccv/src/arithmetics/add_abs_with_threshold_sve2.cpp @@ -7,18 +7,19 @@ namespace intrinsiccv::sve2 { template -void INTRINSICCV_TARGET_FN_ATTRS add_abs_with_threshold( +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t add_abs_with_threshold( const T *src_a, size_t src_a_stride, const T *src_b, size_t src_b_stride, T *dst, size_t dst_stride, size_t width, size_t height, T threshold) { - add_abs_with_threshold_sc(src_a, src_a_stride, src_b, src_b_stride, dst, - dst_stride, width, height, threshold); + return add_abs_with_threshold_sc(src_a, src_a_stride, src_b, src_b_stride, + dst, dst_stride, width, height, threshold); } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template void INTRINSICCV_TARGET_FN_ATTRS add_abs_with_threshold( \ - const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height, type threshold) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + add_abs_with_threshold(const type *src_a, size_t src_a_stride, \ + const type *src_b, size_t src_b_stride, \ + type *dst, size_t dst_stride, size_t width, \ + size_t height, type threshold) INTRINSICCV_INSTANTIATE_TEMPLATE(int16_t); diff --git a/intrinsiccv/src/arithmetics/add_api.cpp b/intrinsiccv/src/arithmetics/add_api.cpp index fdcff92550fdc817f893fa488b30ade49689a28a..3c7fe424c33222261e26acdcc90e8d0abb8fd45d 100644 --- a/intrinsiccv/src/arithmetics/add_api.cpp +++ b/intrinsiccv/src/arithmetics/add_api.cpp @@ -11,35 +11,37 @@ namespace intrinsiccv { namespace neon { template -void saturating_add(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height); +intrinsiccv_error_t saturating_add(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, T *dst, + size_t dst_stride, size_t width, + size_t height); } // namespace neon namespace sve2 { template -void saturating_add(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height); +intrinsiccv_error_t saturating_add(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, T *dst, + size_t dst_stride, size_t width, + size_t height); } // namespace sve2 namespace sme2 { - template -void saturating_add(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height); +intrinsiccv_error_t saturating_add(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, T *dst, + size_t dst_stride, size_t width, + size_t height); } // namespace sme2 -#define INTRINSICCV_DEFINE_C_API(name, type) \ - INTRINSICCV_MULTIVERSION_C_API( \ - name, intrinsiccv::neon::saturating_add, \ - INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::saturating_add), \ - intrinsiccv::sme2::saturating_add, void, const type *, size_t, \ +#define INTRINSICCV_DEFINE_C_API(name, type) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::saturating_add, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::saturating_add), \ + intrinsiccv::sme2::saturating_add, const type *, size_t, \ const type *, size_t, type *, size_t, size_t, size_t) INTRINSICCV_DEFINE_C_API(intrinsiccv_saturating_add_s8, int8_t); diff --git a/intrinsiccv/src/arithmetics/add_neon.cpp b/intrinsiccv/src/arithmetics/add_neon.cpp index 64cc8d44ee1583809acd50deed1231364b18cdba..c78348702bfa73524bc8ba40e55c7e069704951f 100644 --- a/intrinsiccv/src/arithmetics/add_neon.cpp +++ b/intrinsiccv/src/arithmetics/add_neon.cpp @@ -35,22 +35,24 @@ class SaturatingAdd final : public UnrollTwice { }; // end of class SaturatingAdd template -void saturating_add(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height) { +intrinsiccv_error_t saturating_add(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, T *dst, + size_t dst_stride, size_t width, + size_t height) { SaturatingAdd operation; Rectangle rect{width, height}; Rows src_a_rows{src_a, src_a_stride}; Rows src_b_rows{src_b, src_b_stride}; Rows dst_rows{dst, dst_stride}; apply_operation_by_rows(operation, rect, src_a_rows, src_b_rows, dst_rows); + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void saturating_add( \ - const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + saturating_add(const type *src_a, size_t src_a_stride, \ + const type *src_b, size_t src_b_stride, type *dst, \ + size_t dst_stride, size_t width, size_t height) INTRINSICCV_INSTANTIATE_TEMPLATE(int8_t); INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); diff --git a/intrinsiccv/src/arithmetics/add_sme2.cpp b/intrinsiccv/src/arithmetics/add_sme2.cpp index e0bf7b2146d49086238fafa375d68bb9fbf20c56..3fb6486f2defe9950b95009813fe30dd4ebc3682 100644 --- a/intrinsiccv/src/arithmetics/add_sme2.cpp +++ b/intrinsiccv/src/arithmetics/add_sme2.cpp @@ -23,7 +23,7 @@ class SaturatingAdd final : public UnrollTwice { }; // end of class SaturatingAdd template -INTRINSICCV_LOCALLY_STREAMING void saturating_add( +INTRINSICCV_LOCALLY_STREAMING intrinsiccv_error_t saturating_add( const T *src_a, size_t src_a_stride, const T *src_b, size_t src_b_stride, T *dst, size_t dst_stride, size_t width, size_t height) { SaturatingAdd operation; @@ -33,13 +33,14 @@ INTRINSICCV_LOCALLY_STREAMING void saturating_add( Rows dst_rows{dst, dst_stride}; sve2::apply_operation_by_rows(operation, rect, src_a_rows, src_b_rows, dst_rows); + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void saturating_add( \ - const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + saturating_add(const type *src_a, size_t src_a_stride, \ + const type *src_b, size_t src_b_stride, type *dst, \ + size_t dst_stride, size_t width, size_t height) INTRINSICCV_INSTANTIATE_TEMPLATE(int8_t); INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); diff --git a/intrinsiccv/src/arithmetics/add_sve2.cpp b/intrinsiccv/src/arithmetics/add_sve2.cpp index 74cdf1e4c9bbc3e80ca988b9479705ab88a03af9..140dac6d4d677a20078f7c874d46ed273f2f8a43 100644 --- a/intrinsiccv/src/arithmetics/add_sve2.cpp +++ b/intrinsiccv/src/arithmetics/add_sve2.cpp @@ -22,9 +22,10 @@ class SaturatingAdd final : public UnrollTwice { }; // end of class SaturatingAdd template -void saturating_add(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height) { +intrinsiccv_error_t saturating_add(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, T *dst, + size_t dst_stride, size_t width, + size_t height) { SaturatingAdd operation; Rectangle rect{width, height}; Rows src_a_rows{src_a, src_a_stride}; @@ -32,13 +33,14 @@ void saturating_add(const T *src_a, size_t src_a_stride, const T *src_b, Rows dst_rows{dst, dst_stride}; sve2::apply_operation_by_rows(operation, rect, src_a_rows, src_b_rows, dst_rows); + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void saturating_add( \ - const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + saturating_add(const type *src_a, size_t src_a_stride, \ + const type *src_b, size_t src_b_stride, type *dst, \ + size_t dst_stride, size_t width, size_t height) INTRINSICCV_INSTANTIATE_TEMPLATE(int8_t); INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); diff --git a/intrinsiccv/src/arithmetics/multiply_api.cpp b/intrinsiccv/src/arithmetics/multiply_api.cpp index 9ecd171c4bd4cdc89694ffeb63b86deae035d725..48bc895d76d7ffa53f148e1ae4841d05d676014b 100644 --- a/intrinsiccv/src/arithmetics/multiply_api.cpp +++ b/intrinsiccv/src/arithmetics/multiply_api.cpp @@ -11,25 +11,28 @@ namespace intrinsiccv { namespace neon { template -void saturating_multiply(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height, double scale); +intrinsiccv_error_t saturating_multiply(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, + T *dst, size_t dst_stride, size_t width, + size_t height, double scale); } // namespace neon namespace sve2 { template -void saturating_multiply(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height, double scale); +intrinsiccv_error_t saturating_multiply(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, + T *dst, size_t dst_stride, size_t width, + size_t height, double scale); } // namespace sve2 // namespace sme2 { // template -// void saturating_multiply(const T *src_a, size_t src_a_stride, const T *src_b, +// intrinsiccv_error_t saturating_multiply(const T *src_a, size_t src_a_stride, +// const T *src_b, // size_t src_b_stride, T *dst, size_t dst_stride, // size_t width, size_t height, double scale); @@ -39,8 +42,8 @@ void saturating_multiply(const T *src_a, size_t src_a_stride, const T *src_b, INTRINSICCV_MULTIVERSION_C_API( \ name, intrinsiccv::neon::saturating_multiply, \ INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::saturating_multiply), \ - nullptr, void, const type *, size_t, const type *, size_t, type *, \ - size_t, size_t, size_t, double) + nullptr, const type *, size_t, const type *, size_t, type *, size_t, \ + size_t, size_t, double) INTRINSICCV_DEFINE_C_API(intrinsiccv_saturating_multiply_u8, uint8_t); INTRINSICCV_DEFINE_C_API(intrinsiccv_saturating_multiply_s8, int8_t); diff --git a/intrinsiccv/src/arithmetics/multiply_neon.cpp b/intrinsiccv/src/arithmetics/multiply_neon.cpp index 7fc29a2391d410cc20e6f482a454c30b60da4d2e..12e94ed7ba14192da88898204df62246c124df9a 100644 --- a/intrinsiccv/src/arithmetics/multiply_neon.cpp +++ b/intrinsiccv/src/arithmetics/multiply_neon.cpp @@ -63,9 +63,10 @@ class SaturatingMultiply final : public UnrollTwice { }; template -void saturating_multiply(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height, double scale) { +intrinsiccv_error_t saturating_multiply(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, + T *dst, size_t dst_stride, size_t width, + size_t height, double scale) { (void)scale; // TODO: figure out the way to process the scale. SaturatingMultiply operation; Rectangle rect{width, height}; @@ -74,13 +75,15 @@ void saturating_multiply(const T *src_a, size_t src_a_stride, const T *src_b, Rows dst_rows{dst, dst_stride}; neon::apply_operation_by_rows(operation, rect, src_a_rows, src_b_rows, dst_rows); + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void saturating_multiply( \ - const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height, double scale) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + saturating_multiply(const type *src_a, size_t src_a_stride, \ + const type *src_b, size_t src_b_stride, type *dst, \ + size_t dst_stride, size_t width, size_t height, \ + double scale) INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); INTRINSICCV_INSTANTIATE_TEMPLATE(int8_t); diff --git a/intrinsiccv/src/arithmetics/multiply_sve2.cpp b/intrinsiccv/src/arithmetics/multiply_sve2.cpp index 94ed60a7102b1d4a471a790eb3ff16d0bcd4fc74..59b54391cf3d9a3f774ab9aa7c9f28c1c8cf7f24 100644 --- a/intrinsiccv/src/arithmetics/multiply_sve2.cpp +++ b/intrinsiccv/src/arithmetics/multiply_sve2.cpp @@ -41,9 +41,10 @@ class SaturatingMultiply final : public UnrollTwice { }; template -void saturating_multiply(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height, double scale) { +intrinsiccv_error_t saturating_multiply(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, + T *dst, size_t dst_stride, size_t width, + size_t height, double scale) { (void)scale; // TODO: figure out the way to process the scale. SaturatingMultiply operation; Rectangle rect{width, height}; @@ -52,13 +53,15 @@ void saturating_multiply(const T *src_a, size_t src_a_stride, const T *src_b, Rows dst_rows{dst, dst_stride}; sve2::apply_operation_by_rows(operation, rect, src_a_rows, src_b_rows, dst_rows); + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void saturating_multiply( \ - const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height, double scale) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + saturating_multiply(const type *src_a, size_t src_a_stride, \ + const type *src_b, size_t src_b_stride, type *dst, \ + size_t dst_stride, size_t width, size_t height, \ + double scale) INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); INTRINSICCV_INSTANTIATE_TEMPLATE(int8_t); diff --git a/intrinsiccv/src/arithmetics/scale_api.cpp b/intrinsiccv/src/arithmetics/scale_api.cpp index da7d995e15859f455543c44f61663459e484d331..7f94cd6156bb3b2d016c94151166213fba22b949 100644 --- a/intrinsiccv/src/arithmetics/scale_api.cpp +++ b/intrinsiccv/src/arithmetics/scale_api.cpp @@ -11,17 +11,18 @@ namespace intrinsiccv { namespace neon { template -void scale(const T *src, size_t src_stride, T *dst, size_t dst_stride, - size_t width, size_t height, float scale, float shift); +intrinsiccv_error_t scale(const T *src, size_t src_stride, T *dst, + size_t dst_stride, size_t width, size_t height, + float scale, float shift); } // namespace neon namespace sve2 {} // namespace sve2 namespace sme2 {} // namespace sme2 -#define INTRINSICCV_DEFINE_SCALE_API(name, type) \ - INTRINSICCV_MULTIVERSION_C_API(name, intrinsiccv::neon::scale, \ - nullptr, nullptr, void, const type *, size_t, \ +#define INTRINSICCV_DEFINE_SCALE_API(name, type) \ + INTRINSICCV_MULTIVERSION_C_API(name, intrinsiccv::neon::scale, \ + nullptr, nullptr, const type *, size_t, \ type *, size_t, size_t, size_t, float, float) INTRINSICCV_DEFINE_SCALE_API(intrinsiccv_scale_u8, uint8_t); diff --git a/intrinsiccv/src/arithmetics/scale_neon.cpp b/intrinsiccv/src/arithmetics/scale_neon.cpp index c8c531d2115ebb494c960508ef86bb53729c7246..52c5be3fe2662ac69ec74e6f4bf0077c2dea46a6 100644 --- a/intrinsiccv/src/arithmetics/scale_neon.cpp +++ b/intrinsiccv/src/arithmetics/scale_neon.cpp @@ -169,8 +169,9 @@ class ScaleFloat final : public ScaleBase { }; // end of class ScaleFloat template -void scale(const T *src, size_t src_stride, T *dst, size_t dst_stride, - size_t width, size_t height, float scale, float shift) { +intrinsiccv_error_t scale(const T *src, size_t src_stride, T *dst, + size_t dst_stride, size_t width, size_t height, + float scale, float shift) { Rectangle rect{width, height}; Rows src_rows{src, src_stride}; Rows dst_rows{dst, dst_stride}; @@ -184,10 +185,11 @@ void scale(const T *src, size_t src_stride, T *dst, size_t dst_stride, ScaleTbx operation(scale, shift); apply_operation_by_rows(operation, rect, src_rows, dst_rows); } + return INTRINSICCV_OK; } #define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void scale( \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t scale( \ const type *src, size_t src_stride, type *dst, size_t dst_stride, \ size_t width, size_t height, float scale, float shift) diff --git a/intrinsiccv/src/arithmetics/sub_api.cpp b/intrinsiccv/src/arithmetics/sub_api.cpp index 929d1f32de1b77ce39179aa3dc80fb5924bc49b7..5336faf0d2a6c6c99a6a742321d16fd9ca983b53 100644 --- a/intrinsiccv/src/arithmetics/sub_api.cpp +++ b/intrinsiccv/src/arithmetics/sub_api.cpp @@ -10,35 +10,37 @@ namespace intrinsiccv { namespace neon { template -void saturating_sub(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height); +intrinsiccv_error_t saturating_sub(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, T *dst, + size_t dst_stride, size_t width, + size_t height); } // namespace neon namespace sve2 { template -void saturating_sub(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height); +intrinsiccv_error_t saturating_sub(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, T *dst, + size_t dst_stride, size_t width, + size_t height); } // namespace sve2 namespace sme2 { - template -void saturating_sub(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height); +intrinsiccv_error_t saturating_sub(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, T *dst, + size_t dst_stride, size_t width, + size_t height); } // namespace sme2 -#define INTRINSICCV_DEFINE_C_API(name, type) \ - INTRINSICCV_MULTIVERSION_C_API( \ - name, intrinsiccv::neon::saturating_sub, \ - INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::saturating_sub), \ - intrinsiccv::sme2::saturating_sub, void, const type *, size_t, \ +#define INTRINSICCV_DEFINE_C_API(name, type) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::saturating_sub, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::saturating_sub), \ + intrinsiccv::sme2::saturating_sub, const type *, size_t, \ const type *, size_t, type *, size_t, size_t, size_t) INTRINSICCV_DEFINE_C_API(intrinsiccv_saturating_sub_s8, int8_t); diff --git a/intrinsiccv/src/arithmetics/sub_neon.cpp b/intrinsiccv/src/arithmetics/sub_neon.cpp index 826bd05c4afa212385a84b8feb4c168924eef6e2..a015998669405a3420e58dd3a52f61d022e21cf8 100644 --- a/intrinsiccv/src/arithmetics/sub_neon.cpp +++ b/intrinsiccv/src/arithmetics/sub_neon.cpp @@ -35,22 +35,24 @@ class SaturatingSub final : public UnrollTwice { }; // end of class SaturatingSub template -void saturating_sub(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height) { +intrinsiccv_error_t saturating_sub(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, T *dst, + size_t dst_stride, size_t width, + size_t height) { SaturatingSub operation; Rectangle rect{width, height}; Rows src_a_rows{src_a, src_a_stride}; Rows src_b_rows{src_b, src_b_stride}; Rows dst_rows{dst, dst_stride}; apply_operation_by_rows(operation, rect, src_a_rows, src_b_rows, dst_rows); + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void saturating_sub( \ - const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + saturating_sub(const type *src_a, size_t src_a_stride, \ + const type *src_b, size_t src_b_stride, type *dst, \ + size_t dst_stride, size_t width, size_t height) INTRINSICCV_INSTANTIATE_TEMPLATE(int8_t); INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); diff --git a/intrinsiccv/src/arithmetics/sub_sme2.cpp b/intrinsiccv/src/arithmetics/sub_sme2.cpp index 73b722f1231f9a6c584030441ff5613a08a4b817..07ac367e863a3c3da88af40cdec64c2c228c342d 100644 --- a/intrinsiccv/src/arithmetics/sub_sme2.cpp +++ b/intrinsiccv/src/arithmetics/sub_sme2.cpp @@ -23,7 +23,7 @@ class SaturatingSub final : public UnrollTwice { }; // end of class SaturatingSub template -INTRINSICCV_LOCALLY_STREAMING void saturating_sub( +INTRINSICCV_LOCALLY_STREAMING intrinsiccv_error_t saturating_sub( const T *src_a, size_t src_a_stride, const T *src_b, size_t src_b_stride, T *dst, size_t dst_stride, size_t width, size_t height) { SaturatingSub operation; @@ -33,13 +33,14 @@ INTRINSICCV_LOCALLY_STREAMING void saturating_sub( Rows dst_rows{dst, dst_stride}; sve2::apply_operation_by_rows(operation, rect, src_a_rows, src_b_rows, dst_rows); + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void saturating_sub( \ - const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + saturating_sub(const type *src_a, size_t src_a_stride, \ + const type *src_b, size_t src_b_stride, type *dst, \ + size_t dst_stride, size_t width, size_t height) INTRINSICCV_INSTANTIATE_TEMPLATE(int8_t); INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); diff --git a/intrinsiccv/src/arithmetics/sub_sve2.cpp b/intrinsiccv/src/arithmetics/sub_sve2.cpp index 7c889acae7f56b7e4614c5bc1097fd40f8cd96c6..376180384c315a1fa21b55700da60dc44f683a6e 100644 --- a/intrinsiccv/src/arithmetics/sub_sve2.cpp +++ b/intrinsiccv/src/arithmetics/sub_sve2.cpp @@ -22,9 +22,10 @@ class SaturatingSub final : public UnrollTwice { }; // end of class SaturatingSub template -void saturating_sub(const T *src_a, size_t src_a_stride, const T *src_b, - size_t src_b_stride, T *dst, size_t dst_stride, - size_t width, size_t height) { +intrinsiccv_error_t saturating_sub(const T *src_a, size_t src_a_stride, + const T *src_b, size_t src_b_stride, T *dst, + size_t dst_stride, size_t width, + size_t height) { SaturatingSub operation; Rectangle rect{width, height}; Rows src_a_rows{src_a, src_a_stride}; @@ -32,13 +33,14 @@ void saturating_sub(const T *src_a, size_t src_a_stride, const T *src_b, Rows dst_rows{dst, dst_stride}; sve2::apply_operation_by_rows(operation, rect, src_a_rows, src_b_rows, dst_rows); + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void saturating_sub( \ - const type *src_a, size_t src_a_stride, const type *src_b, \ - size_t src_b_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + saturating_sub(const type *src_a, size_t src_a_stride, \ + const type *src_b, size_t src_b_stride, type *dst, \ + size_t dst_stride, size_t width, size_t height) INTRINSICCV_INSTANTIATE_TEMPLATE(int8_t); INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); diff --git a/intrinsiccv/src/arithmetics/threshold_api.cpp b/intrinsiccv/src/arithmetics/threshold_api.cpp index 5ec4410b672499769f464dc1824a67969ce2c5d0..3510d048ee3e4c1b9109270adb4deca8cbdd55e7 100644 --- a/intrinsiccv/src/arithmetics/threshold_api.cpp +++ b/intrinsiccv/src/arithmetics/threshold_api.cpp @@ -9,31 +9,31 @@ namespace intrinsiccv { namespace neon { template -void threshold_binary(const T *src, size_t src_stride, T *dst, - size_t dst_stride, size_t width, size_t height, - T threshold, T value); +intrinsiccv_error_t threshold_binary(const T *src, size_t src_stride, T *dst, + size_t dst_stride, size_t width, + size_t height, T threshold, T value); } // namespace neon namespace sve2 { template -void threshold_binary(const T *src, size_t src_stride, T *dst, - size_t dst_stride, size_t width, size_t height, - T threshold, T value); +intrinsiccv_error_t threshold_binary(const T *src, size_t src_stride, T *dst, + size_t dst_stride, size_t width, + size_t height, T threshold, T value); } // namespace sve2 namespace sme2 { template -void threshold_binary(const T *src, size_t src_stride, T *dst, - size_t dst_stride, size_t width, size_t height, - T threshold, T value); +intrinsiccv_error_t threshold_binary(const T *src, size_t src_stride, T *dst, + size_t dst_stride, size_t width, + size_t height, T threshold, T value); } // namespace sme2 -#define INTRINSICCV_DEFINE_C_API(name, type) \ - INTRINSICCV_MULTIVERSION_C_API( \ - name, intrinsiccv::neon::threshold_binary, \ - INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::threshold_binary), \ - intrinsiccv::sme2::threshold_binary, void, const type *, size_t, \ - type *, size_t, size_t, size_t, type, type) +#define INTRINSICCV_DEFINE_C_API(name, type) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::threshold_binary, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::threshold_binary), \ + intrinsiccv::sme2::threshold_binary, const type *, size_t, type *, \ + size_t, size_t, size_t, type, type) INTRINSICCV_DEFINE_C_API(intrinsiccv_threshold_binary_u8, uint8_t); diff --git a/intrinsiccv/src/arithmetics/threshold_neon.cpp b/intrinsiccv/src/arithmetics/threshold_neon.cpp index ff3332a9a8a308cee48efdfb36f179b9b56bc46a..94ae83eb2c6fa10460eeb1f495c6fdfcbdeb0008 100644 --- a/intrinsiccv/src/arithmetics/threshold_neon.cpp +++ b/intrinsiccv/src/arithmetics/threshold_neon.cpp @@ -38,20 +38,22 @@ class BinaryThreshold final : public UnrollTwice { }; // end of class BinaryThreshold template -void threshold_binary(const T *src, size_t src_stride, T *dst, - size_t dst_stride, size_t width, size_t height, - T threshold, T value) { +intrinsiccv_error_t threshold_binary(const T *src, size_t src_stride, T *dst, + size_t dst_stride, size_t width, + size_t height, T threshold, T value) { Rectangle rect{width, height}; Rows src_rows{src, src_stride}; Rows dst_rows{dst, dst_stride}; BinaryThreshold operation{threshold, value}; apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void threshold_binary( \ - const type *src, size_t src_stride, type *dst, size_t dst_stride, \ - size_t width, size_t height, type threshold, type value) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + threshold_binary(const type *src, size_t src_stride, type *dst, \ + size_t dst_stride, size_t width, size_t height, \ + type threshold, type value) INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); diff --git a/intrinsiccv/src/arithmetics/threshold_sc.h b/intrinsiccv/src/arithmetics/threshold_sc.h index 22f5074aca2099d8e9734b43a7a1d16fcd7ff19e..5922a17778c807b6d2e0c52059db3f32ceb94dd6 100644 --- a/intrinsiccv/src/arithmetics/threshold_sc.h +++ b/intrinsiccv/src/arithmetics/threshold_sc.h @@ -34,15 +34,15 @@ class BinaryThreshold final : public UnrollTwice { }; // end of class BinaryThreshold template -void threshold_binary_sc(const T *src, size_t src_stride, T *dst, - size_t dst_stride, size_t width, size_t height, - T threshold, - T value) INTRINSICCV_STREAMING_COMPATIBLE { +intrinsiccv_error_t threshold_binary_sc( + const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width, + size_t height, T threshold, T value) INTRINSICCV_STREAMING_COMPATIBLE { Rectangle rect{width, height}; Rows src_rows{src, src_stride}; Rows dst_rows{dst, dst_stride}; BinaryThreshold operation{threshold, value}; sve2::apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } } // namespace intrinsiccv::sve2 diff --git a/intrinsiccv/src/arithmetics/threshold_sme2.cpp b/intrinsiccv/src/arithmetics/threshold_sme2.cpp index 8668aa97ad076d827b40c37bb236ba0ae98583ac..e94e5cb1830df2fd8322206275dd5819b36ef994 100644 --- a/intrinsiccv/src/arithmetics/threshold_sme2.cpp +++ b/intrinsiccv/src/arithmetics/threshold_sme2.cpp @@ -7,17 +7,18 @@ namespace intrinsiccv::sme2 { template -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void threshold_binary( - const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width, - size_t height, T threshold, T value) { - intrinsiccv::sve2::threshold_binary_sc(src, src_stride, dst, dst_stride, - width, height, threshold, value); +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +threshold_binary(const T *src, size_t src_stride, T *dst, size_t dst_stride, + size_t width, size_t height, T threshold, T value) { + return intrinsiccv::sve2::threshold_binary_sc( + src, src_stride, dst, dst_stride, width, height, threshold, value); } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void threshold_binary( \ - const type *src, size_t src_stride, type *dst, size_t dst_stride, \ - size_t width, size_t height, type threshold, type value) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + threshold_binary(const type *src, size_t src_stride, type *dst, \ + size_t dst_stride, size_t width, size_t height, \ + type threshold, type value) INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); diff --git a/intrinsiccv/src/arithmetics/threshold_sve2.cpp b/intrinsiccv/src/arithmetics/threshold_sve2.cpp index 6ef323dff9c18dfa9987e3e3479d8207a908e19e..0fb55bc6012ec26723763da1f1eef94c2e377c0f 100644 --- a/intrinsiccv/src/arithmetics/threshold_sve2.cpp +++ b/intrinsiccv/src/arithmetics/threshold_sve2.cpp @@ -7,19 +7,18 @@ namespace intrinsiccv::sve2 { template -void INTRINSICCV_TARGET_FN_ATTRS threshold_binary(const T *src, - size_t src_stride, T *dst, - size_t dst_stride, - size_t width, size_t height, - T threshold, T value) { - threshold_binary_sc(src, src_stride, dst, dst_stride, width, height, - threshold, value); +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +threshold_binary(const T *src, size_t src_stride, T *dst, size_t dst_stride, + size_t width, size_t height, T threshold, T value) { + return threshold_binary_sc(src, src_stride, dst, dst_stride, width, height, + threshold, value); } -#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ - template INTRINSICCV_TARGET_FN_ATTRS void threshold_binary( \ - const type *src, size_t src_stride, type *dst, size_t dst_stride, \ - size_t width, size_t height, type threshold, type value) +#define INTRINSICCV_INSTANTIATE_TEMPLATE(type) \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t \ + threshold_binary(const type *src, size_t src_stride, type *dst, \ + size_t dst_stride, size_t width, size_t height, \ + type threshold, type value) INTRINSICCV_INSTANTIATE_TEMPLATE(uint8_t); diff --git a/intrinsiccv/src/arithmetics/transpose_api.cpp b/intrinsiccv/src/arithmetics/transpose_api.cpp index 3143ff10c7e9fc286b55c2ac8038fbe097bbb3f3..237d4340a621a70f06d0cc3dcbbb121ae6c638ba 100644 --- a/intrinsiccv/src/arithmetics/transpose_api.cpp +++ b/intrinsiccv/src/arithmetics/transpose_api.cpp @@ -10,7 +10,7 @@ namespace intrinsiccv { INTRINSICCV_MULTIVERSION_C_API(intrinsiccv_transpose, intrinsiccv::neon::transpose, nullptr, nullptr, - void, const void *, size_t, void *, size_t, - size_t, size_t, size_t); + const void *, size_t, void *, size_t, size_t, + size_t, size_t); } // namespace intrinsiccv diff --git a/intrinsiccv/src/arithmetics/transpose_neon.cpp b/intrinsiccv/src/arithmetics/transpose_neon.cpp index 94d367ee800cadf63dd7b074c01905cefd0c4808..5dfc86917c214d10fa1defc665e976107c585241 100644 --- a/intrinsiccv/src/arithmetics/transpose_neon.cpp +++ b/intrinsiccv/src/arithmetics/transpose_neon.cpp @@ -98,8 +98,9 @@ static void scalar_path(Rows src_rows, } template -static void transpose(Rectangle rect, Rows src_rows, - Rows dst_rows) { +static intrinsiccv_error_t transpose(Rectangle rect, + Rows src_rows, + Rows dst_rows) { constexpr size_t num_of_lanes = VecTraits::num_lanes(); auto handle_lane_number_of_rows = [&](size_t vindex) { @@ -127,10 +128,12 @@ static void transpose(Rectangle rect, Rows src_rows, scalar_path(src_rows.at(hindex), dst_rows.at(0, hindex), final_hindex - hindex, rect.width()); }); + return INTRINSICCV_OK; } template -static void transpose(Rectangle rect, Rows data_rows) { +static intrinsiccv_error_t transpose(Rectangle rect, + Rows data_rows) { constexpr size_t num_of_lanes = VecTraits::num_lanes(); // rect.width() needs to be equal to rect.height() @@ -190,32 +193,34 @@ static void transpose(Rectangle rect, Rows data_rows) { } } }); + return INTRINSICCV_OK; } template -static void transpose(const void *src, size_t src_stride, void *dst, - size_t dst_stride, size_t src_width, size_t src_height, - bool inplace) { +static intrinsiccv_error_t transpose(const void *src, size_t src_stride, + void *dst, size_t dst_stride, + size_t src_width, size_t src_height, + bool inplace) { Rectangle rect{src_width, src_height}; Rows dst_rows{dst, dst_stride}; if (inplace) { - transpose(rect, dst_rows); - } else { - Rows src_rows{src, src_stride}; - transpose(rect, src_rows, dst_rows); + return transpose(rect, dst_rows); } + Rows src_rows{src, src_stride}; + return transpose(rect, src_rows, dst_rows); } INTRINSICCV_TARGET_FN_ATTRS -void transpose(const void *src, size_t src_stride, void *dst, size_t dst_stride, - size_t src_width, size_t src_height, size_t element_size) { +intrinsiccv_error_t transpose(const void *src, size_t src_stride, void *dst, + size_t dst_stride, size_t src_width, + size_t src_height, size_t element_size) { bool inplace = false; if (src == dst) { if (src_width != src_height) { // Inplace transpose only implemented if width and height are the same - return; + return INTRINSICCV_ERROR_NOT_IMPLEMENTED; } inplace = true; } @@ -223,24 +228,17 @@ void transpose(const void *src, size_t src_stride, void *dst, size_t dst_stride, switch (element_size) { default: case sizeof(uint8_t): - transpose(src, src_stride, dst, dst_stride, src_width, - src_height, inplace); - break; - + return transpose(src, src_stride, dst, dst_stride, src_width, + src_height, inplace); case sizeof(uint16_t): - transpose(src, src_stride, dst, dst_stride, src_width, - src_height, inplace); - break; - + return transpose(src, src_stride, dst, dst_stride, src_width, + src_height, inplace); case sizeof(uint32_t): - transpose(src, src_stride, dst, dst_stride, src_width, - src_height, inplace); - break; - + return transpose(src, src_stride, dst, dst_stride, src_width, + src_height, inplace); case sizeof(uint64_t): - transpose(src, src_stride, dst, dst_stride, src_width, - src_height, inplace); - break; + return transpose(src, src_stride, dst, dst_stride, src_width, + src_height, inplace); } } diff --git a/intrinsiccv/src/conversions/gray_to_rgb_api.cpp b/intrinsiccv/src/conversions/gray_to_rgb_api.cpp index 020499bf677715b8f1dc614295bfdaea484c11cb..8cd845e9537ab088a081144928bb7fa3f734c37b 100644 --- a/intrinsiccv/src/conversions/gray_to_rgb_api.cpp +++ b/intrinsiccv/src/conversions/gray_to_rgb_api.cpp @@ -8,13 +8,12 @@ namespace intrinsiccv { -#define INTRINSICCV_DEFINE_C_API(name, partialname) \ - INTRINSICCV_MULTIVERSION_C_API( \ - name, intrinsiccv::neon::partialname, \ - INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::partialname), \ - intrinsiccv::sme2::partialname, void, const uint8_t *src, \ - size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, \ - size_t height) +#define INTRINSICCV_DEFINE_C_API(name, partialname) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::partialname, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::partialname), \ + intrinsiccv::sme2::partialname, const uint8_t *src, size_t src_stride, \ + uint8_t *dst, size_t dst_stride, size_t width, size_t height) INTRINSICCV_DEFINE_C_API(intrinsiccv_gray_to_rgb_u8, gray_to_rgb_u8); INTRINSICCV_DEFINE_C_API(intrinsiccv_gray_to_rgba_u8, gray_to_rgba_u8); diff --git a/intrinsiccv/src/conversions/gray_to_rgb_neon.cpp b/intrinsiccv/src/conversions/gray_to_rgb_neon.cpp index a6682412f9008f44539180c2ae1bd1cb440619f2..741e81e99cbdf216acfc607689de08b4eb515b3d 100644 --- a/intrinsiccv/src/conversions/gray_to_rgb_neon.cpp +++ b/intrinsiccv/src/conversions/gray_to_rgb_neon.cpp @@ -105,23 +105,27 @@ class GrayToRGBA final : public UnrollTwice { }; // end of class GrayToRGBA INTRINSICCV_TARGET_FN_ATTRS -void gray_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height) { +intrinsiccv_error_t gray_to_rgb_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height) { Rectangle rect{width, height}; Rows src_rows{src, src_stride}; Rows dst_rows{dst, dst_stride, 3 /* RGB */}; GrayToRGB operation; apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -void gray_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height) { +intrinsiccv_error_t gray_to_rgba_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height) { Rectangle rect{width, height}; Rows src_rows{src, src_stride}; Rows dst_rows{dst, dst_stride, 4 /* RGBA */}; GrayToRGBA operation; apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } } // namespace intrinsiccv::neon diff --git a/intrinsiccv/src/conversions/gray_to_rgb_sc.h b/intrinsiccv/src/conversions/gray_to_rgb_sc.h index 3c091c45dbee85e892bc5d1172ed5906f0fa3891..b68619bf92de62049dec8ab608a98fa4ffe7752a 100644 --- a/intrinsiccv/src/conversions/gray_to_rgb_sc.h +++ b/intrinsiccv/src/conversions/gray_to_rgb_sc.h @@ -196,7 +196,7 @@ class GrayToRGBA final : #endif // INTRINSICCV_PREFER_INTERLEAVING_LOAD_STORE }; // end of class GrayToRGBA -INTRINSICCV_TARGET_FN_ATTRS static void gray_to_rgb_u8_sc( +INTRINSICCV_TARGET_FN_ATTRS static intrinsiccv_error_t gray_to_rgb_u8_sc( const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, size_t height) INTRINSICCV_STREAMING_COMPATIBLE { Rectangle rect{width, height}; @@ -209,9 +209,10 @@ INTRINSICCV_TARGET_FN_ATTRS static void gray_to_rgb_u8_sc( GrayToRGB operation{table_indices}; #endif sve2::apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } -INTRINSICCV_TARGET_FN_ATTRS static void gray_to_rgba_u8_sc( +INTRINSICCV_TARGET_FN_ATTRS static intrinsiccv_error_t gray_to_rgba_u8_sc( const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, size_t height) INTRINSICCV_STREAMING_COMPATIBLE { Rectangle rect{width, height}; @@ -224,6 +225,7 @@ INTRINSICCV_TARGET_FN_ATTRS static void gray_to_rgba_u8_sc( GrayToRGBA operation{table_indices}; #endif sve2::apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } } // namespace intrinsiccv::sve2 diff --git a/intrinsiccv/src/conversions/gray_to_rgb_sme2.cpp b/intrinsiccv/src/conversions/gray_to_rgb_sme2.cpp index e373b7ddc68dde0219b3e883eed427ad8125a0e8..d6777b5bc15b9c147912acdef7c00470d4bbe27b 100644 --- a/intrinsiccv/src/conversions/gray_to_rgb_sme2.cpp +++ b/intrinsiccv/src/conversions/gray_to_rgb_sme2.cpp @@ -6,18 +6,18 @@ namespace intrinsiccv::sme2 { -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void gray_to_rgb_u8( - const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, - size_t width, size_t height) { - intrinsiccv::sve2::gray_to_rgb_u8_sc(src, src_stride, dst, dst_stride, width, - height); +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +gray_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height) { + return intrinsiccv::sve2::gray_to_rgb_u8_sc(src, src_stride, dst, dst_stride, + width, height); } -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void gray_to_rgba_u8( - const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, - size_t width, size_t height) { - intrinsiccv::sve2::gray_to_rgba_u8_sc(src, src_stride, dst, dst_stride, width, - height); +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +gray_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height) { + return intrinsiccv::sve2::gray_to_rgba_u8_sc(src, src_stride, dst, dst_stride, + width, height); } } // namespace intrinsiccv::sme2 diff --git a/intrinsiccv/src/conversions/gray_to_rgb_sve2.cpp b/intrinsiccv/src/conversions/gray_to_rgb_sve2.cpp index edcfa00225d8029f832f34367e8c6dd6b5fbf094..647e36dce9dca47a9d8b8d038c33c5072162c723 100644 --- a/intrinsiccv/src/conversions/gray_to_rgb_sve2.cpp +++ b/intrinsiccv/src/conversions/gray_to_rgb_sve2.cpp @@ -6,19 +6,16 @@ namespace intrinsiccv::sve2 { -INTRINSICCV_TARGET_FN_ATTRS void gray_to_rgb_u8(const uint8_t *src, - size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, - size_t height) { - gray_to_rgb_u8_sc(src, src_stride, dst, dst_stride, width, height); +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +gray_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height) { + return gray_to_rgb_u8_sc(src, src_stride, dst, dst_stride, width, height); } -INTRINSICCV_TARGET_FN_ATTRS void gray_to_rgba_u8(const uint8_t *src, - size_t src_stride, - uint8_t *dst, - size_t dst_stride, - size_t width, size_t height) { - gray_to_rgba_u8_sc(src, src_stride, dst, dst_stride, width, height); +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +gray_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height) { + return gray_to_rgba_u8_sc(src, src_stride, dst, dst_stride, width, height); } } // namespace intrinsiccv::sve2 diff --git a/intrinsiccv/src/conversions/merge_api.cpp b/intrinsiccv/src/conversions/merge_api.cpp index ff3ce0b34a40876d9a7fc42d37b6484985e8848a..136432a65423c18d81c68681b41c7e14a4b37468 100644 --- a/intrinsiccv/src/conversions/merge_api.cpp +++ b/intrinsiccv/src/conversions/merge_api.cpp @@ -9,8 +9,7 @@ namespace intrinsiccv { INTRINSICCV_MULTIVERSION_C_API(intrinsiccv_merge, intrinsiccv::neon::merge, - nullptr, nullptr, void, const void **, - const size_t *, void *, size_t, size_t, size_t, - size_t, size_t); + nullptr, nullptr, const void **, const size_t *, + void *, size_t, size_t, size_t, size_t, size_t); } // namespace intrinsiccv diff --git a/intrinsiccv/src/conversions/merge_neon.cpp b/intrinsiccv/src/conversions/merge_neon.cpp index d88154355b0d6578ed8256820fde6fd0bb5312b0..b586b73c020a8ee460c52f8358d94903db18fb68 100644 --- a/intrinsiccv/src/conversions/merge_neon.cpp +++ b/intrinsiccv/src/conversions/merge_neon.cpp @@ -368,8 +368,9 @@ class Merge4 final : public UnrollTwice { #endif // !INTRINSICCV_PREFER_INTERLEAVING_LOAD_STORE template -void merge(const void **srcs, const size_t *src_strides, void *dst, - size_t dst_stride, size_t width, size_t height, size_t channels) { +intrinsiccv_error_t merge(const void **srcs, const size_t *src_strides, + void *dst, size_t dst_stride, size_t width, + size_t height, size_t channels) { Rectangle rect{width, height}; Rows src_a_rows{srcs[0], src_strides[0]}; Rows src_b_rows{srcs[1], src_strides[1]}; @@ -398,12 +399,13 @@ void merge(const void **srcs, const size_t *src_strides, void *dst, src_c_rows, src_d_rows, dst_rows); } break; } + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -void merge(const void **srcs, const size_t *src_strides, void *dst, - size_t dst_stride, size_t width, size_t height, size_t channels, - size_t element_size) { +intrinsiccv_error_t merge(const void **srcs, const size_t *src_strides, + void *dst, size_t dst_stride, size_t width, + size_t height, size_t channels, size_t element_size) { switch (element_size) { default: case sizeof(uint8_t): @@ -426,6 +428,7 @@ void merge(const void **srcs, const size_t *src_strides, void *dst, channels); break; } + return INTRINSICCV_OK; } } // namespace intrinsiccv::neon diff --git a/intrinsiccv/src/conversions/rgb_to_rgb_api.cpp b/intrinsiccv/src/conversions/rgb_to_rgb_api.cpp index 1ca54020f34205a6fa0672f9e7a150d64d949f4f..a16fae24d090537382d47baf1a714d35c78a9183 100644 --- a/intrinsiccv/src/conversions/rgb_to_rgb_api.cpp +++ b/intrinsiccv/src/conversions/rgb_to_rgb_api.cpp @@ -9,13 +9,12 @@ namespace intrinsiccv { -#define INTRINSICCV_DEFINE_C_API(name, partialname) \ - INTRINSICCV_MULTIVERSION_C_API( \ - name, intrinsiccv::neon::partialname, \ - INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::partialname), \ - intrinsiccv::sme2::partialname, void, const uint8_t *src, \ - size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, \ - size_t height) +#define INTRINSICCV_DEFINE_C_API(name, partialname) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::partialname, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::partialname), \ + intrinsiccv::sme2::partialname, const uint8_t *src, size_t src_stride, \ + uint8_t *dst, size_t dst_stride, size_t width, size_t height) INTRINSICCV_DEFINE_C_API(intrinsiccv_rgb_to_bgr_u8, rgb_to_bgr_u8); INTRINSICCV_DEFINE_C_API(intrinsiccv_rgba_to_bgra_u8, rgba_to_bgra_u8); @@ -26,22 +25,26 @@ INTRINSICCV_DEFINE_C_API(intrinsiccv_rgba_to_rgb_u8, rgba_to_rgb_u8); extern "C" { -void intrinsiccv_rgb_to_rgb_u8(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height) { +intrinsiccv_error_t intrinsiccv_rgb_to_rgb_u8(const uint8_t *src, + size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height) { Rectangle rect{width, height}; Rows src_rows{src, src_stride, 3 /* RGB */}; Rows dst_rows{dst, dst_stride, 3 /* BGR */}; CopyRows::copy_rows(rect, src_rows, dst_rows); + return INTRINSICCV_OK; } -void intrinsiccv_rgba_to_rgba_u8(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height) { +intrinsiccv_error_t intrinsiccv_rgba_to_rgba_u8(const uint8_t *src, + size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height) { Rectangle rect{width, height}; Rows src_rows{src, src_stride, 4 /* RGBA */}; Rows dst_rows{dst, dst_stride, 4 /* RGBA */}; CopyRows::copy_rows(rect, src_rows, dst_rows); + return INTRINSICCV_OK; } } // extern "C" diff --git a/intrinsiccv/src/conversions/rgb_to_rgb_neon.cpp b/intrinsiccv/src/conversions/rgb_to_rgb_neon.cpp index 137150b4a14fa2126889b94e00e0fd781b3cf7f0..34357d34a0a3437360cbb94ac1ec3673067d4fa9 100644 --- a/intrinsiccv/src/conversions/rgb_to_rgb_neon.cpp +++ b/intrinsiccv/src/conversions/rgb_to_rgb_neon.cpp @@ -188,63 +188,73 @@ class RGBAToRGB final : public UnrollTwice { }; // end of class RGBAToRGB INTRINSICCV_TARGET_FN_ATTRS -void rgb_to_bgr_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height) { +intrinsiccv_error_t rgb_to_bgr_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, size_t width, + size_t height) { Rectangle rect{width, height}; Rows src_rows{src, src_stride, 3 /* RGB */}; Rows dst_rows{dst, dst_stride, 3 /* BGR */}; RGBToBGR operation; apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -void rgba_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height) { +intrinsiccv_error_t rgba_to_bgra_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height) { Rectangle rect{width, height}; Rows src_rows{src, src_stride, 4 /* RGBA */}; Rows dst_rows{dst, dst_stride, 4 /* BGRA */}; RGBAToBGRA operation; apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } -INTRINSICCV_TARGET_FN_ATTRS -void rgb_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height) { +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +rgb_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height) { Rectangle rect{width, height}; Rows src_rows{src, src_stride, 3 /* RGB */}; Rows dst_rows{dst, dst_stride, 4 /* BGRA */}; RGBToBGRA operation; apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } -INTRINSICCV_TARGET_FN_ATTRS -void rgb_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height) { +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +rgb_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height) { Rectangle rect{width, height}; Rows src_rows{src, src_stride, 3 /* RGB */}; Rows dst_rows{dst, dst_stride, 4 /* RGBA */}; RGBToRGBA operation; apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -void rgba_to_bgr_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height) { +intrinsiccv_error_t rgba_to_bgr_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height) { Rectangle rect{width, height}; Rows src_rows{src, src_stride, 4 /* RGBA */}; Rows dst_rows{dst, dst_stride, 3 /* BGR */}; RGBAToBGR operation; apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -void rgba_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height) { +intrinsiccv_error_t rgba_to_rgb_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height) { Rectangle rect{width, height}; Rows src_rows{src, src_stride, 4 /* RGBA */}; Rows dst_rows{dst, dst_stride, 3 /* RGB */}; RGBAToRGB operation; apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } } // namespace intrinsiccv::neon diff --git a/intrinsiccv/src/conversions/rgb_to_rgb_sc.h b/intrinsiccv/src/conversions/rgb_to_rgb_sc.h index 8bdfa32247dc9ec28d0942009514155c6f7a272e..2477d284653d1bc5a64f981f5bf327d02f526353 100644 --- a/intrinsiccv/src/conversions/rgb_to_rgb_sc.h +++ b/intrinsiccv/src/conversions/rgb_to_rgb_sc.h @@ -181,7 +181,7 @@ class RGBAToRGB final : public UnrollTwice { } }; // end of class RGBAToRGB -INTRINSICCV_TARGET_FN_ATTRS static void rgb_to_bgr_u8_sc( +INTRINSICCV_TARGET_FN_ATTRS static intrinsiccv_error_t rgb_to_bgr_u8_sc( const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, size_t height) INTRINSICCV_STREAMING_COMPATIBLE { Rectangle rect{width, height}; @@ -194,61 +194,67 @@ INTRINSICCV_TARGET_FN_ATTRS static void rgb_to_bgr_u8_sc( RGBToBGR operation{table_indices}; #endif sve2::apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -static void rgba_to_bgra_u8_sc(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height) INTRINSICCV_STREAMING_COMPATIBLE { +static intrinsiccv_error_t rgba_to_bgra_u8_sc( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height) INTRINSICCV_STREAMING_COMPATIBLE { Rectangle rect{width, height}; Rows src_rows{src, src_stride, 4 /* RGBA */}; Rows dst_rows{dst, dst_stride, 4 /* BGRA */}; RGBAToBGRA operation; sve2::apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -static void rgb_to_bgra_u8_sc(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height) INTRINSICCV_STREAMING_COMPATIBLE { +static intrinsiccv_error_t rgb_to_bgra_u8_sc( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height) INTRINSICCV_STREAMING_COMPATIBLE { Rectangle rect{width, height}; Rows src_rows{src, src_stride, 3 /* RGB */}; Rows dst_rows{dst, dst_stride, 4 /* BGRA */}; RGBToBGRA operation; sve2::apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -static void rgb_to_rgba_u8_sc(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height) INTRINSICCV_STREAMING_COMPATIBLE { +static intrinsiccv_error_t rgb_to_rgba_u8_sc( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height) INTRINSICCV_STREAMING_COMPATIBLE { Rectangle rect{width, height}; Rows src_rows{src, src_stride, 3 /* RGB */}; Rows dst_rows{dst, dst_stride, 4 /* RGBA */}; RGBToRGBA operation; sve2::apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -static void rgba_to_bgr_u8_sc(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height) INTRINSICCV_STREAMING_COMPATIBLE { +static intrinsiccv_error_t rgba_to_bgr_u8_sc( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height) INTRINSICCV_STREAMING_COMPATIBLE { Rectangle rect{width, height}; Rows src_rows{src, src_stride, 4 /* RGBA */}; Rows dst_rows{dst, dst_stride, 3 /* BGR */}; RGBAToBGR operation; sve2::apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -static void rgba_to_rgb_u8_sc(const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height) INTRINSICCV_STREAMING_COMPATIBLE { +static intrinsiccv_error_t rgba_to_rgb_u8_sc( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height) INTRINSICCV_STREAMING_COMPATIBLE { Rectangle rect{width, height}; Rows src_rows{src, src_stride, 4 /* RGBA */}; Rows dst_rows{dst, dst_stride, 3 /* RGB */}; RGBAToRGB operation; sve2::apply_operation_by_rows(operation, rect, src_rows, dst_rows); + return INTRINSICCV_OK; } } // namespace intrinsiccv::sve2 diff --git a/intrinsiccv/src/conversions/rgb_to_rgb_sme2.cpp b/intrinsiccv/src/conversions/rgb_to_rgb_sme2.cpp index b3ba5d9599c042546f20c97c2484df6f9f767202..9e66ab7abaebf16b7d7b88e54a20f020c5117dcd 100644 --- a/intrinsiccv/src/conversions/rgb_to_rgb_sme2.cpp +++ b/intrinsiccv/src/conversions/rgb_to_rgb_sme2.cpp @@ -6,46 +6,46 @@ namespace intrinsiccv::sme2 { -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void rgb_to_bgr_u8( - const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, - size_t width, size_t height) { - intrinsiccv::sve2::rgb_to_bgr_u8_sc(src, src_stride, dst, dst_stride, width, - height); +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +rgb_to_bgr_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height) { + return intrinsiccv::sve2::rgb_to_bgr_u8_sc(src, src_stride, dst, dst_stride, + width, height); } -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void rgba_to_bgra_u8( - const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, - size_t width, size_t height) { - intrinsiccv::sve2::rgba_to_bgra_u8_sc(src, src_stride, dst, dst_stride, width, - height); +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +rgba_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height) { + return intrinsiccv::sve2::rgba_to_bgra_u8_sc(src, src_stride, dst, dst_stride, + width, height); } -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void rgb_to_bgra_u8( - const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, - size_t width, size_t height) { - intrinsiccv::sve2::rgb_to_bgra_u8_sc(src, src_stride, dst, dst_stride, width, - height); +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +rgb_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height) { + return intrinsiccv::sve2::rgb_to_bgra_u8_sc(src, src_stride, dst, dst_stride, + width, height); } -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void rgb_to_rgba_u8( - const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, - size_t width, size_t height) { - intrinsiccv::sve2::rgb_to_rgba_u8_sc(src, src_stride, dst, dst_stride, width, - height); +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +rgb_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height) { + return intrinsiccv::sve2::rgb_to_rgba_u8_sc(src, src_stride, dst, dst_stride, + width, height); } -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void rgba_to_bgr_u8( - const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, - size_t width, size_t height) { - intrinsiccv::sve2::rgba_to_bgr_u8_sc(src, src_stride, dst, dst_stride, width, - height); +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +rgba_to_bgr_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height) { + return intrinsiccv::sve2::rgba_to_bgr_u8_sc(src, src_stride, dst, dst_stride, + width, height); } -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void rgba_to_rgb_u8( - const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, - size_t width, size_t height) { - intrinsiccv::sve2::rgba_to_rgb_u8_sc(src, src_stride, dst, dst_stride, width, - height); +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +rgba_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height) { + return intrinsiccv::sve2::rgba_to_rgb_u8_sc(src, src_stride, dst, dst_stride, + width, height); } } // namespace intrinsiccv::sme2 diff --git a/intrinsiccv/src/conversions/rgb_to_rgb_sve2.cpp b/intrinsiccv/src/conversions/rgb_to_rgb_sve2.cpp index fe9e695d8f4c988d9e88adecb6c6b967254a19dd..70ddbe506d4d05aa127ab1f5b97443c7d8e14c66 100644 --- a/intrinsiccv/src/conversions/rgb_to_rgb_sve2.cpp +++ b/intrinsiccv/src/conversions/rgb_to_rgb_sve2.cpp @@ -7,39 +7,43 @@ namespace intrinsiccv::sve2 { INTRINSICCV_TARGET_FN_ATTRS -void rgb_to_bgr_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height) { - rgb_to_bgr_u8_sc(src, src_stride, dst, dst_stride, width, height); +intrinsiccv_error_t rgb_to_bgr_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, size_t width, + size_t height) { + return rgb_to_bgr_u8_sc(src, src_stride, dst, dst_stride, width, height); } INTRINSICCV_TARGET_FN_ATTRS -void rgba_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height) { - rgba_to_bgra_u8_sc(src, src_stride, dst, dst_stride, width, height); +intrinsiccv_error_t rgba_to_bgra_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height) { + return rgba_to_bgra_u8_sc(src, src_stride, dst, dst_stride, width, height); } -INTRINSICCV_TARGET_FN_ATTRS -void rgb_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height) { - rgb_to_bgra_u8_sc(src, src_stride, dst, dst_stride, width, height); +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +rgb_to_bgra_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height) { + return rgb_to_bgra_u8_sc(src, src_stride, dst, dst_stride, width, height); } -INTRINSICCV_TARGET_FN_ATTRS -void rgb_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height) { - rgb_to_rgba_u8_sc(src, src_stride, dst, dst_stride, width, height); +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +rgb_to_rgba_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height) { + return rgb_to_rgba_u8_sc(src, src_stride, dst, dst_stride, width, height); } INTRINSICCV_TARGET_FN_ATTRS -void rgba_to_bgr_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height) { - rgba_to_bgr_u8_sc(src, src_stride, dst, dst_stride, width, height); +intrinsiccv_error_t rgba_to_bgr_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height) { + return rgba_to_bgr_u8_sc(src, src_stride, dst, dst_stride, width, height); } INTRINSICCV_TARGET_FN_ATTRS -void rgba_to_rgb_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height) { - rgba_to_rgb_u8_sc(src, src_stride, dst, dst_stride, width, height); +intrinsiccv_error_t rgba_to_rgb_u8(const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, + size_t width, size_t height) { + return rgba_to_rgb_u8_sc(src, src_stride, dst, dst_stride, width, height); } } // namespace intrinsiccv::sve2 diff --git a/intrinsiccv/src/conversions/split_api.cpp b/intrinsiccv/src/conversions/split_api.cpp index 715a0e7bb19fba1203c02036a47b874fe121665b..d647c961b67318cb923ce0d0bf3a5d367ec02852 100644 --- a/intrinsiccv/src/conversions/split_api.cpp +++ b/intrinsiccv/src/conversions/split_api.cpp @@ -9,7 +9,7 @@ namespace intrinsiccv { INTRINSICCV_MULTIVERSION_C_API(intrinsiccv_split, intrinsiccv::neon::split, - nullptr, nullptr, void, const void *src_data, + nullptr, nullptr, const void *src_data, size_t src_stride, void **dst_data, const size_t *dst_strides, size_t width, size_t height, size_t channels, diff --git a/intrinsiccv/src/conversions/split_neon.cpp b/intrinsiccv/src/conversions/split_neon.cpp index df7ec9bf3e56931eb5f1c601cae4254677fa8adc..bdd9620d6271e5bf15e2c85ded1be5333c0582ef 100644 --- a/intrinsiccv/src/conversions/split_neon.cpp +++ b/intrinsiccv/src/conversions/split_neon.cpp @@ -253,9 +253,9 @@ class Split4 final : public UnrollTwice { #endif template -void split(const void *src_data, const size_t src_stride, void **dst_data, - const size_t *dst_strides, size_t width, size_t height, - size_t channels) { +intrinsiccv_error_t split(const void *src_data, const size_t src_stride, + void **dst_data, const size_t *dst_strides, + size_t width, size_t height, size_t channels) { Rectangle rect{width, height}; ScalarType *dst0 = reinterpret_cast(dst_data[0]), *dst1 = reinterpret_cast(dst_data[1]); @@ -288,12 +288,14 @@ void split(const void *src_data, const size_t src_stride, void **dst_data, default: __builtin_trap(); } + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -void split(const void *src_data, size_t src_stride, void **dst_data, - const size_t *dst_strides, size_t width, size_t height, - size_t channels, size_t element_size) { +intrinsiccv_error_t split(const void *src_data, size_t src_stride, + void **dst_data, const size_t *dst_strides, + size_t width, size_t height, size_t channels, + size_t element_size) { switch (element_size) { default: case sizeof(uint8_t): @@ -316,5 +318,6 @@ void split(const void *src_data, size_t src_stride, void **dst_data, height, channels); break; } + return INTRINSICCV_OK; } } // namespace intrinsiccv::neon diff --git a/intrinsiccv/src/conversions/yuv_to_rgb_api.cpp b/intrinsiccv/src/conversions/yuv_to_rgb_api.cpp index 536a2c3a2eab1ee228544254733208355209d528..493d078a9e9bf83f6402b8995f09c5b218e40c40 100644 --- a/intrinsiccv/src/conversions/yuv_to_rgb_api.cpp +++ b/intrinsiccv/src/conversions/yuv_to_rgb_api.cpp @@ -11,7 +11,7 @@ namespace intrinsiccv { #define INTRINSICCV_DEFINE_C_API(name, partialname) \ INTRINSICCV_MULTIVERSION_C_API( \ name, intrinsiccv::neon::partialname, intrinsiccv::sve2::partialname, \ - intrinsiccv::sme2::partialname, void, const uint8_t *, size_t, \ + intrinsiccv::sme2::partialname, const uint8_t *, size_t, \ const uint8_t *, size_t, uint8_t *, size_t, size_t, size_t, bool) INTRINSICCV_DEFINE_C_API(intrinsiccv_yuv_sp_to_rgb_u8, yuv_sp_to_rgb_u8); diff --git a/intrinsiccv/src/conversions/yuv_to_rgb_neon.cpp b/intrinsiccv/src/conversions/yuv_to_rgb_neon.cpp index d62006dee0f4c1fe35fa29720098d561e3b24e2c..7ad86c3a2e808275674e9d966c520a8db3cdf2e0 100644 --- a/intrinsiccv/src/conversions/yuv_to_rgb_neon.cpp +++ b/intrinsiccv/src/conversions/yuv_to_rgb_neon.cpp @@ -288,10 +288,10 @@ using YUVSpToBGR = YUVSpToRGBxOrBGRx; using YUVSpToBGRA = YUVSpToRGBxOrBGRx; template -void yuv2rgbx_operation(OperationType &operation, const ScalarType *src_y, - size_t src_y_stride, const ScalarType *src_uv, - size_t src_uv_stride, ScalarType *dst, - size_t dst_stride, size_t width, size_t height) { +intrinsiccv_error_t yuv2rgbx_operation( + OperationType &operation, const ScalarType *src_y, size_t src_y_stride, + const ScalarType *src_uv, size_t src_uv_stride, ScalarType *dst, + size_t dst_stride, size_t width, size_t height) { Rectangle rect{width, height}; ParallelRows y_rows{src_y, src_y_stride}; Rows uv_rows{src_uv, src_uv_stride}; @@ -305,46 +305,46 @@ void yuv2rgbx_operation(OperationType &operation, const ScalarType *src_y, RowBasedOperation row_based_operation{parallel_rows_adapter}; row_based_operation.try_avoid_tail_loop(); zip_parallel_rows(row_based_operation, rect, y_rows, uv_rows, rgbx_rows); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -void yuv_sp_to_rgb_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - bool is_nv21) { +intrinsiccv_error_t yuv_sp_to_rgb_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21) { YUVSpToRGB operation{is_nv21}; - yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, src_uv_stride, dst, - dst_stride, width, height); + return yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, + src_uv_stride, dst, dst_stride, width, height); } INTRINSICCV_TARGET_FN_ATTRS -void yuv_sp_to_rgba_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, bool is_nv21) { +intrinsiccv_error_t yuv_sp_to_rgba_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21) { YUVSpToRGBA operation{is_nv21}; - yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, src_uv_stride, dst, - dst_stride, width, height); + return yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, + src_uv_stride, dst, dst_stride, width, height); } - -INTRINSICCV_TARGET_FN_ATTRS -void yuv_sp_to_bgr_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - bool is_nv21) { +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +yuv_sp_to_bgr_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height, bool is_nv21) { YUVSpToBGR operation{is_nv21}; - yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, src_uv_stride, dst, - dst_stride, width, height); + return yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, + src_uv_stride, dst, dst_stride, width, height); } -INTRINSICCV_TARGET_FN_ATTRS -void yuv_sp_to_bgra_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, bool is_nv21) { +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t yuv_sp_to_bgra_u8( + const uint8_t *src_y, size_t src_y_stride, const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, size_t dst_stride, size_t width, + size_t height, bool is_nv21) { YUVSpToBGRA operation{is_nv21}; - yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, src_uv_stride, dst, - dst_stride, width, height); + return yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, + src_uv_stride, dst, dst_stride, width, height); } } // namespace intrinsiccv::neon diff --git a/intrinsiccv/src/conversions/yuv_to_rgb_sc.h b/intrinsiccv/src/conversions/yuv_to_rgb_sc.h index e81ac51e09ccb22a3a177e846ae6b5a395a2c832..e0580b6ba0bffe26b2cb8baf8ca456a2c42a307b 100644 --- a/intrinsiccv/src/conversions/yuv_to_rgb_sc.h +++ b/intrinsiccv/src/conversions/yuv_to_rgb_sc.h @@ -188,11 +188,11 @@ using YUVSpToBGR = YUVSpToRGBxOrBGRx; using YUVSpToBGRA = YUVSpToRGBxOrBGRx; template -void yuv2rgbx_operation(OperationType &operation, const ScalarType *src_y, - size_t src_y_stride, const ScalarType *src_uv, - size_t src_uv_stride, ScalarType *dst, - size_t dst_stride, size_t width, - size_t height) INTRINSICCV_STREAMING_COMPATIBLE { +intrinsiccv_error_t yuv2rgbx_operation( + OperationType &operation, const ScalarType *src_y, size_t src_y_stride, + const ScalarType *src_uv, size_t src_uv_stride, ScalarType *dst, + size_t dst_stride, size_t width, + size_t height) INTRINSICCV_STREAMING_COMPATIBLE { Rectangle rect{width, height}; ParallelRows y_rows{src_y, src_y_stride}; Rows uv_rows{src_uv, src_uv_stride}; @@ -205,48 +205,47 @@ void yuv2rgbx_operation(OperationType &operation, const ScalarType *src_y, ParallelRowsAdapter parallel_rows_adapter{context_adapter}; RowBasedOperation row_based_operation{parallel_rows_adapter}; zip_parallel_rows(row_based_operation, rect, y_rows, uv_rows, rgbx_rows); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -static void yuv_sp_to_rgb_u8_sc(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, - bool is_nv21) INTRINSICCV_STREAMING_COMPATIBLE { +static intrinsiccv_error_t yuv_sp_to_rgb_u8_sc( + const uint8_t *src_y, size_t src_y_stride, const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, size_t dst_stride, size_t width, + size_t height, bool is_nv21) INTRINSICCV_STREAMING_COMPATIBLE { YUVSpToRGB operation{is_nv21}; - yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, src_uv_stride, dst, - dst_stride, width, height); + return yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, + src_uv_stride, dst, dst_stride, width, height); } INTRINSICCV_TARGET_FN_ATTRS -static void yuv_sp_to_rgba_u8_sc( +static intrinsiccv_error_t yuv_sp_to_rgba_u8_sc( const uint8_t *src_y, size_t src_y_stride, const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, size_t dst_stride, size_t width, size_t height, bool is_nv21) INTRINSICCV_STREAMING_COMPATIBLE { YUVSpToRGBA operation{is_nv21}; - yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, src_uv_stride, dst, - dst_stride, width, height); + return yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, + src_uv_stride, dst, dst_stride, width, height); } INTRINSICCV_TARGET_FN_ATTRS -static void yuv_sp_to_bgr_u8_sc(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, - bool is_nv21) INTRINSICCV_STREAMING_COMPATIBLE { +static intrinsiccv_error_t yuv_sp_to_bgr_u8_sc( + const uint8_t *src_y, size_t src_y_stride, const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, size_t dst_stride, size_t width, + size_t height, bool is_nv21) INTRINSICCV_STREAMING_COMPATIBLE { YUVSpToBGR operation{is_nv21}; - yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, src_uv_stride, dst, - dst_stride, width, height); + return yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, + src_uv_stride, dst, dst_stride, width, height); } INTRINSICCV_TARGET_FN_ATTRS -static void yuv_sp_to_bgra_u8_sc( +static intrinsiccv_error_t yuv_sp_to_bgra_u8_sc( const uint8_t *src_y, size_t src_y_stride, const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, size_t dst_stride, size_t width, size_t height, bool is_nv21) INTRINSICCV_STREAMING_COMPATIBLE { YUVSpToBGRA operation{is_nv21}; - yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, src_uv_stride, dst, - dst_stride, width, height); + return yuv2rgbx_operation(operation, src_y, src_y_stride, src_uv, + src_uv_stride, dst, dst_stride, width, height); } } // namespace intrinsiccv::sve2 diff --git a/intrinsiccv/src/conversions/yuv_to_rgb_sme2.cpp b/intrinsiccv/src/conversions/yuv_to_rgb_sme2.cpp index 8b1cb889e33a03dd9a0645c1dd2546149e26804a..b418106d174db54e3d83974c720076b9a9290549 100644 --- a/intrinsiccv/src/conversions/yuv_to_rgb_sme2.cpp +++ b/intrinsiccv/src/conversions/yuv_to_rgb_sme2.cpp @@ -6,42 +6,42 @@ namespace intrinsiccv::sme2 { -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void yuv_sp_to_rgb_u8( - const uint8_t *src_y, size_t src_y_stride, const uint8_t *src_uv, - size_t src_uv_stride, uint8_t *dst, size_t dst_stride, size_t width, - size_t height, bool is_nv21) { - intrinsiccv::sve2::yuv_sp_to_rgb_u8_sc(src_y, src_y_stride, src_uv, - src_uv_stride, dst, dst_stride, width, - height, is_nv21); +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +yuv_sp_to_rgb_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height, bool is_nv21) { + return intrinsiccv::sve2::yuv_sp_to_rgb_u8_sc(src_y, src_y_stride, src_uv, + src_uv_stride, dst, dst_stride, + width, height, is_nv21); } -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t yuv_sp_to_rgba_u8(const uint8_t *src_y, size_t src_y_stride, const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, size_t dst_stride, size_t width, size_t height, bool is_nv21) { - intrinsiccv::sve2::yuv_sp_to_rgba_u8_sc(src_y, src_y_stride, src_uv, - src_uv_stride, dst, dst_stride, width, - height, is_nv21); + return intrinsiccv::sve2::yuv_sp_to_rgba_u8_sc(src_y, src_y_stride, src_uv, + src_uv_stride, dst, dst_stride, + width, height, is_nv21); } -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void yuv_sp_to_bgr_u8( - const uint8_t *src_y, size_t src_y_stride, const uint8_t *src_uv, - size_t src_uv_stride, uint8_t *dst, size_t dst_stride, size_t width, - size_t height, bool is_nv21) { - intrinsiccv::sve2::yuv_sp_to_bgr_u8_sc(src_y, src_y_stride, src_uv, - src_uv_stride, dst, dst_stride, width, - height, is_nv21); +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +yuv_sp_to_bgr_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height, bool is_nv21) { + return intrinsiccv::sve2::yuv_sp_to_bgr_u8_sc(src_y, src_y_stride, src_uv, + src_uv_stride, dst, dst_stride, + width, height, is_nv21); } -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t yuv_sp_to_bgra_u8(const uint8_t *src_y, size_t src_y_stride, const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, size_t dst_stride, size_t width, size_t height, bool is_nv21) { - intrinsiccv::sve2::yuv_sp_to_bgra_u8_sc(src_y, src_y_stride, src_uv, - src_uv_stride, dst, dst_stride, width, - height, is_nv21); + return intrinsiccv::sve2::yuv_sp_to_bgra_u8_sc(src_y, src_y_stride, src_uv, + src_uv_stride, dst, dst_stride, + width, height, is_nv21); } } // namespace intrinsiccv::sme2 diff --git a/intrinsiccv/src/conversions/yuv_to_rgb_sve2.cpp b/intrinsiccv/src/conversions/yuv_to_rgb_sve2.cpp index c15e94e0dca04287b214394a186afa1af591f7f4..9a0e22376bf7cbcc3db1e4e523fc2a373d26b7f2 100644 --- a/intrinsiccv/src/conversions/yuv_to_rgb_sve2.cpp +++ b/intrinsiccv/src/conversions/yuv_to_rgb_sve2.cpp @@ -7,39 +7,39 @@ namespace intrinsiccv::sve2 { INTRINSICCV_TARGET_FN_ATTRS -void yuv_sp_to_rgb_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - bool is_nv21) { - yuv_sp_to_rgb_u8_sc(src_y, src_y_stride, src_uv, src_uv_stride, dst, - dst_stride, width, height, is_nv21); +intrinsiccv_error_t yuv_sp_to_rgb_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21) { + return yuv_sp_to_rgb_u8_sc(src_y, src_y_stride, src_uv, src_uv_stride, dst, + dst_stride, width, height, is_nv21); } INTRINSICCV_TARGET_FN_ATTRS -void yuv_sp_to_rgba_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, bool is_nv21) { - yuv_sp_to_rgba_u8_sc(src_y, src_y_stride, src_uv, src_uv_stride, dst, - dst_stride, width, height, is_nv21); +intrinsiccv_error_t yuv_sp_to_rgba_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, + size_t height, bool is_nv21) { + return yuv_sp_to_rgba_u8_sc(src_y, src_y_stride, src_uv, src_uv_stride, dst, + dst_stride, width, height, is_nv21); } -INTRINSICCV_TARGET_FN_ATTRS -void yuv_sp_to_bgr_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - bool is_nv21) { - yuv_sp_to_bgr_u8_sc(src_y, src_y_stride, src_uv, src_uv_stride, dst, - dst_stride, width, height, is_nv21); +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +yuv_sp_to_bgr_u8(const uint8_t *src_y, size_t src_y_stride, + const uint8_t *src_uv, size_t src_uv_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height, bool is_nv21) { + return yuv_sp_to_bgr_u8_sc(src_y, src_y_stride, src_uv, src_uv_stride, dst, + dst_stride, width, height, is_nv21); } -INTRINSICCV_TARGET_FN_ATTRS -void yuv_sp_to_bgra_u8(const uint8_t *src_y, size_t src_y_stride, - const uint8_t *src_uv, size_t src_uv_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, bool is_nv21) { - yuv_sp_to_bgra_u8_sc(src_y, src_y_stride, src_uv, src_uv_stride, dst, - dst_stride, width, height, is_nv21); +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t yuv_sp_to_bgra_u8( + const uint8_t *src_y, size_t src_y_stride, const uint8_t *src_uv, + size_t src_uv_stride, uint8_t *dst, size_t dst_stride, size_t width, + size_t height, bool is_nv21) { + return yuv_sp_to_bgra_u8_sc(src_y, src_y_stride, src_uv, src_uv_stride, dst, + dst_stride, width, height, is_nv21); } } // namespace intrinsiccv::sve2 diff --git a/intrinsiccv/src/filters/gaussian_blur_api.cpp b/intrinsiccv/src/filters/gaussian_blur_api.cpp index a474889d59f43965e12f9be59b9460d73f19cdd7..c76796c70326deaeddf34f095ac8fa5b67581c2f 100644 --- a/intrinsiccv/src/filters/gaussian_blur_api.cpp +++ b/intrinsiccv/src/filters/gaussian_blur_api.cpp @@ -11,21 +11,22 @@ namespace intrinsiccv { extern "C" { -intrinsiccv_filter_params_t *intrinsiccv_filter_create( +intrinsiccv_error_t intrinsiccv_filter_create( intrinsiccv_filter_params_t *params, intrinsiccv_rectangle_t image) { auto workspace = SeparableFilterWorkspace::create( Rectangle{image}, params->channels, params->type_size); if (!workspace) { - return nullptr; + return INTRINSICCV_ERROR_ALLOCATION; } params->workspace = reinterpret_cast(workspace.release()); - return params; + return INTRINSICCV_OK; } -void intrinsiccv_filter_release(intrinsiccv_filter_params_t *params) { +intrinsiccv_error_t intrinsiccv_filter_release( + intrinsiccv_filter_params_t *params) { if (!params->workspace) { - return; + return INTRINSICCV_ERROR_NULL_POINTER; } // Deliberately create and immediately destroy a unique_ptr to delete the @@ -35,23 +36,23 @@ void intrinsiccv_filter_release(intrinsiccv_filter_params_t *params) { reinterpret_cast(params->workspace)}; // NOLINTEND(bugprone-unused-raii) params->workspace = nullptr; + return INTRINSICCV_OK; } } // extern "C" INTRINSICCV_MULTIVERSION_C_API(intrinsiccv_gaussian_blur_3x3_u8, intrinsiccv::neon::gaussian_blur_3x3_u8, nullptr, - nullptr, void, const uint8_t *src, - size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - size_t channels, + nullptr, const uint8_t *src, size_t src_stride, + uint8_t *dst, size_t dst_stride, size_t width, + size_t height, size_t channels, intrinsiccv_border_type_t border_type, const intrinsiccv_filter_params_t *params); INTRINSICCV_MULTIVERSION_C_API( intrinsiccv_gaussian_blur_5x5_u8, intrinsiccv::neon::gaussian_blur_5x5_u8, INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::gaussian_blur_5x5_u8), - intrinsiccv::sme2::gaussian_blur_5x5_u8, void, const uint8_t *src, + intrinsiccv::sme2::gaussian_blur_5x5_u8, const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, size_t height, size_t channels, intrinsiccv_border_type_t border_type, const intrinsiccv_filter_params_t *params); diff --git a/intrinsiccv/src/filters/gaussian_blur_neon.cpp b/intrinsiccv/src/filters/gaussian_blur_neon.cpp index 7e8e24badbf908ddf4e5a9da96b96a728632b6ee..ce8ff4e9f9ed5ce2ced0dd817333cb67d6b708e9 100644 --- a/intrinsiccv/src/filters/gaussian_blur_neon.cpp +++ b/intrinsiccv/src/filters/gaussian_blur_neon.cpp @@ -143,11 +143,11 @@ class DiscreteGaussianBlur { }; // end of class DiscreteGaussianBlur template -void discrete_gaussian_blur(const ScalarType *src, size_t src_stride, - ScalarType *dst, size_t dst_stride, size_t width, - size_t height, size_t channels, - intrinsiccv_border_type_t border_type, - const intrinsiccv_filter_params_t *params) { +intrinsiccv_error_t discrete_gaussian_blur( + const ScalarType *src, size_t src_stride, ScalarType *dst, + size_t dst_stride, size_t width, size_t height, size_t channels, + intrinsiccv_border_type_t border_type, + const intrinsiccv_filter_params_t *params) { using GaussianBlurFilterType = DiscreteGaussianBlur; Rectangle rect{width, height}; @@ -160,26 +160,29 @@ void discrete_gaussian_blur(const ScalarType *src, size_t src_stride, GaussianBlurFilterType blur; SeparableFilter filter{blur}; workspace->process(rect, src_rows, dst_rows, channels, border_type, filter); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -void gaussian_blur_3x3_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - size_t channels, - intrinsiccv_border_type_t border_type, - const intrinsiccv_filter_params_t *params) { +intrinsiccv_error_t gaussian_blur_3x3_u8( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height, size_t channels, + intrinsiccv_border_type_t border_type, + const intrinsiccv_filter_params_t *params) { discrete_gaussian_blur(src, src_stride, dst, dst_stride, width, height, channels, border_type, params); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -void gaussian_blur_5x5_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - size_t channels, - intrinsiccv_border_type_t border_type, - const intrinsiccv_filter_params_t *params) { +intrinsiccv_error_t gaussian_blur_5x5_u8( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height, size_t channels, + intrinsiccv_border_type_t border_type, + const intrinsiccv_filter_params_t *params) { discrete_gaussian_blur(src, src_stride, dst, dst_stride, width, height, channels, border_type, params); + return INTRINSICCV_OK; } } // namespace intrinsiccv::neon diff --git a/intrinsiccv/src/filters/gaussian_blur_sc.h b/intrinsiccv/src/filters/gaussian_blur_sc.h index c31319deaac9e24629395b572903282c9172da0e..738ab70c27cbd63ad5494ed3281b632bf5318e74 100644 --- a/intrinsiccv/src/filters/gaussian_blur_sc.h +++ b/intrinsiccv/src/filters/gaussian_blur_sc.h @@ -83,11 +83,11 @@ class DiscreteGaussianBlur { }; // end of class DiscreteGaussianBlur template -void discrete_gaussian_blur(const ScalarType *src, size_t src_stride, - ScalarType *dst, size_t dst_stride, size_t width, - size_t height, size_t channels, - intrinsiccv_border_type_t border_type, - const intrinsiccv_filter_params_t *params) +intrinsiccv_error_t discrete_gaussian_blur( + const ScalarType *src, size_t src_stride, ScalarType *dst, + size_t dst_stride, size_t width, size_t height, size_t channels, + intrinsiccv_border_type_t border_type, + const intrinsiccv_filter_params_t *params) INTRINSICCV_STREAMING_COMPATIBLE { using GaussianBlurFilterType = DiscreteGaussianBlur; @@ -101,6 +101,7 @@ void discrete_gaussian_blur(const ScalarType *src, size_t src_stride, GaussianBlurFilterType blur; SeparableFilter filter{blur}; workspace->process(rect, src_rows, dst_rows, channels, border_type, filter); + return INTRINSICCV_OK; } } // namespace intrinsiccv::sve2 diff --git a/intrinsiccv/src/filters/gaussian_blur_sme2.cpp b/intrinsiccv/src/filters/gaussian_blur_sme2.cpp index ccd474a9be7644f24fdab1410307b4fa86aade40..e68052bf26a377eb476dd5d3e8ad2de1fdb72d73 100644 --- a/intrinsiccv/src/filters/gaussian_blur_sme2.cpp +++ b/intrinsiccv/src/filters/gaussian_blur_sme2.cpp @@ -7,14 +7,14 @@ namespace intrinsiccv::sme2 { -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t gaussian_blur_5x5_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, size_t height, size_t channels, intrinsiccv_border_type_t border_type, const intrinsiccv_filter_params_t *params) { - sve2::discrete_gaussian_blur(src, src_stride, dst, dst_stride, - width, height, channels, border_type, - params); + return sve2::discrete_gaussian_blur( + src, src_stride, dst, dst_stride, width, height, channels, border_type, + params); } } // namespace intrinsiccv::sme2 diff --git a/intrinsiccv/src/filters/gaussian_blur_sve2.cpp b/intrinsiccv/src/filters/gaussian_blur_sve2.cpp index f0444df235a047a1c46442d3edef720d1c104e04..4106f5b7d0de7e82981f09f724414b6471c93cfc 100644 --- a/intrinsiccv/src/filters/gaussian_blur_sve2.cpp +++ b/intrinsiccv/src/filters/gaussian_blur_sve2.cpp @@ -8,13 +8,14 @@ namespace intrinsiccv::sve2 { INTRINSICCV_TARGET_FN_ATTRS -void gaussian_blur_5x5_u8(const uint8_t *src, size_t src_stride, uint8_t *dst, - size_t dst_stride, size_t width, size_t height, - size_t channels, - intrinsiccv_border_type_t border_type, - const intrinsiccv_filter_params_t *params) { - discrete_gaussian_blur(src, src_stride, dst, dst_stride, width, - height, channels, border_type, params); +intrinsiccv_error_t gaussian_blur_5x5_u8( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height, size_t channels, + intrinsiccv_border_type_t border_type, + const intrinsiccv_filter_params_t *params) { + return discrete_gaussian_blur(src, src_stride, dst, dst_stride, + width, height, channels, + border_type, params); } } // namespace intrinsiccv::sve2 diff --git a/intrinsiccv/src/filters/sobel_api.cpp b/intrinsiccv/src/filters/sobel_api.cpp index 78c843993523ff227369cbaa6b4391208c45ecc4..4411e74a3041e33b5cf1894c2d1e1d65bb9c51ab 100644 --- a/intrinsiccv/src/filters/sobel_api.cpp +++ b/intrinsiccv/src/filters/sobel_api.cpp @@ -8,13 +8,13 @@ namespace intrinsiccv { -#define INTRINSICCV_DEFINE_C_API(name, partialname) \ - INTRINSICCV_MULTIVERSION_C_API( \ - name, intrinsiccv::neon::partialname, \ - INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::partialname), \ - intrinsiccv::sme2::partialname, void, const uint8_t *src, \ - size_t src_stride, int16_t *dst, size_t dst_stride, size_t width, \ - size_t height, size_t channels) +#define INTRINSICCV_DEFINE_C_API(name, partialname) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::partialname, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::partialname), \ + intrinsiccv::sme2::partialname, const uint8_t *src, size_t src_stride, \ + int16_t *dst, size_t dst_stride, size_t width, size_t height, \ + size_t channels) INTRINSICCV_DEFINE_C_API(intrinsiccv_sobel_3x3_horizontal_s16_u8, sobel_3x3_horizontal_s16_u8); diff --git a/intrinsiccv/src/filters/sobel_neon.cpp b/intrinsiccv/src/filters/sobel_neon.cpp index 8a6df5a30503a9ae343444262db8738e0d0a1fdc..fbaf520194c31a6e6cad4ec66699634a57f1b779 100644 --- a/intrinsiccv/src/filters/sobel_neon.cpp +++ b/intrinsiccv/src/filters/sobel_neon.cpp @@ -123,9 +123,11 @@ class VerticalSobel3x3 { }; // end of class VerticalSobel3x3 INTRINSICCV_TARGET_FN_ATTRS -void sobel_3x3_horizontal_s16_u8(const uint8_t *src, size_t src_stride, - int16_t *dst, size_t dst_stride, size_t width, - size_t height, size_t channels) { +intrinsiccv_error_t sobel_3x3_horizontal_s16_u8(const uint8_t *src, + size_t src_stride, int16_t *dst, + size_t dst_stride, size_t width, + size_t height, + size_t channels) { Rectangle rect{width, height}; Rows src_rows{src, src_stride, channels}; Rows dst_rows{dst, dst_stride, channels}; @@ -133,19 +135,21 @@ void sobel_3x3_horizontal_s16_u8(const uint8_t *src, size_t src_stride, auto workspace = SeparableFilterWorkspace::create(rect, channels, sizeof(int16_t)); if (!workspace) { - return; + return INTRINSICCV_ERROR_ALLOCATION; } HorizontalSobel3x3 horizontal_sobel; SeparableFilter3x3> filter{horizontal_sobel}; workspace->process(rect, src_rows, dst_rows, channels, INTRINSICCV_BORDER_TYPE_REPLICATE, filter); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -void sobel_3x3_vertical_s16_u8(const uint8_t *src, size_t src_stride, - int16_t *dst, size_t dst_stride, size_t width, - size_t height, size_t channels) { +intrinsiccv_error_t sobel_3x3_vertical_s16_u8(const uint8_t *src, + size_t src_stride, int16_t *dst, + size_t dst_stride, size_t width, + size_t height, size_t channels) { Rectangle rect{width, height}; Rows src_rows{src, src_stride, channels}; Rows dst_rows{dst, dst_stride, channels}; @@ -153,13 +157,14 @@ void sobel_3x3_vertical_s16_u8(const uint8_t *src, size_t src_stride, auto workspace = SeparableFilterWorkspace::create(rect, channels, sizeof(int16_t)); if (!workspace) { - return; + return INTRINSICCV_ERROR_ALLOCATION; } VerticalSobel3x3 vertical_sobel; SeparableFilter3x3> filter{vertical_sobel}; workspace->process(rect, src_rows, dst_rows, channels, INTRINSICCV_BORDER_TYPE_REPLICATE, filter); + return INTRINSICCV_OK; } } // namespace intrinsiccv::neon diff --git a/intrinsiccv/src/filters/sobel_sc.h b/intrinsiccv/src/filters/sobel_sc.h index 2273d232b979ca12616f250eb96b82c6cc531b09..47258922ddbd1e4069c414d9fcb09ee8f2240071 100644 --- a/intrinsiccv/src/filters/sobel_sc.h +++ b/intrinsiccv/src/filters/sobel_sc.h @@ -118,7 +118,7 @@ class VerticalSobel3x3 { }; // end of class VerticalSobel3x3 INTRINSICCV_TARGET_FN_ATTRS -static void sobel_3x3_horizontal_s16_u8_sc( +static intrinsiccv_error_t sobel_3x3_horizontal_s16_u8_sc( const uint8_t *src, size_t src_stride, int16_t *dst, size_t dst_stride, size_t width, size_t height, size_t channels) INTRINSICCV_STREAMING_COMPATIBLE { @@ -129,7 +129,7 @@ static void sobel_3x3_horizontal_s16_u8_sc( auto workspace = SeparableFilterWorkspace::create(rect, channels, sizeof(int16_t)); if (!workspace) { - return; + return INTRINSICCV_ERROR_ALLOCATION; } HorizontalSobel3x3 horizontal_sobel; @@ -137,10 +137,11 @@ static void sobel_3x3_horizontal_s16_u8_sc( horizontal_sobel}; workspace->process(rect, src_rows, dst_rows, channels, INTRINSICCV_BORDER_TYPE_REPLICATE, filter); + return INTRINSICCV_OK; } INTRINSICCV_TARGET_FN_ATTRS -static void sobel_3x3_vertical_s16_u8_sc( +static intrinsiccv_error_t sobel_3x3_vertical_s16_u8_sc( const uint8_t *src, size_t src_stride, int16_t *dst, size_t dst_stride, size_t width, size_t height, size_t channels) INTRINSICCV_STREAMING_COMPATIBLE { @@ -151,13 +152,14 @@ static void sobel_3x3_vertical_s16_u8_sc( auto workspace = SeparableFilterWorkspace::create(rect, channels, sizeof(int16_t)); if (!workspace) { - return; + return INTRINSICCV_ERROR_ALLOCATION; } VerticalSobel3x3 vertical_sobel; sve2::SeparableFilter3x3> filter{vertical_sobel}; workspace->process(rect, src_rows, dst_rows, channels, INTRINSICCV_BORDER_TYPE_REPLICATE, filter); + return INTRINSICCV_OK; } } // namespace intrinsiccv::sve2 diff --git a/intrinsiccv/src/filters/sobel_sme2.cpp b/intrinsiccv/src/filters/sobel_sme2.cpp index 2d973850c66284a7a38a08b9a1bc192971fa3899..3ccb16bafc8d7d1e6bce722214460eda63c8fd0f 100644 --- a/intrinsiccv/src/filters/sobel_sme2.cpp +++ b/intrinsiccv/src/filters/sobel_sme2.cpp @@ -6,19 +6,19 @@ namespace intrinsiccv::sme2 { -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t sobel_3x3_horizontal_s16_u8(const uint8_t *src, size_t src_stride, int16_t *dst, size_t dst_stride, size_t width, size_t height, size_t channels) { - intrinsiccv::sve2::sobel_3x3_horizontal_s16_u8_sc( + return intrinsiccv::sve2::sobel_3x3_horizontal_s16_u8_sc( src, src_stride, dst, dst_stride, width, height, channels); } -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t sobel_3x3_vertical_s16_u8(const uint8_t *src, size_t src_stride, int16_t *dst, size_t dst_stride, size_t width, size_t height, size_t channels) { - intrinsiccv::sve2::sobel_3x3_vertical_s16_u8_sc( + return intrinsiccv::sve2::sobel_3x3_vertical_s16_u8_sc( src, src_stride, dst, dst_stride, width, height, channels); } diff --git a/intrinsiccv/src/filters/sobel_sve2.cpp b/intrinsiccv/src/filters/sobel_sve2.cpp index bfa3185ac58227bab437c24e202e524662ac7085..7293b8a7c8e4f587bdddf9373a01651b214c3af9 100644 --- a/intrinsiccv/src/filters/sobel_sve2.cpp +++ b/intrinsiccv/src/filters/sobel_sve2.cpp @@ -6,18 +6,18 @@ namespace intrinsiccv::sve2 { -INTRINSICCV_TARGET_FN_ATTRS void sobel_3x3_horizontal_s16_u8( +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t sobel_3x3_horizontal_s16_u8( const uint8_t *src, size_t src_stride, int16_t *dst, size_t dst_stride, size_t width, size_t height, size_t channels) { - sobel_3x3_horizontal_s16_u8_sc(src, src_stride, dst, dst_stride, width, - height, channels); + return sobel_3x3_horizontal_s16_u8_sc(src, src_stride, dst, dst_stride, width, + height, channels); } -INTRINSICCV_TARGET_FN_ATTRS void sobel_3x3_vertical_s16_u8( +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t sobel_3x3_vertical_s16_u8( const uint8_t *src, size_t src_stride, int16_t *dst, size_t dst_stride, size_t width, size_t height, size_t channels) { - sobel_3x3_vertical_s16_u8_sc(src, src_stride, dst, dst_stride, width, height, - channels); + return sobel_3x3_vertical_s16_u8_sc(src, src_stride, dst, dst_stride, width, + height, channels); } } // namespace intrinsiccv::sve2 diff --git a/intrinsiccv/src/morphology/morphology_api.cpp b/intrinsiccv/src/morphology/morphology_api.cpp index 788965b51a65f0c9e0a5bc102ee306d7049ffb16..d59f3ebfe3ae66db44c93f98d25e6da9cbafc08b 100644 --- a/intrinsiccv/src/morphology/morphology_api.cpp +++ b/intrinsiccv/src/morphology/morphology_api.cpp @@ -11,64 +11,65 @@ namespace intrinsiccv { namespace neon { template -void dilate(const T *src, size_t src_stride, T *dst, size_t dst_stride, - size_t width, size_t height, - const intrinsiccv_morphology_params_t *params); +intrinsiccv_error_t dilate(const T *src, size_t src_stride, T *dst, + size_t dst_stride, size_t width, size_t height, + const intrinsiccv_morphology_params_t *params); template -void erode(const T *src, size_t src_stride, T *dst, size_t dst_stride, - size_t width, size_t height, - const intrinsiccv_morphology_params_t *params); +intrinsiccv_error_t erode(const T *src, size_t src_stride, T *dst, + size_t dst_stride, size_t width, size_t height, + const intrinsiccv_morphology_params_t *params); } // namespace neon namespace sve2 { template -void dilate(const T *src, size_t src_stride, T *dst, size_t dst_stride, - size_t width, size_t height, - const intrinsiccv_morphology_params_t *params); +intrinsiccv_error_t dilate(const T *src, size_t src_stride, T *dst, + size_t dst_stride, size_t width, size_t height, + const intrinsiccv_morphology_params_t *params); template -void erode(const T *src, size_t src_stride, T *dst, size_t dst_stride, - size_t width, size_t height, - const intrinsiccv_morphology_params_t *params); +intrinsiccv_error_t erode(const T *src, size_t src_stride, T *dst, + size_t dst_stride, size_t width, size_t height, + const intrinsiccv_morphology_params_t *params); } // namespace sve2 namespace sme2 { template -void dilate(const T *src, size_t src_stride, T *dst, size_t dst_stride, - size_t width, size_t height, - const intrinsiccv_morphology_params_t *params); +intrinsiccv_error_t dilate(const T *src, size_t src_stride, T *dst, + size_t dst_stride, size_t width, size_t height, + const intrinsiccv_morphology_params_t *params); template -void erode(const T *src, size_t src_stride, T *dst, size_t dst_stride, - size_t width, size_t height, - const intrinsiccv_morphology_params_t *params); +intrinsiccv_error_t erode(const T *src, size_t src_stride, T *dst, + size_t dst_stride, size_t width, size_t height, + const intrinsiccv_morphology_params_t *params); } // namespace sme2 extern "C" { -intrinsiccv_morphology_params_t *intrinsiccv_morphology_create( +intrinsiccv_error_t intrinsiccv_morphology_create( intrinsiccv_morphology_params_t *params, intrinsiccv_rectangle_t image) { auto workspace = MorphologyWorkspace::create(Rectangle{image}, Rectangle{params->kernel}, Margin{params->kernel, params->anchor}, params->channels, params->type_size); if (!workspace) { - return nullptr; + return INTRINSICCV_ERROR_ALLOCATION; } params->data = reinterpret_cast(workspace.release()); - return params; + return INTRINSICCV_OK; } -void intrinsiccv_morphology_release(intrinsiccv_morphology_params_t *params) { +intrinsiccv_error_t intrinsiccv_morphology_release( + intrinsiccv_morphology_params_t *params) { if (!params->data) { - return; + return INTRINSICCV_ERROR_NULL_POINTER; } // Deliberately create and immediately destroy a unique_ptr to delete the @@ -78,17 +79,18 @@ void intrinsiccv_morphology_release(intrinsiccv_morphology_params_t *params) { reinterpret_cast(params->data)}; // NOLINTEND(bugprone-unused-raii) params->data = nullptr; + return INTRINSICCV_OK; } } // extern "C" -#define INTRINSICCV_DEFINE_C_API(name, tname, type) \ - INTRINSICCV_MULTIVERSION_C_API( \ - name, intrinsiccv::neon::tname, \ - INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::tname), \ - intrinsiccv::sme2::tname, void, const type *src, \ - size_t src_stride, type *dst, size_t dst_stride, size_t width, \ - size_t height, const intrinsiccv_morphology_params_t *) +#define INTRINSICCV_DEFINE_C_API(name, tname, type) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::tname, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::tname), \ + intrinsiccv::sme2::tname, const type *src, size_t src_stride, \ + type *dst, size_t dst_stride, size_t width, size_t height, \ + const intrinsiccv_morphology_params_t *) INTRINSICCV_DEFINE_C_API(intrinsiccv_dilate_u8, dilate, uint8_t); INTRINSICCV_DEFINE_C_API(intrinsiccv_erode_u8, erode, uint8_t); diff --git a/intrinsiccv/src/morphology/morphology_neon.cpp b/intrinsiccv/src/morphology/morphology_neon.cpp index a0850a8a708d2d166bd64479fc92a7d094de37e6..a358c0ffce5014db8521cc1b20284c5925411302 100644 --- a/intrinsiccv/src/morphology/morphology_neon.cpp +++ b/intrinsiccv/src/morphology/morphology_neon.cpp @@ -487,9 +487,9 @@ class DilateOperation final { }; // end of class DilateOperation template -void dilate(const T *src, size_t src_stride, T *dst, size_t dst_stride, - size_t width, size_t height, - const intrinsiccv_morphology_params_t *params) { +intrinsiccv_error_t dilate(const T *src, size_t src_stride, T *dst, + size_t dst_stride, size_t width, size_t height, + const intrinsiccv_morphology_params_t *params) { Rectangle rect{width, height}; Rectangle kernel{params->kernel}; Rows src_rows{src, src_stride, params->channels}; @@ -508,6 +508,7 @@ void dilate(const T *src, size_t src_stride, T *dst, size_t dst_stride, // Update source for the next iteration. current_src_rows = dst_rows; } + return INTRINSICCV_OK; } // Helper structure for erode. @@ -537,9 +538,9 @@ class ErodeOperation final { }; // end of class ErodeOperation template -void erode(const T *src, size_t src_stride, T *dst, size_t dst_stride, - size_t width, size_t height, - const intrinsiccv_morphology_params_t *params) { +intrinsiccv_error_t erode(const T *src, size_t src_stride, T *dst, + size_t dst_stride, size_t width, size_t height, + const intrinsiccv_morphology_params_t *params) { Rectangle rect{width, height}; Rectangle kernel{params->kernel}; Rows src_rows{src, src_stride, params->channels}; @@ -558,10 +559,11 @@ void erode(const T *src, size_t src_stride, T *dst, size_t dst_stride, // Update source for the next iteration. current_src_rows = dst_rows; } + return INTRINSICCV_OK; } #define INTRINSICCV_INSTANTIATE_TEMPLATE(name, type) \ - template INTRINSICCV_TARGET_FN_ATTRS void name( \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t name( \ const type *src, size_t src_stride, type *dst, size_t dst_stride, \ size_t width, size_t height, \ const intrinsiccv_morphology_params_t *params) diff --git a/intrinsiccv/src/morphology/morphology_sc.h b/intrinsiccv/src/morphology/morphology_sc.h index 40112c02dc019bd9f4a029b82b831398767629ec..a6ed84a9ff91683cc48563e48bd04feb4ea32c9a 100644 --- a/intrinsiccv/src/morphology/morphology_sc.h +++ b/intrinsiccv/src/morphology/morphology_sc.h @@ -448,9 +448,9 @@ class DilateOperation final { }; // end of class DilateOperation template -static inline void dilate_sc(const T *src, size_t src_stride, T *dst, - size_t dst_stride, size_t width, size_t height, - const intrinsiccv_morphology_params_t *params) +static inline intrinsiccv_error_t dilate_sc( + const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width, + size_t height, const intrinsiccv_morphology_params_t *params) INTRINSICCV_STREAMING_COMPATIBLE { Rectangle rect{width, height}; Rectangle kernel{params->kernel}; @@ -470,6 +470,7 @@ static inline void dilate_sc(const T *src, size_t src_stride, T *dst, // Update source for the next iteration. current_src_rows = dst_rows; } + return INTRINSICCV_OK; } // Helper structure for erode. @@ -502,9 +503,9 @@ class ErodeOperation final { }; // end of class ErodeOperation template -static inline void erode_sc(const T *src, size_t src_stride, T *dst, - size_t dst_stride, size_t width, size_t height, - const intrinsiccv_morphology_params_t *params) +static inline intrinsiccv_error_t erode_sc( + const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width, + size_t height, const intrinsiccv_morphology_params_t *params) INTRINSICCV_STREAMING_COMPATIBLE { Rectangle rect{width, height}; Rectangle kernel{params->kernel}; @@ -524,6 +525,7 @@ static inline void erode_sc(const T *src, size_t src_stride, T *dst, // Update source for the next iteration. current_src_rows = dst_rows; } + return INTRINSICCV_OK; } } // namespace intrinsiccv::sve2 diff --git a/intrinsiccv/src/morphology/morphology_sme2.cpp b/intrinsiccv/src/morphology/morphology_sme2.cpp index d91ea0b95bfbf4abc5356a8f38600da85a95f4b8..c7e003a9fface33cfce56615ad7dee4fe7f5a1bc 100644 --- a/intrinsiccv/src/morphology/morphology_sme2.cpp +++ b/intrinsiccv/src/morphology/morphology_sme2.cpp @@ -7,23 +7,23 @@ namespace intrinsiccv::sme2 { template -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void dilate( - const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width, - size_t height, const intrinsiccv_morphology_params_t *params) { - intrinsiccv::sve2::dilate_sc(src, src_stride, dst, dst_stride, width, - height, params); +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +dilate(const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width, + size_t height, const intrinsiccv_morphology_params_t *params) { + return intrinsiccv::sve2::dilate_sc(src, src_stride, dst, dst_stride, + width, height, params); } template -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void erode( - const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width, - size_t height, const intrinsiccv_morphology_params_t *params) { - intrinsiccv::sve2::erode_sc(src, src_stride, dst, dst_stride, width, - height, params); +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t +erode(const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width, + size_t height, const intrinsiccv_morphology_params_t *params) { + return intrinsiccv::sve2::erode_sc(src, src_stride, dst, dst_stride, width, + height, params); } #define INTRINSICCV_INSTANTIATE_TEMPLATE(name, type) \ - template INTRINSICCV_TARGET_FN_ATTRS void name( \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t name( \ const type *src, size_t src_stride, type *dst, size_t dst_stride, \ size_t width, size_t height, \ const intrinsiccv_morphology_params_t *params) diff --git a/intrinsiccv/src/morphology/morphology_sve2.cpp b/intrinsiccv/src/morphology/morphology_sve2.cpp index 55332d1f419b62a1acf9b51e79c19fb952e1879a..9ee454f59bf29032aa2c5ee4531617de8a562e04 100644 --- a/intrinsiccv/src/morphology/morphology_sve2.cpp +++ b/intrinsiccv/src/morphology/morphology_sve2.cpp @@ -7,21 +7,21 @@ namespace intrinsiccv::sve2 { template -void INTRINSICCV_TARGET_FN_ATTRS +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t dilate(const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width, size_t height, const intrinsiccv_morphology_params_t *params) { - dilate_sc(src, src_stride, dst, dst_stride, width, height, params); + return dilate_sc(src, src_stride, dst, dst_stride, width, height, params); } template -void INTRINSICCV_TARGET_FN_ATTRS +INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t erode(const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width, size_t height, const intrinsiccv_morphology_params_t *params) { - erode_sc(src, src_stride, dst, dst_stride, width, height, params); + return erode_sc(src, src_stride, dst, dst_stride, width, height, params); } #define INTRINSICCV_INSTANTIATE_TEMPLATE(name, type) \ - template INTRINSICCV_TARGET_FN_ATTRS void name( \ + template INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t name( \ const type *src, size_t src_stride, type *dst, size_t dst_stride, \ size_t width, size_t height, \ const intrinsiccv_morphology_params_t *params) diff --git a/intrinsiccv/src/resize/resize_api.cpp b/intrinsiccv/src/resize/resize_api.cpp index 0fe577a6e4b7521fb291e84df4cacc9d3d147913..5fed82084d5d73c97d7fc462b7fa05a514477ed0 100644 --- a/intrinsiccv/src/resize/resize_api.cpp +++ b/intrinsiccv/src/resize/resize_api.cpp @@ -11,7 +11,7 @@ namespace intrinsiccv { INTRINSICCV_MULTIVERSION_C_API( intrinsiccv_resize_to_quarter_u8, intrinsiccv::neon::resize_to_quarter_u8, INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::resize_to_quarter_u8), - intrinsiccv::sme2::resize_to_quarter_u8, void, const uint8_t *src, + intrinsiccv::sme2::resize_to_quarter_u8, const uint8_t *src, size_t src_stride, size_t src_width, size_t src_height, uint8_t *dst, size_t dst_stride, size_t dst_width, size_t dst_height); diff --git a/intrinsiccv/src/resize/resize_neon.cpp b/intrinsiccv/src/resize/resize_neon.cpp index 4d69a2cf6dde76e0aabe04c7c0e07814bc77be65..58988f620ed7fa957056034f4362cf04c8d86340 100644 --- a/intrinsiccv/src/resize/resize_neon.cpp +++ b/intrinsiccv/src/resize/resize_neon.cpp @@ -9,10 +9,10 @@ namespace intrinsiccv::neon { INTRINSICCV_TARGET_FN_ATTRS -void resize_to_quarter_u8(const uint8_t *src, size_t src_stride, - size_t src_width, size_t src_height, uint8_t *dst, - size_t dst_stride, size_t dst_width, - size_t dst_height) { +intrinsiccv_error_t resize_to_quarter_u8(const uint8_t *src, size_t src_stride, + size_t src_width, size_t src_height, + uint8_t *dst, size_t dst_stride, + size_t dst_width, size_t dst_height) { for (; src_height >= 2; src_height -= 2, src += (src_stride * 2), --dst_height, dst += dst_stride) { const uint8_t *src_l = src; @@ -85,6 +85,7 @@ void resize_to_quarter_u8(const uint8_t *src, size_t src_stride, *dst = *src; } } + return INTRINSICCV_OK; } } // namespace intrinsiccv::neon diff --git a/intrinsiccv/src/resize/resize_sc.h b/intrinsiccv/src/resize/resize_sc.h index 9c3834fa2794ec11aab3bbef40e4ea220c233913..42c9ed2fc77cff845f8ddfaa24aa60f0205b5440 100644 --- a/intrinsiccv/src/resize/resize_sc.h +++ b/intrinsiccv/src/resize/resize_sc.h @@ -139,7 +139,7 @@ static inline void process_single_row( } } -INTRINSICCV_TARGET_FN_ATTRS static void resize_to_quarter_u8_sc( +INTRINSICCV_TARGET_FN_ATTRS static intrinsiccv_error_t resize_to_quarter_u8_sc( const uint8_t *src, size_t src_stride, size_t src_width, size_t src_height, uint8_t *dst, size_t dst_stride, size_t dst_width, size_t dst_height) INTRINSICCV_STREAMING_COMPATIBLE { @@ -162,6 +162,7 @@ INTRINSICCV_TARGET_FN_ATTRS static void resize_to_quarter_u8_sc( process_single_row(src_rows, src_width, dst_rows, dst_width); }); } + return INTRINSICCV_OK; } } // namespace intrinsiccv::sve2 diff --git a/intrinsiccv/src/resize/resize_sme2.cpp b/intrinsiccv/src/resize/resize_sme2.cpp index 428ac023dec28b575b0c66d9757b9b12c77235e3..dd8fd4d9d4a99208f47ad144c87efbf500e77ede 100644 --- a/intrinsiccv/src/resize/resize_sme2.cpp +++ b/intrinsiccv/src/resize/resize_sme2.cpp @@ -7,13 +7,13 @@ namespace intrinsiccv::sme2 { -INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS void +INTRINSICCV_LOCALLY_STREAMING INTRINSICCV_TARGET_FN_ATTRS intrinsiccv_error_t resize_to_quarter_u8(const uint8_t *src, size_t src_stride, size_t src_width, size_t src_height, uint8_t *dst, size_t dst_stride, size_t dst_width, size_t dst_height) { - intrinsiccv::sve2::resize_to_quarter_u8_sc(src, src_stride, src_width, - src_height, dst, dst_stride, - dst_width, dst_height); + return intrinsiccv::sve2::resize_to_quarter_u8_sc(src, src_stride, src_width, + src_height, dst, dst_stride, + dst_width, dst_height); } } // namespace intrinsiccv::sme2 diff --git a/intrinsiccv/src/resize/resize_sve2.cpp b/intrinsiccv/src/resize/resize_sve2.cpp index 2fe08bed64f85b7db6ea9b2bfa38c34fd445b999..e29c84e80c83979122cffdad8c158dfbc0f01d01 100644 --- a/intrinsiccv/src/resize/resize_sve2.cpp +++ b/intrinsiccv/src/resize/resize_sve2.cpp @@ -8,12 +8,12 @@ namespace intrinsiccv::sve2 { INTRINSICCV_TARGET_FN_ATTRS -void resize_to_quarter_u8(const uint8_t *src, size_t src_stride, - size_t src_width, size_t src_height, uint8_t *dst, - size_t dst_stride, size_t dst_width, - size_t dst_height) { - resize_to_quarter_u8_sc(src, src_stride, src_width, src_height, dst, - dst_stride, dst_width, dst_height); +intrinsiccv_error_t resize_to_quarter_u8(const uint8_t *src, size_t src_stride, + size_t src_width, size_t src_height, + uint8_t *dst, size_t dst_stride, + size_t dst_width, size_t dst_height) { + return resize_to_quarter_u8_sc(src, src_stride, src_width, src_height, dst, + dst_stride, dst_width, dst_height); } } // namespace intrinsiccv::sve2 diff --git a/scripts/cpplint.sh b/scripts/cpplint.sh index 0ad7a97541f0771e39cdefc2a37ec44e130e1235..5bbd727e7a72d5c38ab3e91380634e892dd3f9b6 100755 --- a/scripts/cpplint.sh +++ b/scripts/cpplint.sh @@ -23,6 +23,7 @@ set -x # be done without knowing who will do it. # * runtime/references - it's OK to pass non-const references if an argument # is intended to be modified. +# * whitespace/indent - handled by clang-format. # * whitespace/line_length - handled by clang-format. # # False positives should not be disabled but instead suppressed by adding a @@ -31,5 +32,5 @@ cpplint \ --recursive \ --exclude=build \ --counting=detailed \ - --filter=-build/header_guard,-build/include_subdir,-readability/todo,-runtime/references,-whitespace/line_length \ + --filter=-build/header_guard,-build/include_subdir,-readability/todo,-runtime/references,-whitespace/indent,-whitespace/line_length \ . diff --git a/test/api/test_count_nonzeros.cpp b/test/api/test_count_nonzeros.cpp index 97f0ad79db622a7911bf35b58b9aec32be717840..79c82ee499ffbe5532772310fb73333650e133b7 100644 --- a/test/api/test_count_nonzeros.cpp +++ b/test/api/test_count_nonzeros.cpp @@ -70,8 +70,9 @@ class CountNonZerosTest { } size_t expected = data_.calculateExpected(width, height); - size_t actual = count_nonzeros()( - source.data(), source.stride(), width, height); + size_t actual = SIZE_MAX; + count_nonzeros()(source.data(), source.stride(), width, height, + &actual); EXPECT_EQ(expected, actual); } }; diff --git a/test/api/test_merge.cpp b/test/api/test_merge.cpp index 24cea43f1d5839347a803f61b1f9067d541948f6..088c7d7fab7279d4a05f021f98fe29841e30b86b 100644 --- a/test/api/test_merge.cpp +++ b/test/api/test_merge.cpp @@ -74,9 +74,11 @@ class MergeTest final { for (size_t i = 0; i < Channels; ++i) { strides[i] = inputs[i].stride(); } - intrinsiccv_merge(input_raw_pointers, strides, actual_output.data(), - actual_output.stride(), input_width, height, Channels, - sizeof(ElementType)); + ASSERT_EQ( + INTRINSICCV_OK, + intrinsiccv_merge(input_raw_pointers, strides, actual_output.data(), + actual_output.stride(), input_width, height, Channels, + sizeof(ElementType))); // Compare the results for (size_t i = 0; i < Channels; ++i) { diff --git a/test/api/test_saturating_absdiff.cpp b/test/api/test_saturating_absdiff.cpp index a9cfbf68bec5cf02472bc2d4447ccb4a13704a76..0280de1c37abb09bbc6db92fd992436ef2ea9539 100644 --- a/test/api/test_saturating_absdiff.cpp +++ b/test/api/test_saturating_absdiff.cpp @@ -30,8 +30,8 @@ class SaturatingAbsDiffTest final : public BinaryOperationTest { using BinaryOperationTest::max; // Calls the API-under-test in the appropriate way. - void call_api() override { - saturating_absdiff()( + intrinsiccv_error_t call_api() override { + return saturating_absdiff()( this->inputs_[0].data(), this->inputs_[0].stride(), this->inputs_[1].data(), this->inputs_[1].stride(), this->actual_[0].data(), this->actual_[0].stride(), this->width(), diff --git a/test/api/test_saturating_add.cpp b/test/api/test_saturating_add.cpp index 03177fe557dfc156e32267b8fc6cb4759f4786cb..d202abcec5f8a2c716b1e78cc024c73d27418fb5 100644 --- a/test/api/test_saturating_add.cpp +++ b/test/api/test_saturating_add.cpp @@ -32,8 +32,8 @@ class SaturatingAddTest final : public BinaryOperationTest { using BinaryOperationTest::max; // Calls the API-under-test in the appropriate way. - void call_api() override { - saturating_add()( + intrinsiccv_error_t call_api() override { + return saturating_add()( this->inputs_[0].data(), this->inputs_[0].stride(), this->inputs_[1].data(), this->inputs_[1].stride(), this->actual_[0].data(), this->actual_[0].stride(), this->width(), diff --git a/test/api/test_saturating_multiply.cpp b/test/api/test_saturating_multiply.cpp index 00e1c2c739dbec19093a0576dbbc05baceabe34d..3ab8964788a8cd5aab24f5f7dd444f4ead0a592b 100644 --- a/test/api/test_saturating_multiply.cpp +++ b/test/api/test_saturating_multiply.cpp @@ -30,8 +30,8 @@ class SaturatingMultiplyTest final : public BinaryOperationTest { using BinaryOperationTest::max; // Calls the API-under-test in the appropriate way. - void call_api() override { - saturating_multiply()( + intrinsiccv_error_t call_api() override { + return saturating_multiply()( this->inputs_[0].data(), this->inputs_[0].stride(), this->inputs_[1].data(), this->inputs_[1].stride(), this->actual_[0].data(), this->actual_[0].stride(), this->width(), diff --git a/test/api/test_saturating_sub.cpp b/test/api/test_saturating_sub.cpp index 6f95b6fd751d29b60fc6f6f269ed1303313fe974..4ab3c7bb128e34d22072a315cd19fffe016137b7 100644 --- a/test/api/test_saturating_sub.cpp +++ b/test/api/test_saturating_sub.cpp @@ -32,8 +32,8 @@ class SaturatingSubTest final : public BinaryOperationTest { using BinaryOperationTest::max; // Calls the API-under-test in the appropriate way. - void call_api() override { - saturating_sub()( + intrinsiccv_error_t call_api() override { + return saturating_sub()( this->inputs_[0].data(), this->inputs_[0].stride(), this->inputs_[1].data(), this->inputs_[1].stride(), this->actual_[0].data(), this->actual_[0].stride(), this->width(), diff --git a/test/api/test_sobel.cpp b/test/api/test_sobel.cpp index 6136e4401f4953f9b7da66447313cb7283bf53cb..97d4828eaa0eb11b1f35f0d00b6ba52d4eb18fe7 100644 --- a/test/api/test_sobel.cpp +++ b/test/api/test_sobel.cpp @@ -47,14 +47,15 @@ class Sobel3x3Test : public test::KernelTest { using typename test::KernelTest::IntermediateType; using typename test::KernelTest::OutputType; - void call_api(const test::Array2D *input, - test::Array2D *output, - intrinsiccv_border_type_t) override { + intrinsiccv_error_t call_api(const test::Array2D *input, + test::Array2D *output, + intrinsiccv_border_type_t) override { auto api = KernelTestParams::kIsHorizontal ? sobel_3x3_horizontal() : sobel_3x3_vertical(); - api(input->data(), input->stride(), output->data(), output->stride(), - input->width() / input->channels(), input->height(), input->channels()); + return api(input->data(), input->stride(), output->data(), output->stride(), + input->width() / input->channels(), input->height(), + input->channels()); } public: diff --git a/test/api/test_split.cpp b/test/api/test_split.cpp index 186f853fc67d57cdb6059aff593a92b3efcd0221..a0f23cd8f6e1cdaed9aab2b22ee55b20d34160ef 100644 --- a/test/api/test_split.cpp +++ b/test/api/test_split.cpp @@ -73,9 +73,10 @@ class SplitTest final { for (size_t i = 0; i < Channels; ++i) { strides[i] = actual_outputs[i].stride(); } - intrinsiccv_split(input.data(), input.stride(), actual_raw_pointers, - strides, output_width, height, Channels, - sizeof(ElementType)); + ASSERT_EQ(INTRINSICCV_OK, + intrinsiccv_split(input.data(), input.stride(), + actual_raw_pointers, strides, output_width, + height, Channels, sizeof(ElementType))); // Compare the results for (size_t i = 0; i < Channels; ++i) { diff --git a/test/api/test_threshold_binary.cpp b/test/api/test_threshold_binary.cpp index d2ccb27424165c762b6eb02c4f1840dcec324564..5ca3651d26e03b715729d7657d5ebf186454d06e 100644 --- a/test/api/test_threshold_binary.cpp +++ b/test/api/test_threshold_binary.cpp @@ -14,8 +14,8 @@ class ThresholdBinaryTestBase : public UnaryOperationTest { protected: // Calls the API-under-test in the appropriate way. - void call_api() override { - intrinsiccv_threshold_binary_u8( + intrinsiccv_error_t call_api() override { + return intrinsiccv_threshold_binary_u8( this->inputs_[0].data(), this->inputs_[0].stride(), this->actual_[0].data(), this->actual_[0].stride(), this->width(), this->height(), this->threshold(), this->value()); diff --git a/test/framework/kernel.h b/test/framework/kernel.h index f11b8b38c4e4133fdfe5170340355aca387c65e5..8d7979efacbf7727f4c5b2eb4d400ce0aeb01bff 100644 --- a/test/framework/kernel.h +++ b/test/framework/kernel.h @@ -132,17 +132,16 @@ class KernelTest { prepare_source(element_generator); prepare_expected(kernel, array_layout, border_type); prepare_actual(); - this->call_api(&input_, &actual_, border_type); - check_results(); + check_results(this->call_api(&input_, &actual_, border_type)); } protected: // Calls the API-under-test in the appropriate way. // // The arguments are never nullptr. - virtual void call_api(const Array2D *input, - Array2D *output, - intrinsiccv_border_type_t border_type) = 0; + virtual intrinsiccv_error_t call_api( + const Array2D *input, Array2D *output, + intrinsiccv_border_type_t border_type) = 0; // Calculates the expected output. virtual void calculate_expected(const Kernel &kernel, @@ -236,12 +235,14 @@ class KernelTest { void prepare_actual() { actual_.fill(42); } // Checks that the actual output matches the expectations. - void check_results() { + void check_results(intrinsiccv_error_t err) { if (debug_) { std::cout << "[actual]" << std::endl; dump(&actual_); } + EXPECT_EQ(INTRINSICCV_OK, err); + // Check that the actual result matches the expectation. EXPECT_EQ_ARRAY2D(expected_, actual_); } diff --git a/test/framework/operation.h b/test/framework/operation.h index 1dd888982964565e840c070c87c6ca8156580aac..d0373598386efc21ee6bffb07789b6500ee62040 100644 --- a/test/framework/operation.h +++ b/test/framework/operation.h @@ -50,8 +50,7 @@ class OperationTest { } setup(); - call_api(); - check(); + check(call_api()); } protected: @@ -85,10 +84,11 @@ class OperationTest { } // Calls the API-under-test in the appropriate way. - virtual void call_api() = 0; + virtual intrinsiccv_error_t call_api() = 0; // Checks that the result meets the expectations. - virtual void check() { + virtual void check(intrinsiccv_error_t err) { + EXPECT_EQ(INTRINSICCV_OK, err); for (size_t index = 0; index < expected_.size(); ++index) { EXPECT_EQ_ARRAY2D(expected_[index], actual_[index]); } diff --git a/test/framework/test_kernel.cpp b/test/framework/test_kernel.cpp index 0d7709b2e7eeb5467491636bfc150c3a2907b467..f9af117c33739acb6efde863d0206b0e4b312db6 100644 --- a/test/framework/test_kernel.cpp +++ b/test/framework/test_kernel.cpp @@ -92,9 +92,9 @@ class ExampleKernelTest : public test::KernelTest { using IntermediateType = typename KernelTestParams::IntermediateType; using OutputType = typename KernelTestParams::OutputType; - void call_api(const test::Array2D *input, - test::Array2D *output, - intrinsiccv_border_type_t border_type) override { + intrinsiccv_error_t call_api(const test::Array2D *input, + test::Array2D *output, + intrinsiccv_border_type_t border_type) override { ++api_calls_; // Check the expected border type. @@ -126,6 +126,8 @@ class ExampleKernelTest : public test::KernelTest { // Fake some result. output->fill(OutputType{0}); + + return INTRINSICCV_OK; } public: