Expand description
Safe definitions around V4L2 extended controls.
Extended controls are represented using the [SafeExtControl]
type, which is a transparent
wrapper for v4l2_ext_control
. It takes a generic parameter defining the actual control to
use, which limits its API to the methods safe to use for that control type.
A mutable reference to a single [SafeExtControl]
can be passed to ioctl methods such as
crate::ioctl::g_ext_ctrls
to get or set the value of that control only. Setting more than
one control at the same time requires to pass a type implementing AsV4l2ControlSlice
, that
returns a slice if the v4l2_ext_control
s to manipulate.
Since SafeExtControl
is a transparent wrapper around v4l2_ext_control
, an array of it can
safely implement AsV4l2ControlSlice
. Or, more conveniently, a #[repr(C)]
type containing
only SafeExtControl
s:
#[repr(C)]
struct Controls {
brightness: SafeExtControl<Brightness>,
contrast: SafeExtControl<Contrast>,
}
impl AsV4l2ControlSlice for &mut Controls {
fn as_v4l2_control_slice(&mut self) -> &mut [v4l2_ext_control] {
let ptr = (*self) as *mut Controls as *mut v4l2_ext_control;
unsafe { std::slice::from_raw_parts_mut(ptr, 2) }
}
}
let mut controls = Controls {
brightness: SafeExtControl::<Brightness>::from_value(128),
contrast: SafeExtControl::<Contrast>::from_value(128),
};
s_ext_ctrls(&device, CtrlWhich::Current, &mut controls).unwrap();
assert_eq!(controls.brightness.value(), 128);
assert_eq!(controls.contrast.value(), 128);
Due to the use of repr(C)
, the Controls
type has the same layout as an array of
v4l2_ext_control
s and thus can be passed to s_ext_ctrls
safely.
Sub-modules contain the type definitions for each control, organized by control class. Due to the large number of controls they are not all defined, so please add those you need if they are missing.
Modules§
Structs§
- Safe
ExtControl - Memory-safe
v4l2_ext_control
.
Traits§
- AsV4l2
Control Slice - Trait implemented by types that can be passed to the
g/s/try_ext_ctrls
family of functions. - ExtControl
Trait - Trait implemented by types representing a given control in order to define its properties and set of available methods.