onix 0.1.0

Decode image files using V4L2
Documentation
use crate::ioctl;
use crate::Media;
use nix::errno::Errno;
use std::os::fd::{AsFd, AsRawFd, BorrowedFd, FromRawFd, OwnedFd, RawFd};

/// 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, Errno> {
        let mut fd = -1;
        let fd = unsafe {
            ioctl::request_alloc(media.as_raw_fd(), &mut fd)?;
            OwnedFd::from_raw_fd(fd)
        };
        Ok(Request { fd })
    }

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

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

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

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

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