use orbbec_sys::ob_stream_profile;
use crate::error::Error;
use crate::filter::Filter;
use crate::pipeline::{Frame, Frameset, StreamType};
pub struct AlignFilter {
inner: Filter,
}
unsafe impl Send for AlignFilter {}
impl AlignFilter {
pub fn new() -> Result<Self, Error> {
Ok(Self {
inner: Filter::new("Align")?,
})
}
pub fn as_raw(&self) -> *mut orbbec_sys::ob_filter {
self.inner.as_raw()
}
pub fn set_align_target(&self, frameset: &Frameset, target: StreamType) -> Result<bool, Error> {
let Some(frame) = frameset.frame(target.as_frame_type()) else {
return Ok(false);
};
let Some(profile) = frame.stream_profile() else {
return Ok(false);
};
unsafe { self.set_align_profile(profile)? };
Ok(true)
}
pub unsafe fn set_align_profile(
&self,
profile: *const ob_stream_profile,
) -> Result<(), Error> {
unsafe {
crate::error::check_error(|e| {
orbbec_sys::ob_align_filter_set_align_to_stream_profile(
self.inner.as_raw(),
profile,
e,
)
})
}
}
pub fn process(&self, frameset: &Frameset) -> Result<Option<Frame>, Error> {
self.inner.process_frameset(frameset)
}
pub fn push_frame(&self, frame: &Frame) -> Result<(), Error> {
self.inner.push_frame(frame)
}
pub fn set_callback<F>(&self, callback: F) -> Result<(), Error>
where
F: FnMut(Frame) + Send + 'static,
{
self.inner.set_callback(callback)
}
}