use super::enums::OBFormat;
use super::{OBError, drop_ob_object, orb};
pub struct OBFrame {
inner: *mut orb::ob_frame,
}
drop_ob_object!(OBFrame, ob_delete_frame);
impl OBFrame {
pub fn new(inner: *mut orb::ob_frame) -> Self {
OBFrame { inner }
}
pub(crate) fn inner(&self) -> *mut orb::ob_frame {
self.inner
}
pub fn get_data(&self) -> Result<&[u8], OBError> {
let mut err_ptr = std::ptr::null_mut();
let size = unsafe { orb::ob_frame_get_data_size(self.inner, &mut err_ptr) } as usize;
OBError::consume(err_ptr)?;
let data = unsafe { orb::ob_frame_get_data(self.inner, &mut err_ptr) };
OBError::consume(err_ptr)?;
Ok(unsafe { std::slice::from_raw_parts(data as *const u8, size) })
}
pub fn get_format(&self) -> Result<OBFormat, OBError> {
let mut err_ptr = std::ptr::null_mut();
let format = unsafe { orb::ob_frame_get_format(self.inner, &mut err_ptr) };
OBError::consume(err_ptr)?;
Ok(format.into())
}
pub fn get_depth_frame(&self) -> Result<Option<OBFrame>, OBError> {
let mut err_ptr = std::ptr::null_mut();
let frame = unsafe { orb::ob_frameset_get_depth_frame(self.inner, &mut err_ptr) };
OBError::consume(err_ptr)?;
Ok(if frame.is_null() {
None
} else {
Some(OBFrame::new(frame))
})
}
pub fn get_color_frame(&self) -> Result<Option<OBFrame>, OBError> {
let mut err_ptr = std::ptr::null_mut();
let frame = unsafe { orb::ob_frameset_get_color_frame(self.inner, &mut err_ptr) };
OBError::consume(err_ptr)?;
Ok(if frame.is_null() {
None
} else {
Some(OBFrame::new(frame))
})
}
pub fn get_video_width(&self) -> Result<u32, OBError> {
let mut err_ptr = std::ptr::null_mut();
let width = unsafe { orb::ob_video_frame_get_width(self.inner, &mut err_ptr) };
OBError::consume(err_ptr)?;
Ok(width)
}
pub fn get_video_height(&self) -> Result<u32, OBError> {
let mut err_ptr = std::ptr::null_mut();
let height = unsafe { orb::ob_video_frame_get_height(self.inner, &mut err_ptr) };
OBError::consume(err_ptr)?;
Ok(height)
}
}