linux_video_core/impls/
formats.rs

1use crate::{calls, types::*, utils, Internal, Result};
2use core::mem::MaybeUninit;
3use std::os::unix::io::RawFd;
4
5impl Internal<FmtDesc> {
6    pub fn query(fd: RawFd, index: u32, type_: BufferType) -> Result<Option<Self>> {
7        let fmt_desc = MaybeUninit::<FmtDesc>::zeroed();
8
9        unsafe_call!({
10            let mut fmt_desc = fmt_desc.assume_init();
11            fmt_desc.index = index;
12            fmt_desc.type_ = type_;
13            calls::enum_fmt(fd, &mut fmt_desc).map(|_| fmt_desc)
14        })
15        .and_then(|fmt_desc| {
16            utils::check_str(&fmt_desc.description)?;
17            Ok(Some(fmt_desc.into()))
18        })
19        .or_else(|error| {
20            if error.kind() == std::io::ErrorKind::InvalidInput {
21                Ok(None)
22            } else {
23                Err(error)
24            }
25        })
26    }
27}
28
29trivial_impls! {
30    FmtDesc {
31        /// Format description
32        getstr description: &str,
33    }
34}
35
36impl core::fmt::Display for FmtDesc {
37    fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
38        '#'.fmt(f)?;
39        self.index.fmt(f)?;
40        ' '.fmt(f)?;
41        self.type_.fmt(f)?;
42        ' '.fmt(f)?;
43        self.flags.fmt(f)?;
44        f.write_str(" '")?;
45        self.description().fmt(f)?;
46        f.write_str("' ")?;
47        self.pixel_format.fmt(f)?;
48        f.write_str(" @")?;
49        self.mbus_code.fmt(f)
50    }
51}