1 use std::os::unix::io::AsRawFd;
2 
3 use nix::errno::Errno;
4 use thiserror::Error;
5 
6 use crate::bindings::v4l2_jpegcompression;
7 
8 #[doc(hidden)]
9 mod ioctl {
10     use crate::bindings::v4l2_jpegcompression;
11 
12     nix::ioctl_read!(vidioc_g_jpegcomp, b'V', 61, v4l2_jpegcompression);
13     nix::ioctl_write_ptr!(vidioc_s_jpegcomp, b'V', 62, v4l2_jpegcompression);
14 }
15 
16 #[derive(Debug, Error)]
17 pub enum GJpegCompError {
18     #[error("ioctl error: {0}")]
19     IoctlError(Errno),
20 }
21 
22 impl From<GJpegCompError> for Errno {
from(err: GJpegCompError) -> Self23     fn from(err: GJpegCompError) -> Self {
24         match err {
25             GJpegCompError::IoctlError(e) => e,
26         }
27     }
28 }
29 
30 /// Safe wrapper around the `VIDIOC_G_JPEGCOMP` ioctl.
g_jpegcomp<O: From<v4l2_jpegcompression>>(fd: &impl AsRawFd) -> Result<O, GJpegCompError>31 pub fn g_jpegcomp<O: From<v4l2_jpegcompression>>(fd: &impl AsRawFd) -> Result<O, GJpegCompError> {
32     let mut jpegcomp: v4l2_jpegcompression = Default::default();
33 
34     match unsafe { ioctl::vidioc_g_jpegcomp(fd.as_raw_fd(), &mut jpegcomp) } {
35         Ok(_) => Ok(O::from(jpegcomp)),
36         Err(e) => Err(GJpegCompError::IoctlError(e)),
37     }
38 }
39 
40 /// Safe wrapper around the `VIDIOC_S_JPEGCOMP` ioctl.
s_jpegcomp<I: Into<v4l2_jpegcompression>>( fd: &impl AsRawFd, jpegcomp: I, ) -> Result<(), GJpegCompError>41 pub fn s_jpegcomp<I: Into<v4l2_jpegcompression>>(
42     fd: &impl AsRawFd,
43     jpegcomp: I,
44 ) -> Result<(), GJpegCompError> {
45     let jpegcomp: v4l2_jpegcompression = jpegcomp.into();
46 
47     match unsafe { ioctl::vidioc_s_jpegcomp(fd.as_raw_fd(), &jpegcomp) } {
48         Ok(_) => Ok(()),
49         Err(e) => Err(GJpegCompError::IoctlError(e)),
50     }
51 }
52