1use crate::{
36 cstr, drop_using_function, layout::Layout, try_unsafe, util::Result, ElementType, Model,
37 ResizeAlgorithm, Tensor,
38};
39use openvino_sys::{
40 ov_preprocess_input_info_free, ov_preprocess_input_info_get_model_info,
41 ov_preprocess_input_info_get_preprocess_steps, ov_preprocess_input_info_get_tensor_info,
42 ov_preprocess_input_info_t, ov_preprocess_input_model_info_free,
43 ov_preprocess_input_model_info_set_layout, ov_preprocess_input_model_info_t,
44 ov_preprocess_input_tensor_info_free, ov_preprocess_input_tensor_info_set_from,
45 ov_preprocess_input_tensor_info_set_layout, ov_preprocess_input_tensor_info_t,
46 ov_preprocess_output_info_free, ov_preprocess_output_info_get_tensor_info,
47 ov_preprocess_output_info_t, ov_preprocess_output_set_element_type,
48 ov_preprocess_output_tensor_info_free, ov_preprocess_output_tensor_info_t,
49 ov_preprocess_prepostprocessor_build, ov_preprocess_prepostprocessor_create,
50 ov_preprocess_prepostprocessor_free, ov_preprocess_prepostprocessor_get_input_info,
51 ov_preprocess_prepostprocessor_get_input_info_by_index,
52 ov_preprocess_prepostprocessor_get_input_info_by_name,
53 ov_preprocess_prepostprocessor_get_output_info_by_index,
54 ov_preprocess_prepostprocessor_get_output_info_by_name, ov_preprocess_prepostprocessor_t,
55 ov_preprocess_preprocess_steps_convert_element_type,
56 ov_preprocess_preprocess_steps_convert_layout, ov_preprocess_preprocess_steps_free,
57 ov_preprocess_preprocess_steps_resize, ov_preprocess_preprocess_steps_t,
58};
59
60#[derive(Debug)]
63pub struct Pipeline {
64 ptr: *mut ov_preprocess_prepostprocessor_t,
65}
66drop_using_function!(Pipeline, ov_preprocess_prepostprocessor_free);
67impl Pipeline {
68 pub fn new(model: &Model) -> Result<Self> {
70 let mut ptr = std::ptr::null_mut();
71 try_unsafe!(ov_preprocess_prepostprocessor_create(
72 model.as_ptr(),
73 std::ptr::addr_of_mut!(ptr)
74 ))?;
75 Ok(Self { ptr })
76 }
77
78 pub fn get_input_info_by_index(&self, index: usize) -> Result<InputInfo> {
80 let mut ptr = std::ptr::null_mut();
81 try_unsafe!(ov_preprocess_prepostprocessor_get_input_info_by_index(
82 self.ptr,
83 index,
84 std::ptr::addr_of_mut!(ptr)
85 ))?;
86
87 Ok(InputInfo { ptr })
88 }
89
90 pub fn get_input_info_by_name(&self, name: &str) -> Result<InputInfo> {
92 let name = cstr!(name);
93 let mut ptr = std::ptr::null_mut();
94 try_unsafe!(ov_preprocess_prepostprocessor_get_input_info_by_name(
95 self.ptr,
96 name.as_ptr(),
97 std::ptr::addr_of_mut!(ptr)
98 ))?;
99
100 Ok(InputInfo { ptr })
101 }
102
103 pub fn get_output_info_by_name(&self, name: &str) -> Result<OutputInfo> {
105 let name = cstr!(name);
106 let mut ptr = std::ptr::null_mut();
107 try_unsafe!(ov_preprocess_prepostprocessor_get_output_info_by_name(
108 self.ptr,
109 name.as_ptr(),
110 std::ptr::addr_of_mut!(ptr)
111 ))?;
112 Ok(OutputInfo { ptr })
113 }
114
115 pub fn get_output_info_by_index(&self, index: usize) -> Result<OutputInfo> {
117 let mut ptr = std::ptr::null_mut();
118 try_unsafe!(ov_preprocess_prepostprocessor_get_output_info_by_index(
119 self.ptr,
120 index,
121 std::ptr::addr_of_mut!(ptr)
122 ))?;
123
124 Ok(OutputInfo { ptr })
125 }
126
127 pub fn get_input_info(&self) -> Result<InputInfo> {
133 let mut ptr = std::ptr::null_mut();
134 try_unsafe!(ov_preprocess_prepostprocessor_get_input_info(
135 self.ptr,
136 std::ptr::addr_of_mut!(ptr)
137 ))?;
138 assert!(!ptr.is_null());
139 Ok(InputInfo { ptr })
140 }
141
142 pub fn build_new_model(&self) -> Result<Model> {
144 let mut ptr = std::ptr::null_mut();
145 try_unsafe!(ov_preprocess_prepostprocessor_build(
146 self.ptr,
147 std::ptr::addr_of_mut!(ptr)
148 ))?;
149 Ok(Model::from_ptr(ptr))
150 }
151}
152
153pub struct InputInfo {
156 ptr: *mut ov_preprocess_input_info_t,
157}
158drop_using_function!(InputInfo, ov_preprocess_input_info_free);
159
160impl InputInfo {
161 pub fn get_model_info(&self) -> Result<InputModelInfo> {
163 let mut ptr = std::ptr::null_mut();
164 try_unsafe!(ov_preprocess_input_info_get_model_info(
165 self.ptr,
166 std::ptr::addr_of_mut!(ptr)
167 ))?;
168 Ok(InputModelInfo { ptr })
169 }
170
171 pub fn get_tensor_info(&self) -> Result<InputTensorInfo> {
173 let mut ptr: *mut ov_preprocess_input_tensor_info_t = std::ptr::null_mut();
174 try_unsafe!(ov_preprocess_input_info_get_tensor_info(
175 self.ptr,
176 std::ptr::addr_of_mut!(ptr)
177 ))?;
178 Ok(InputTensorInfo { ptr })
179 }
180
181 pub fn get_steps(&self) -> Result<Steps> {
183 let mut ptr = std::ptr::null_mut();
184 try_unsafe!(ov_preprocess_input_info_get_preprocess_steps(
185 self.ptr,
186 std::ptr::addr_of_mut!(ptr)
187 ))?;
188 Ok(Steps { ptr })
189 }
190}
191
192pub struct OutputInfo {
195 ptr: *mut ov_preprocess_output_info_t,
196}
197drop_using_function!(OutputInfo, ov_preprocess_output_info_free);
198impl OutputInfo {
199 pub fn get_tensor_info(&self) -> Result<OutputTensorInfo> {
201 let mut ptr: *mut ov_preprocess_output_tensor_info_t = std::ptr::null_mut();
202 try_unsafe!(ov_preprocess_output_info_get_tensor_info(
203 self.ptr,
204 std::ptr::addr_of_mut!(ptr)
205 ))?;
206 Ok(OutputTensorInfo { ptr })
207 }
208}
209
210pub struct InputModelInfo {
213 ptr: *mut ov_preprocess_input_model_info_t,
214}
215drop_using_function!(InputModelInfo, ov_preprocess_input_model_info_free);
216impl InputModelInfo {
217 pub fn set_layout(&mut self, mut layout: Layout) -> Result<()> {
219 try_unsafe!(ov_preprocess_input_model_info_set_layout(
220 self.ptr,
221 layout.as_mut_ptr()
222 ))
223 }
224}
225
226pub struct InputTensorInfo {
229 ptr: *mut ov_preprocess_input_tensor_info_t,
230}
231drop_using_function!(InputTensorInfo, ov_preprocess_input_tensor_info_free);
232impl InputTensorInfo {
233 pub fn set_layout(&mut self, mut layout: Layout) -> Result<()> {
235 try_unsafe!(ov_preprocess_input_tensor_info_set_layout(
236 self.ptr,
237 layout.as_mut_ptr()
238 ))
239 }
240
241 pub fn set_from(&mut self, tensor: &Tensor) -> Result<()> {
243 try_unsafe!(ov_preprocess_input_tensor_info_set_from(
244 self.ptr,
245 tensor.as_ptr()
246 ))
247 }
248}
249
250pub struct OutputTensorInfo {
253 ptr: *mut ov_preprocess_output_tensor_info_t,
254}
255drop_using_function!(OutputTensorInfo, ov_preprocess_output_tensor_info_free);
256impl OutputTensorInfo {
257 pub fn set_element_type(&mut self, element_type: ElementType) -> Result<()> {
259 try_unsafe!(ov_preprocess_output_set_element_type(
260 self.ptr,
261 element_type.into()
262 ))
263 }
264}
265
266pub struct Steps {
269 ptr: *mut ov_preprocess_preprocess_steps_t,
270}
271drop_using_function!(Steps, ov_preprocess_preprocess_steps_free);
272impl Steps {
273 pub fn resize(&mut self, resize_algo: ResizeAlgorithm) -> Result<()> {
275 try_unsafe!(ov_preprocess_preprocess_steps_resize(
276 self.ptr,
277 resize_algo.into()
278 ))
279 }
280
281 pub fn convert_layout(&mut self, mut new_layout: Layout) -> Result<()> {
283 try_unsafe!(ov_preprocess_preprocess_steps_convert_layout(
284 self.ptr,
285 new_layout.as_mut_ptr(),
286 ))
287 }
288
289 pub fn convert_element_type(&mut self, new_element_type: ElementType) -> Result<()> {
291 try_unsafe!(ov_preprocess_preprocess_steps_convert_element_type(
292 self.ptr,
293 new_element_type.into()
294 ))
295 }
296}