motioncam-decoder 0.1.0

Pure-Rust decoder for MotionCam RAW files
Documentation
use crate::error::{McRawError, Result};
use wide::u16x8;

#[inline(always)]
pub fn load_u8_to_u16x8(src: &[u8]) -> Result<u16x8> {
    let chunk: &[u8; 8] = src
        .get(..8)
        .ok_or(McRawError::TruncatedData)?
        .try_into()
        .map_err(|_| McRawError::TruncatedData)?;

    Ok(u16x8::from([
        chunk[0] as u16,
        chunk[1] as u16,
        chunk[2] as u16,
        chunk[3] as u16,
        chunk[4] as u16,
        chunk[5] as u16,
        chunk[6] as u16,
        chunk[7] as u16,
    ]))
}

#[inline(always)]
pub fn store_u16x8(dst: &mut [u16], val: u16x8) -> Result<()> {
    let arr: [u16; 8] = val.into();
    dst.get_mut(..8)
        .ok_or(McRawError::TruncatedData)?
        .copy_from_slice(&arr);
    Ok(())
}

#[inline(always)]
pub fn decode_header(input: &[u8]) -> Result<(u8, u16)> {
    let chunk: &[u8; 2] = input
        .get(..2)
        .ok_or(McRawError::TruncatedData)?
        .try_into()
        .map_err(|_| McRawError::TruncatedData)?;
    Ok(((chunk[0] >> 4) & 0x0F, ((chunk[0] & 0x0F) as u16) << 8 | chunk[1] as u16))
}