use std::ffi::CStr;
use super::enums::OBFilterConfigValueType;
use super::frame::OBFrame;
use super::stream::OBStreamProfile;
use super::{OBError, drop_ob_object, orb};
pub struct OBFilterConfigSchemaItem {
inner: orb::ob_filter_config_schema_item,
}
impl OBFilterConfigSchemaItem {
pub fn name(&self) -> &CStr {
unsafe { CStr::from_ptr(self.inner.name) }
}
pub fn value_type(&self) -> OBFilterConfigValueType {
OBFilterConfigValueType::from(self.inner.type_)
}
pub fn minimum(&self) -> f64 {
self.inner.min
}
pub fn maximum(&self) -> f64 {
self.inner.max
}
pub fn step(&self) -> f64 {
self.inner.step
}
pub fn default(&self) -> f64 {
self.inner.def
}
pub fn description(&self) -> &CStr {
unsafe { CStr::from_ptr(self.inner.desc) }
}
}
impl From<orb::ob_filter_config_schema_item> for OBFilterConfigSchemaItem {
fn from(item: orb::ob_filter_config_schema_item) -> Self {
OBFilterConfigSchemaItem { inner: item }
}
}
pub struct OBFilterConfigSchemaList {
inner: *mut orb::ob_filter_config_schema_list,
}
drop_ob_object!(
OBFilterConfigSchemaList,
ob_delete_filter_config_schema_list
);
impl OBFilterConfigSchemaList {
pub(crate) fn new(inner: *mut orb::ob_filter_config_schema_list) -> Self {
OBFilterConfigSchemaList { inner }
}
pub fn get_count(&self) -> Result<u32, OBError> {
let mut err_ptr = std::ptr::null_mut();
let count =
unsafe { orb::ob_filter_config_schema_list_get_count(self.inner, &mut err_ptr) };
OBError::consume(err_ptr)?;
Ok(count)
}
pub fn get_filter_config_item(&self, index: u32) -> Result<OBFilterConfigSchemaItem, OBError> {
let mut err_ptr = std::ptr::null_mut();
let item =
unsafe { orb::ob_filter_config_schema_list_get_item(self.inner, index, &mut err_ptr) };
OBError::consume(err_ptr)?;
Ok(OBFilterConfigSchemaItem::from(item))
}
}
pub struct OBFilter {
inner: *mut orb::ob_filter,
}
drop_ob_object!(OBFilter, ob_delete_filter);
impl OBFilter {
pub fn new(name: &CStr) -> Result<Option<Self>, OBError> {
let mut err_ptr = std::ptr::null_mut();
let filter = unsafe { orb::ob_create_filter(name.as_ptr(), &mut err_ptr) };
OBError::consume(err_ptr)?;
if filter.is_null() {
Ok(None)
} else {
Ok(Some(OBFilter { inner: filter }))
}
}
pub fn process(&self, input_frame: &OBFrame) -> Result<OBFrame, OBError> {
let mut err_ptr = std::ptr::null_mut();
let output_frame =
unsafe { orb::ob_filter_process(self.inner, input_frame.inner(), &mut err_ptr) };
OBError::consume(err_ptr)?;
Ok(OBFrame::new(output_frame))
}
pub fn get_config_schema_list(&self) -> Result<OBFilterConfigSchemaList, OBError> {
let mut err_ptr = std::ptr::null_mut();
let schema_list =
unsafe { orb::ob_filter_get_config_schema_list(self.inner, &mut err_ptr) };
OBError::consume(err_ptr)?;
Ok(OBFilterConfigSchemaList::new(schema_list))
}
pub fn get_config_value(&self, name: &CStr) -> Result<f64, OBError> {
let mut err_ptr = std::ptr::null_mut();
let value =
unsafe { orb::ob_filter_get_config_value(self.inner, name.as_ptr(), &mut err_ptr) };
OBError::consume(err_ptr)?;
Ok(value)
}
pub fn set_config_value(&self, name: &CStr, value: f64) -> Result<(), OBError> {
let mut err_ptr = std::ptr::null_mut();
unsafe { orb::ob_filter_set_config_value(self.inner, name.as_ptr(), value, &mut err_ptr) };
OBError::consume(err_ptr)
}
pub fn set_align_to(&self, stream_profile: &OBStreamProfile) -> Result<(), OBError> {
let mut err_ptr = std::ptr::null_mut();
unsafe {
orb::ob_align_filter_set_align_to_stream_profile(
self.inner,
stream_profile.inner(),
&mut err_ptr,
)
};
OBError::consume(err_ptr)
}
}