kamera 0.0.2

Camera API with a reduced feature set for basic use cases and learning
Documentation
#[cfg(target_os = "macos")]
use super::mac_avf as backend;

#[cfg(target_os = "windows")]
use super::win_mf as backend;

#[cfg(target_os = "linux")]
use super::linux_v4l2 as backend;

#[derive(Debug)]
pub struct Camera {
    inner: backend::Camera,
}

#[derive(Debug)]
pub struct Frame {
    inner: backend::Frame,
}

pub struct FrameData<'a> {
    inner: backend::FrameData<'a>,
}

impl Camera {
    pub fn new_default_device() -> Self {
        Self { inner: backend::Camera::new_default_device() }
    }

    pub fn start(&self) {
        self.inner.start();
    }

    pub fn stop(&self) {
        self.inner.stop();
    }

    pub fn wait_for_frame(&self) -> Option<Frame> {
        self.inner.wait_for_frame().map(|inner| Frame { inner })
    }

    pub fn change_device(&mut self) {
        self.inner.change_device();
    }
}

impl Frame {
    pub fn data(&self) -> FrameData {
        FrameData { inner: self.inner.data() }
    }

    pub fn size_u32(&self) -> (u32, u32) {
        self.inner.size_u32()
    }
}

impl<'a> FrameData<'a> {
    pub fn data_u8(&self) -> &[u8] {
        self.inner.data_u8()
    }

    pub fn data_u32(&self) -> &[u32] {
        self.inner.data_u32()
    }
}

pub(crate) trait InnerCamera: std::fmt::Debug {
    type Frame;

    fn new_default_device() -> Self;
    fn start(&self);
    fn stop(&self);
    fn wait_for_frame(&self) -> Option<Self::Frame>;
    fn change_device(&mut self);
}