moq-v4l 0.1.0

Safe Video4Linux 2 bindings, forked from raymanfx/libv4l-rs with the kernel bindings checked in (no bindgen, no libclang)
Documentation
pub mod parameters;
pub use parameters::Parameters;

use std::convert::TryFrom;
use std::{io, mem};

use crate::buffer::Type;
use crate::device::Device;
use crate::format::FourCC;
use crate::format::{Description as FormatDescription, Format};
use crate::frameinterval::FrameInterval;
use crate::framesize::FrameSize;
use crate::sys::*;
use crate::v4l2;
use crate::video::traits::Output;

impl Output for Device {
	impl_enum_frameintervals!();
	impl_enum_framesizes!();
	impl_enum_formats!(Type::VideoOutput);
	impl_format!(Type::VideoOutput);
	impl_set_format!(Type::VideoOutput);

	fn params(&self) -> io::Result<Parameters> {
		unsafe {
			let mut v4l2_params = v4l2_streamparm {
				type_: Type::VideoOutput as u32,
				..mem::zeroed()
			};
			v4l2::ioctl(
				self.handle().fd(),
				v4l2::vidioc::VIDIOC_G_PARM,
				&mut v4l2_params as *mut _ as *mut std::os::raw::c_void,
			)?;

			Ok(Parameters::from(v4l2_params.parm.output))
		}
	}

	fn set_params(&self, params: &Parameters) -> io::Result<Parameters> {
		unsafe {
			let mut v4l2_params = v4l2_streamparm {
				type_: Type::VideoOutput as u32,
				parm: v4l2_streamparm__bindgen_ty_1 {
					output: (*params).into(),
				},
			};
			v4l2::ioctl(
				self.handle().fd(),
				v4l2::vidioc::VIDIOC_S_PARM,
				&mut v4l2_params as *mut _ as *mut std::os::raw::c_void,
			)?;
		}

		self.params()
	}
}