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