use crate::{
cstr, drop_using_function, layout::Layout, try_unsafe, util::Result, ElementType, Model,
ResizeAlgorithm, Tensor,
};
use openvino_sys::{
ov_preprocess_input_info_free, ov_preprocess_input_info_get_model_info,
ov_preprocess_input_info_get_preprocess_steps, ov_preprocess_input_info_get_tensor_info,
ov_preprocess_input_info_t, ov_preprocess_input_model_info_free,
ov_preprocess_input_model_info_set_layout, ov_preprocess_input_model_info_t,
ov_preprocess_input_tensor_info_free, ov_preprocess_input_tensor_info_set_from,
ov_preprocess_input_tensor_info_set_layout, ov_preprocess_input_tensor_info_t,
ov_preprocess_output_info_free, ov_preprocess_output_info_get_tensor_info,
ov_preprocess_output_info_t, ov_preprocess_output_set_element_type,
ov_preprocess_output_tensor_info_free, ov_preprocess_output_tensor_info_t,
ov_preprocess_prepostprocessor_build, ov_preprocess_prepostprocessor_create,
ov_preprocess_prepostprocessor_free, ov_preprocess_prepostprocessor_get_input_info,
ov_preprocess_prepostprocessor_get_input_info_by_index,
ov_preprocess_prepostprocessor_get_input_info_by_name,
ov_preprocess_prepostprocessor_get_output_info_by_index,
ov_preprocess_prepostprocessor_get_output_info_by_name, ov_preprocess_prepostprocessor_t,
ov_preprocess_preprocess_steps_convert_element_type,
ov_preprocess_preprocess_steps_convert_layout, ov_preprocess_preprocess_steps_free,
ov_preprocess_preprocess_steps_resize, ov_preprocess_preprocess_steps_t,
};
#[derive(Debug)]
pub struct Pipeline {
ptr: *mut ov_preprocess_prepostprocessor_t,
}
drop_using_function!(Pipeline, ov_preprocess_prepostprocessor_free);
impl Pipeline {
pub fn new(model: &Model) -> Result<Self> {
let mut ptr = std::ptr::null_mut();
try_unsafe!(ov_preprocess_prepostprocessor_create(
model.as_ptr(),
std::ptr::addr_of_mut!(ptr)
))?;
Ok(Self { ptr })
}
pub fn get_input_info_by_index(&self, index: usize) -> Result<InputInfo> {
let mut ptr = std::ptr::null_mut();
try_unsafe!(ov_preprocess_prepostprocessor_get_input_info_by_index(
self.ptr,
index,
std::ptr::addr_of_mut!(ptr)
))?;
Ok(InputInfo { ptr })
}
pub fn get_input_info_by_name(&self, name: &str) -> Result<InputInfo> {
let name = cstr!(name);
let mut ptr = std::ptr::null_mut();
try_unsafe!(ov_preprocess_prepostprocessor_get_input_info_by_name(
self.ptr,
name.as_ptr(),
std::ptr::addr_of_mut!(ptr)
))?;
Ok(InputInfo { ptr })
}
pub fn get_output_info_by_name(&self, name: &str) -> Result<OutputInfo> {
let name = cstr!(name);
let mut ptr = std::ptr::null_mut();
try_unsafe!(ov_preprocess_prepostprocessor_get_output_info_by_name(
self.ptr,
name.as_ptr(),
std::ptr::addr_of_mut!(ptr)
))?;
Ok(OutputInfo { ptr })
}
pub fn get_output_info_by_index(&self, index: usize) -> Result<OutputInfo> {
let mut ptr = std::ptr::null_mut();
try_unsafe!(ov_preprocess_prepostprocessor_get_output_info_by_index(
self.ptr,
index,
std::ptr::addr_of_mut!(ptr)
))?;
Ok(OutputInfo { ptr })
}
pub fn get_input_info(&self) -> Result<InputInfo> {
let mut ptr = std::ptr::null_mut();
try_unsafe!(ov_preprocess_prepostprocessor_get_input_info(
self.ptr,
std::ptr::addr_of_mut!(ptr)
))?;
assert!(!ptr.is_null());
Ok(InputInfo { ptr })
}
pub fn build_new_model(&self) -> Result<Model> {
let mut ptr = std::ptr::null_mut();
try_unsafe!(ov_preprocess_prepostprocessor_build(
self.ptr,
std::ptr::addr_of_mut!(ptr)
))?;
Ok(Model::from_ptr(ptr))
}
}
pub struct InputInfo {
ptr: *mut ov_preprocess_input_info_t,
}
drop_using_function!(InputInfo, ov_preprocess_input_info_free);
impl InputInfo {
pub fn get_model_info(&self) -> Result<InputModelInfo> {
let mut ptr = std::ptr::null_mut();
try_unsafe!(ov_preprocess_input_info_get_model_info(
self.ptr,
std::ptr::addr_of_mut!(ptr)
))?;
Ok(InputModelInfo { ptr })
}
pub fn get_tensor_info(&self) -> Result<InputTensorInfo> {
let mut ptr: *mut ov_preprocess_input_tensor_info_t = std::ptr::null_mut();
try_unsafe!(ov_preprocess_input_info_get_tensor_info(
self.ptr,
std::ptr::addr_of_mut!(ptr)
))?;
Ok(InputTensorInfo { ptr })
}
pub fn get_steps(&self) -> Result<Steps> {
let mut ptr = std::ptr::null_mut();
try_unsafe!(ov_preprocess_input_info_get_preprocess_steps(
self.ptr,
std::ptr::addr_of_mut!(ptr)
))?;
Ok(Steps { ptr })
}
}
pub struct OutputInfo {
ptr: *mut ov_preprocess_output_info_t,
}
drop_using_function!(OutputInfo, ov_preprocess_output_info_free);
impl OutputInfo {
pub fn get_tensor_info(&self) -> Result<OutputTensorInfo> {
let mut ptr: *mut ov_preprocess_output_tensor_info_t = std::ptr::null_mut();
try_unsafe!(ov_preprocess_output_info_get_tensor_info(
self.ptr,
std::ptr::addr_of_mut!(ptr)
))?;
Ok(OutputTensorInfo { ptr })
}
}
pub struct InputModelInfo {
ptr: *mut ov_preprocess_input_model_info_t,
}
drop_using_function!(InputModelInfo, ov_preprocess_input_model_info_free);
impl InputModelInfo {
pub fn set_layout(&mut self, mut layout: Layout) -> Result<()> {
try_unsafe!(ov_preprocess_input_model_info_set_layout(
self.ptr,
layout.as_mut_ptr()
))
}
}
pub struct InputTensorInfo {
ptr: *mut ov_preprocess_input_tensor_info_t,
}
drop_using_function!(InputTensorInfo, ov_preprocess_input_tensor_info_free);
impl InputTensorInfo {
pub fn set_layout(&mut self, mut layout: Layout) -> Result<()> {
try_unsafe!(ov_preprocess_input_tensor_info_set_layout(
self.ptr,
layout.as_mut_ptr()
))
}
pub fn set_from(&mut self, tensor: &Tensor) -> Result<()> {
try_unsafe!(ov_preprocess_input_tensor_info_set_from(
self.ptr,
tensor.as_ptr()
))
}
}
pub struct OutputTensorInfo {
ptr: *mut ov_preprocess_output_tensor_info_t,
}
drop_using_function!(OutputTensorInfo, ov_preprocess_output_tensor_info_free);
impl OutputTensorInfo {
pub fn set_element_type(&mut self, element_type: ElementType) -> Result<()> {
try_unsafe!(ov_preprocess_output_set_element_type(
self.ptr,
element_type.into()
))
}
}
pub struct Steps {
ptr: *mut ov_preprocess_preprocess_steps_t,
}
drop_using_function!(Steps, ov_preprocess_preprocess_steps_free);
impl Steps {
pub fn resize(&mut self, resize_algo: ResizeAlgorithm) -> Result<()> {
try_unsafe!(ov_preprocess_preprocess_steps_resize(
self.ptr,
resize_algo.into()
))
}
pub fn convert_layout(&mut self, mut new_layout: Layout) -> Result<()> {
try_unsafe!(ov_preprocess_preprocess_steps_convert_layout(
self.ptr,
new_layout.as_mut_ptr(),
))
}
pub fn convert_element_type(&mut self, new_element_type: ElementType) -> Result<()> {
try_unsafe!(ov_preprocess_preprocess_steps_convert_element_type(
self.ptr,
new_element_type.into()
))
}
}