linux_video_core/impls/
formats.rs1use 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 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}