use cxx::UniquePtr;
use crate::{
error::HResult,
ffi,
handles::{Frame, ProcessedImage},
};
pub trait Callback: Send + Sync + 'static {
fn on_read_complete(&self, user_data: u64, result: HResult, frame: Option<Frame>);
fn on_process_complete(&self, user_data: u64, result: HResult, image: Option<ProcessedImage>);
fn on_decode_complete(&self, _user_data: u64, _result: HResult) {}
fn on_prepare_pipeline_complete(&self, _user_data: u64, _result: HResult) {}
}
pub(crate) struct CallbackBridge {
inner: Box<dyn Callback + Send + Sync>,
}
impl CallbackBridge {
pub(crate) fn new<C: Callback>(callback: C) -> Self {
Self {
inner: Box::new(callback),
}
}
pub(crate) fn on_read_complete(
&self,
user_data: u64,
result: i32,
frame: UniquePtr<ffi::BrawFrame>,
) {
let f = (!frame.is_null()).then(|| Frame::from_cxx(frame));
self.inner.on_read_complete(user_data, HResult(result), f);
}
pub(crate) fn on_process_complete(
&self,
user_data: u64,
result: i32,
image: UniquePtr<ffi::BrawProcessedImage>,
) {
let i = (!image.is_null()).then(|| ProcessedImage::from_cxx(image));
self.inner
.on_process_complete(user_data, HResult(result), i);
}
pub(crate) fn on_decode_complete(&self, user_data: u64, result: i32) {
self.inner.on_decode_complete(user_data, HResult(result));
}
pub(crate) fn on_prepare_pipeline_complete(&self, user_data: u64, result: i32) {
self.inner
.on_prepare_pipeline_complete(user_data, HResult(result));
}
}