use core::ffi::c_void;
use core::ptr;
use apple_cf::cm::CMSampleBuffer;
use crate::error::VTError;
use crate::ffi;
pub struct FrameSilo {
inner: ffi::VTFrameSiloRef,
}
unsafe impl Send for FrameSilo {}
unsafe impl Sync for FrameSilo {}
impl Drop for FrameSilo {
fn drop(&mut self) {
if !self.inner.is_null() {
unsafe { ffi::CFRelease(self.inner.cast()) };
self.inner = ptr::null_mut();
}
}
}
impl FrameSilo {
pub fn new() -> Result<Self, VTError> {
let mut p: ffi::VTFrameSiloRef = ptr::null_mut();
let s = unsafe {
ffi::VTFrameSiloCreate(
ffi::kCFAllocatorDefault,
ptr::null(),
ffi::CMTimeRange::INVALID,
ptr::null(),
&mut p,
)
};
if s != 0 || p.is_null() {
return Err(VTError::SessionCreateFailed(s));
}
Ok(Self { inner: p })
}
pub fn add_sample_buffer(&self, sample: &CMSampleBuffer) -> Result<(), VTError> {
let s = unsafe {
ffi::VTFrameSiloAddSampleBuffer(self.inner, sample.as_ptr().cast::<c_void>())
};
if s == 0 {
Ok(())
} else {
Err(VTError::EncodeFailed(s))
}
}
pub fn progress_of_current_pass(&self) -> Result<f32, VTError> {
let mut p: f32 = 0.0;
let s = unsafe { ffi::VTFrameSiloGetProgressOfCurrentPass(self.inner, &mut p) };
if s == 0 {
Ok(p)
} else {
Err(VTError::EncodeFailed(s))
}
}
#[must_use]
pub const fn as_ptr(&self) -> ffi::VTFrameSiloRef {
self.inner
}
}
pub struct MultiPassStorage {
inner: ffi::VTMultiPassStorageRef,
}
unsafe impl Send for MultiPassStorage {}
unsafe impl Sync for MultiPassStorage {}
impl Drop for MultiPassStorage {
fn drop(&mut self) {
if !self.inner.is_null() {
unsafe {
let _ = ffi::VTMultiPassStorageClose(self.inner);
ffi::CFRelease(self.inner.cast());
}
self.inner = ptr::null_mut();
}
}
}
impl MultiPassStorage {
pub fn new() -> Result<Self, VTError> {
let mut p: ffi::VTMultiPassStorageRef = ptr::null_mut();
let s = unsafe {
ffi::VTMultiPassStorageCreate(
ffi::kCFAllocatorDefault,
ptr::null(),
ffi::CMTimeRange::INVALID,
ptr::null(),
&mut p,
)
};
if s != 0 || p.is_null() {
return Err(VTError::SessionCreateFailed(s));
}
Ok(Self { inner: p })
}
#[must_use]
pub const fn as_ptr(&self) -> ffi::VTMultiPassStorageRef {
self.inner
}
}