KleidiCV Coverage Report


Directory: ./
File: kleidicv/src/filters/separable_filter_2d_api.cpp
Date: 2026-03-05 15:57:40
Exec Total Coverage
Lines: 24 24 100.0%
Functions: 4 4 100.0%
Branches: 20 20 100.0%

Line Branch Exec Source
1 // SPDX-FileCopyrightText: 2023 - 2026 Arm Limited and/or its affiliates <open-source-office@arm.com>
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 #include "kleidicv/dispatch.h"
6 #include "kleidicv/filters/separable_filter_2d.h"
7 #include "kleidicv/kleidicv.h"
8 #include "kleidicv/workspace/separable.h"
9
10 namespace kleidicv {
11
12 namespace neon {
13
14 template <typename T>
15 kleidicv_error_t separable_filter_2d_stripe(
16 const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width,
17 size_t height, size_t y_begin, size_t y_end, size_t channels,
18 const T *kernel_x, size_t kernel_width, const T *kernel_y,
19 size_t kernel_height, FixedBorderType border_type);
20
21 } // namespace neon
22
23 namespace sve2 {
24
25 template <typename T>
26 kleidicv_error_t separable_filter_2d_stripe(
27 const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width,
28 size_t height, size_t y_begin, size_t y_end, size_t channels,
29 const T *kernel_x, size_t kernel_width, const T *kernel_y,
30 size_t kernel_height, FixedBorderType border_type);
31
32 } // namespace sve2
33
34 namespace sme {
35
36 template <typename T>
37 kleidicv_error_t separable_filter_2d_stripe(
38 const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width,
39 size_t height, size_t y_begin, size_t y_end, size_t channels,
40 const T *kernel_x, size_t kernel_width, const T *kernel_y,
41 size_t kernel_height, FixedBorderType border_type);
42
43 } // namespace sme
44
45 } // namespace kleidicv
46
47 #define KLEIDICV_DEFINE_C_API(name, type) \
48 KLEIDICV_MULTIVERSION_C_API( \
49 name, &kleidicv::neon::separable_filter_2d_stripe<type>, \
50 KLEIDICV_SVE2_IMPL_IF(kleidicv::sve2::separable_filter_2d_stripe<type>), \
51 &kleidicv::sme::separable_filter_2d_stripe<type>, nullptr)
52
53
4/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 1 times.
10 KLEIDICV_DEFINE_C_API(kleidicv_separable_filter_2d_stripe_u8, uint8_t);
54
4/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 1 times.
10 KLEIDICV_DEFINE_C_API(kleidicv_separable_filter_2d_stripe_u16, uint16_t);
55
56 extern "C" {
57
58 320 kleidicv_error_t kleidicv_separable_filter_2d_u8(
59 const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride,
60 size_t width, size_t height, size_t channels, const uint8_t *kernel_x,
61 size_t kernel_width, const uint8_t *kernel_y, size_t kernel_height,
62 kleidicv_border_type_t border_type) {
63
4/4
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 220 times.
✓ Branch 2 taken 100 times.
✓ Branch 3 taken 220 times.
640 if (!kleidicv::separable_filter_2d_is_implemented(width, height, kernel_width,
64 320 kernel_height)) {
65 100 return KLEIDICV_ERROR_NOT_IMPLEMENTED;
66 }
67 220 auto fixed_border_type = kleidicv::get_fixed_border_type(border_type);
68
2/2
✓ Branch 0 taken 208 times.
✓ Branch 1 taken 12 times.
220 if (!fixed_border_type) {
69 12 return KLEIDICV_ERROR_NOT_IMPLEMENTED;
70 }
71
72 416 return kleidicv_separable_filter_2d_stripe_u8(
73 208 src, src_stride, dst, dst_stride, width, height, 0, height, channels,
74 208 kernel_x, kernel_width, kernel_y, kernel_height, *fixed_border_type);
75 320 }
76
77 320 kleidicv_error_t kleidicv_separable_filter_2d_u16(
78 const uint16_t *src, size_t src_stride, uint16_t *dst, size_t dst_stride,
79 size_t width, size_t height, size_t channels, const uint16_t *kernel_x,
80 size_t kernel_width, const uint16_t *kernel_y, size_t kernel_height,
81 kleidicv_border_type_t border_type) {
82
4/4
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 220 times.
✓ Branch 2 taken 100 times.
✓ Branch 3 taken 220 times.
640 if (!kleidicv::separable_filter_2d_is_implemented(width, height, kernel_width,
83 320 kernel_height)) {
84 100 return KLEIDICV_ERROR_NOT_IMPLEMENTED;
85 }
86 220 auto fixed_border_type = kleidicv::get_fixed_border_type(border_type);
87
2/2
✓ Branch 0 taken 208 times.
✓ Branch 1 taken 12 times.
220 if (!fixed_border_type) {
88 12 return KLEIDICV_ERROR_NOT_IMPLEMENTED;
89 }
90
91 416 return kleidicv_separable_filter_2d_stripe_u16(
92 208 src, src_stride, dst, dst_stride, width, height, 0, height, channels,
93 208 kernel_x, kernel_width, kernel_y, kernel_height, *fixed_border_type);
94 320 }
95
96 } // extern "C"
97