use std::ffi::CString;
use std::os::raw::c_char;
use crate::registry::AcceleratorRegistry;
pub type HwAccelRegistry = AcceleratorRegistry;
#[unsafe(no_mangle)]
pub extern "C" fn ai_hwaccel_detect() -> *mut HwAccelRegistry {
let registry = AcceleratorRegistry::detect();
Box::into_raw(Box::new(registry))
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn ai_hwaccel_free(ptr: *mut HwAccelRegistry) {
if !ptr.is_null() {
drop(unsafe { Box::from_raw(ptr) });
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn ai_hwaccel_device_count(ptr: *const HwAccelRegistry) -> u32 {
if ptr.is_null() {
return 0;
}
let reg = unsafe { &*ptr };
reg.all_profiles().len() as u32
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn ai_hwaccel_has_accelerator(ptr: *const HwAccelRegistry) -> bool {
if ptr.is_null() {
return false;
}
let reg = unsafe { &*ptr };
reg.has_accelerator()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn ai_hwaccel_accelerator_memory(ptr: *const HwAccelRegistry) -> u64 {
if ptr.is_null() {
return 0;
}
let reg = unsafe { &*ptr };
reg.total_accelerator_memory()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn ai_hwaccel_json(ptr: *const HwAccelRegistry) -> *mut c_char {
if ptr.is_null() {
return std::ptr::null_mut();
}
let reg = unsafe { &*ptr };
match serde_json::to_string(reg) {
Ok(json) => match CString::new(json) {
Ok(cs) => cs.into_raw(),
Err(_) => std::ptr::null_mut(),
},
Err(_) => std::ptr::null_mut(),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn ai_hwaccel_free_string(ptr: *mut c_char) {
if !ptr.is_null() {
drop(unsafe { CString::from_raw(ptr) });
}
}