• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2016-2020 Arm Limited.
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #ifndef ARM_COMPUTE_NEWARPKERNEL_H
25 #define ARM_COMPUTE_NEWARPKERNEL_H
26 
27 #include "arm_compute/core/Types.h"
28 #include "src/core/NEON/INEKernel.h"
29 
30 #include <array>
31 #include <cstdint>
32 namespace arm_compute
33 {
34 class ITensor;
35 
36 /** Common interface for warp affine and warp perspective */
37 class INEWarpKernel : public INEKernel
38 {
39 public:
40     /** Default constructor */
41     INEWarpKernel();
42     /** Prevent instances of this class from being copied (As this class contains pointers) */
43     INEWarpKernel(const INEWarpKernel &) = delete;
44     /** Prevent instances of this class from being copied (As this class contains pointers) */
45     INEWarpKernel &operator=(const INEWarpKernel &) = delete;
46     /** Allow instances of this class to be moved */
47     INEWarpKernel(INEWarpKernel &&) = default;
48     /** Allow instances of this class to be moved */
49     INEWarpKernel &operator=(INEWarpKernel &&) = default;
50     /** Default destructor */
51     ~INEWarpKernel() = default;
52     /** Initialise the kernel's input, output and border mode.
53      *
54      * @param[in]  input                 Source tensor. Data type supported: U8.
55      * @param[out] output                Destination tensor. Data type supported: U8.
56      * @param[in]  matrix                The perspective or affine matrix to use. Must be 2x3 for affine and 3x3 for perspective of type float.
57      *                                   The matrix argument requires 9 values, for the affine case the last 3 values are ignored.
58      * @param[in]  border_mode           Strategy to use for borders
59      * @param[in]  constant_border_value Constant value used for filling the border.
60      */
61     virtual void configure(const ITensor *input, ITensor *output, const std::array<float, 9> &matrix, BorderMode border_mode, uint8_t constant_border_value);
62 
63     // Inherited methods overridden:
64     void run(const Window &window, const ThreadInfo &info) override;
65 
66     // Inherited methods overridden:
67     BorderSize border_size() const override;
68 
69 protected:
70     /** function to perform warp affine or warp perspective on the given window when border mode == UNDEFINED
71      *
72      * @param[in] window Region on which to execute the kernel
73      */
74     virtual void warp_undefined(const Window &window) = 0;
75     /** function to perform warp affine or warp perspective on the given window when border mode == CONSTANT
76      *
77      * @param[in] window Region on which to execute the kernel
78      */
79     virtual void warp_constant(const Window &window) = 0;
80     /** function to perform warp affine or warp perspective on the given window when border mode == REPLICATE
81      *
82      * @param[in] window Region on which to execute the kernel
83      */
84     virtual void warp_replicate(const Window &window) = 0;
85     /** Common signature for all the specialised warp functions
86      *
87      * @param[in] window Region on which to execute the kernel.
88      */
89     void (INEWarpKernel::*_func)(const Window &window);
90 
91     const ITensor *_input;                 /**< Input Tensor */
92     ITensor       *_output;                /**< Output Tensor */
93     uint8_t        _constant_border_value; /**< Constant value used for filling the border. This value is used for those pixels out of the ROI when the border mode is CONSTANT */
94     std::array<float, 9> _matrix;          /**< The affine or perspective matrix. Must be 2x3 for warp affine or 3x3 for warp perspective of type float. */
95 };
96 
97 /** Template interface for the kernel to compute warp affine
98  *
99  */
100 template <InterpolationPolicy interpolation>
101 class NEWarpAffineKernel : public INEWarpKernel
102 {
103 private:
name()104     const char *name() const override
105     {
106         return "NEWarpAffineKernel";
107     }
108     // Inherited methods overridden:
109     void warp_undefined(const Window &window) override;
110     void warp_constant(const Window &window) override;
111     void warp_replicate(const Window &window) override;
112 };
113 
114 /** Template interface for the kernel to compute warp perspective
115  *
116  */
117 template <InterpolationPolicy interpolation>
118 class NEWarpPerspectiveKernel : public INEWarpKernel
119 {
120 private:
name()121     const char *name() const override
122     {
123         return "NEWarpPerspectiveKernel";
124     }
125     // Inherited methods overridden:
126     void warp_undefined(const Window &window) override;
127     void warp_constant(const Window &window) override;
128     void warp_replicate(const Window &window) override;
129 };
130 } // namespace arm_compute
131 #endif /*ARM_COMPUTE_NEWARPKERNEL_H */
132