onix 0.2.0

Decode image files using V4L2
Documentation
use crate::ioctl;
use crate::Media;
use rustix::fd::{AsFd, AsRawFd, BorrowedFd, FromRawFd, OwnedFd, RawFd};
use rustix::io::Result;

/// Represents a request, allocated from a media device.
#[derive(Debug)]
#[repr(C)]
pub struct Request {
    fd: OwnedFd,
}

impl AsFd for Request {
    fn as_fd(&self) -> BorrowedFd {
        self.fd.as_fd()
    }
}

impl AsRawFd for Request {
    fn as_raw_fd(&self) -> RawFd {
        self.fd.as_raw_fd()
    }
}

impl Request {
    pub(crate) fn from_media(media: &Media) -> Result<Request> {
        let fd = unsafe {
            let fd = ioctl::request_alloc(media.as_fd())?;
            OwnedFd::from_raw_fd(fd)
        };
        Ok(Request { fd })
    }

    /// Queue a request.
    pub fn queue(&self) -> Result<()> {
        unsafe { ioctl::request_queue(self.as_fd()) }?;
        Ok(())
    }

    /// Reinitialise a request.
    pub fn reinit(&self) -> Result<()> {
        unsafe { ioctl::request_reinit(self.as_fd()) }?;
        Ok(())
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    macro_rules! assert_size (
        ($t:ty, $sz:expr) => (
            assert_eq!(core::mem::size_of::<$t>(), $sz);
        );
    );

    #[test]
    fn size() {
        assert_size!(Request, 4);
    }
}