use crate::ffi;
use crate::header::{decode_header, encode_header};
use crate::{EncodingInfo, Error, Result};
pub struct CppPointcloudDecoder;
impl CppPointcloudDecoder {
pub fn new() -> Self {
Self
}
pub fn decode(&self, data: &[u8]) -> Result<(EncodingInfo, Vec<u8>)> {
let decompressed_size =
unsafe { ffi::cloudini_c_decompressed_size(data.as_ptr(), data.len() as u32) };
if decompressed_size == 0 {
return Err(Error::Cpp(
"cloudini_c_decompressed_size returned 0 — header may be corrupt".into(),
));
}
let mut output = vec![0u8; decompressed_size as usize];
let written = unsafe {
ffi::cloudini_c_decode(
data.as_ptr(),
data.len() as u32,
output.as_mut_ptr(),
decompressed_size,
)
};
if written == 0 {
return Err(Error::Cpp("cloudini_c_decode returned 0".into()));
}
let (info, _) = decode_header(data)?;
Ok((info, output))
}
pub fn decode_with_info(&self, info: &EncodingInfo, compressed_data: &[u8]) -> Result<Vec<u8>> {
let mut full = encode_header(info);
full.extend_from_slice(compressed_data);
let (_, point_data) = self.decode(&full)?;
Ok(point_data)
}
}
impl Default for CppPointcloudDecoder {
fn default() -> Self {
Self::new()
}
}