onix 0.1.0

Decode image files using V4L2
Documentation
use crate::DeviceInfo;
use crate::Request;
use crate::Topology;
use nix::errno::Errno;
use std::fs::OpenOptions;
use std::io;
use std::os::fd::{AsFd, AsRawFd, BorrowedFd, OwnedFd, RawFd};
use std::path::Path;

/// Represents a media API device, such as `/dev/media0`.
pub struct Media {
    fd: OwnedFd,
}

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

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

impl Media {
    /// Opens a new file descriptor to the given media device file path.
    pub fn open<P: AsRef<Path>>(filename: P) -> io::Result<Media> {
        let file = OpenOptions::new().read(true).write(true).open(filename)?;
        let fd = file.into();
        Ok(Media { fd })
    }

    /// Returns the description of this media device.
    pub fn device_info(&self) -> Result<DeviceInfo, Errno> {
        DeviceInfo::from_media(self)
    }

    /// Returns the topology of this media device.
    pub fn get_topology(&self) -> Result<Topology, Errno> {
        Topology::from_media(self)
    }

    /// Allocates a new request.
    pub fn request_alloc(&self) -> Result<Request, Errno> {
        Request::from_media(self)
    }
}

#[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!(Media, 4);
    }
}