v4l2_sys/
lib.rs

1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4
5include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
6
7// Bindgen does not handle C preprocessor macro functions, so does not handle any of the symbols
8// that depend on _IOC, _IO, _IOR, _IOW, _IOWR, etc. Use constant functions to add them.
9
10// C preprocessor macros originally from /usr/include/asm-generic/ioctl.h amended to be Rust
11// const functions.
12
13const fn _IOC(dir: u32, type_: char, nr: u32, size: usize) -> u32 {
14    (dir << _IOC_DIRSHIFT) | ((type_ as u32) << _IOC_TYPESHIFT) | (nr   << _IOC_NRSHIFT) | ((size as u32) << _IOC_SIZESHIFT)
15}
16
17const fn _IO(type_: char, nr: u32) -> u32 { _IOC(_IOC_NONE, type_, nr, 0) }
18const fn _IOR(type_: char, nr: u32, size: usize) -> u32 { _IOC(_IOC_READ, type_, nr, size) }
19const fn _IOW(type_: char, nr: u32, size: usize) -> u32 { _IOC(_IOC_WRITE, type_, nr, size) }
20const fn _IOWR(type_: char, nr: u32, size: usize) -> u32 { _IOC(_IOC_READ|_IOC_WRITE, type_, nr, size) }
21
22// C has a sizeof function, Rust handles this with this const function.
23
24use std::mem::size_of;
25
26// The relevant symbols from /usr/include/linux/videodev2.h
27
28pub const VIDIOC_QUERYCAP:u32 = _IOR('V',  0, size_of::<v4l2_capability>());
29pub const VIDIOC_ENUM_FMT:u32 = _IOWR('V',  2, size_of::<v4l2_fmtdesc>());
30pub const VIDIOC_G_FMT:u32 = _IOWR('V',  4, size_of::<v4l2_format>());
31pub const VIDIOC_S_FMT:u32 = _IOWR('V',  5, size_of::<v4l2_format>());
32pub const VIDIOC_REQBUFS:u32 = _IOWR('V',  8, size_of::<v4l2_requestbuffers>());
33pub const VIDIOC_QUERYBUF:u32 = _IOWR('V',  9, size_of::<v4l2_buffer>());
34pub const VIDIOC_G_FBUF:u32 = _IOR('V', 10, size_of::<v4l2_framebuffer>());
35pub const VIDIOC_S_FBUF:u32 = _IOW('V', 11, size_of::<v4l2_framebuffer>());
36pub const VIDIOC_OVERLAY:u32 = _IOW('V', 14, size_of::<u32>()); // TODO check C int is Rust u32.
37pub const VIDIOC_QBUF:u32 = _IOWR('V', 15, size_of::<v4l2_buffer>());
38pub const VIDIOC_EXPBUF:u32 = _IOWR('V', 16, size_of::<v4l2_exportbuffer>());
39pub const VIDIOC_DQBUF:u32 = _IOWR('V', 17, size_of::<v4l2_buffer>());
40pub const VIDIOC_STREAMON:u32 = _IOW('V', 18, size_of::<u32>()); // TODO check C int is Rust u32.
41pub const VIDIOC_STREAMOFF:u32 = _IOW('V', 19, size_of::<u32>()); // TODO check C int is Rust u32.
42pub const VIDIOC_G_PARM:u32 = _IOWR('V', 21, size_of::<v4l2_streamparm>());
43pub const VIDIOC_S_PARM:u32 = _IOWR('V', 22, size_of::<v4l2_streamparm>());
44pub const VIDIOC_G_STD:u32 = _IOR('V', 23, size_of::<v4l2_std_id>());
45pub const VIDIOC_S_STD:u32 = _IOW('V', 24, size_of::<v4l2_std_id>());
46pub const VIDIOC_ENUMSTD:u32 = _IOWR('V', 25, size_of::<v4l2_standard>());
47pub const VIDIOC_ENUMINPUT:u32 = _IOWR('V', 26, size_of::<v4l2_input>());
48pub const VIDIOC_G_CTRL:u32 = _IOWR('V', 27, size_of::<v4l2_control>());
49pub const VIDIOC_S_CTRL:u32 = _IOWR('V', 28, size_of::<v4l2_control>());
50pub const VIDIOC_G_TUNER:u32 = _IOWR('V', 29, size_of::<v4l2_tuner>());
51pub const VIDIOC_S_TUNER:u32 = _IOW('V', 30, size_of::<v4l2_tuner>());
52pub const VIDIOC_G_AUDIO:u32 = _IOR('V', 33, size_of::<v4l2_audio>());
53pub const VIDIOC_S_AUDIO:u32 = _IOW('V', 34, size_of::<v4l2_audio>());
54pub const VIDIOC_QUERYCTRL:u32 = _IOWR('V', 36, size_of::<v4l2_queryctrl>());
55pub const VIDIOC_QUERYMENU:u32 = _IOWR('V', 37, size_of::<v4l2_querymenu>());
56pub const VIDIOC_G_INPUT:u32 = _IOR('V', 38,  size_of::<u32>()); // TODO check C int is Rust u32.
57pub const VIDIOC_S_INPUT:u32 = _IOWR('V', 39,  size_of::<u32>()); // TODO check C int is Rust u32.
58pub const VIDIOC_G_EDID:u32 = _IOWR('V', 40, size_of::<v4l2_edid>());
59pub const VIDIOC_S_EDID:u32 = _IOWR('V', 41, size_of::<v4l2_edid>());
60pub const VIDIOC_G_OUTPUT:u32 = _IOR('V', 46,  size_of::<u32>()); // TODO check C int is Rust u32.
61pub const VIDIOC_S_OUTPUT:u32 = _IOWR('V', 47,  size_of::<u32>()); // TODO check C int is Rust u32.
62pub const VIDIOC_ENUMOUTPUT:u32 = _IOWR('V', 48, size_of::<v4l2_output>());
63pub const VIDIOC_G_AUDOUT:u32 = _IOR('V', 49, size_of::<v4l2_audioout>());
64pub const VIDIOC_S_AUDOUT:u32 = _IOW('V', 50, size_of::<v4l2_audioout>());
65pub const VIDIOC_G_MODULATOR:u32 = _IOWR('V', 54, size_of::<v4l2_modulator>());
66pub const VIDIOC_S_MODULATOR:u32 = _IOW('V', 55, size_of::<v4l2_modulator>());
67pub const VIDIOC_G_FREQUENCY:u32 = _IOWR('V', 56, size_of::<v4l2_frequency>());
68pub const VIDIOC_S_FREQUENCY:u32 = _IOW('V', 57, size_of::<v4l2_frequency>());
69pub const VIDIOC_CROPCAP:u32 = _IOWR('V', 58, size_of::<v4l2_cropcap>());
70pub const VIDIOC_G_CROP:u32 = _IOWR('V', 59, size_of::<v4l2_crop>());
71pub const VIDIOC_S_CROP:u32 = _IOW('V', 60, size_of::<v4l2_crop>());
72pub const VIDIOC_G_JPEGCOMP:u32 = _IOR('V', 61, size_of::<v4l2_jpegcompression>());
73pub const VIDIOC_S_JPEGCOMP:u32 = _IOW('V', 62, size_of::<v4l2_jpegcompression>());
74pub const VIDIOC_QUERYSTD:u32 = _IOR('V', 63, size_of::<v4l2_std_id>());
75pub const VIDIOC_TRY_FMT:u32 = _IOWR('V', 64, size_of::<v4l2_format>());
76pub const VIDIOC_ENUMAUDIO:u32 = _IOWR('V', 65, size_of::<v4l2_audio>());
77pub const VIDIOC_ENUMAUDOUT:u32 = _IOWR('V', 66, size_of::<v4l2_audioout>());
78pub const VIDIOC_G_PRIORITY:u32 = _IOR('V', 67, size_of::<u32>()); /* enum v4l2_priority */
79pub const VIDIOC_S_PRIORITY:u32 = _IOW('V', 68, size_of::<u32>()); /* enum v4l2_priority */
80pub const VIDIOC_G_SLICED_VBI_CAP:u32 = _IOWR('V', 69, size_of::<v4l2_sliced_vbi_cap>());
81pub const VIDIOC_LOG_STATUS:u32 = _IO('V', 70);
82pub const VIDIOC_G_EXT_CTRLS:u32 = _IOWR('V', 71, size_of::<v4l2_ext_controls>());
83pub const VIDIOC_S_EXT_CTRLS:u32 = _IOWR('V', 72, size_of::<v4l2_ext_controls>());
84pub const VIDIOC_TRY_EXT_CTRLS:u32 = _IOWR('V', 73, size_of::<v4l2_ext_controls>());
85pub const VIDIOC_ENUM_FRAMESIZES:u32 = _IOWR('V', 74, size_of::<v4l2_frmsizeenum>());
86pub const VIDIOC_ENUM_FRAMEINTERVALS:u32 = _IOWR('V', 75, size_of::<v4l2_frmivalenum>());
87pub const VIDIOC_G_ENC_INDEX:u32 = _IOR('V', 76, size_of::<v4l2_enc_idx>());
88pub const VIDIOC_ENCODER_CMD:u32 = _IOWR('V', 77, size_of::<v4l2_encoder_cmd>());
89pub const VIDIOC_TRY_ENCODER_CMD:u32 = _IOWR('V', 78, size_of::<v4l2_encoder_cmd>());
90
91/*
92 * Experimental, meant for debugging, testing and internal use.
93 * Only implemented if CONFIG_VIDEO_ADV_DEBUG is defined.
94 * You must be root to use these ioctls. Never use these in applications!
95 */
96pub const VIDIOC_DBG_S_REGISTER:u32 = _IOW('V', 79, size_of::<v4l2_dbg_register>());
97pub const VIDIOC_DBG_G_REGISTER:u32 = _IOWR('V', 80, size_of::<v4l2_dbg_register>());
98
99pub const VIDIOC_S_HW_FREQ_SEEK:u32 = _IOW('V', 82, size_of::<v4l2_hw_freq_seek>());
100pub const VIDIOC_S_DV_TIMINGS:u32 = _IOWR('V', 87, size_of::<v4l2_dv_timings>());
101pub const VIDIOC_G_DV_TIMINGS:u32 = _IOWR('V', 88, size_of::<v4l2_dv_timings>());
102pub const VIDIOC_DQEVENT:u32 = _IOR('V', 89, size_of::<v4l2_event>());
103pub const VIDIOC_SUBSCRIBE_EVENT:u32 = _IOW('V', 90, size_of::<v4l2_event_subscription>());
104pub const VIDIOC_UNSUBSCRIBE_EVENT:u32 = _IOW('V', 91, size_of::<v4l2_event_subscription>());
105pub const VIDIOC_CREATE_BUFS:u32 = _IOWR('V', 92, size_of::<v4l2_create_buffers>());
106pub const VIDIOC_PREPARE_BUF:u32 = _IOWR('V', 93, size_of::<v4l2_buffer>());
107pub const VIDIOC_G_SELECTION:u32 = _IOWR('V', 94, size_of::<v4l2_selection>());
108pub const VIDIOC_S_SELECTION:u32 = _IOWR('V', 95, size_of::<v4l2_selection>());
109pub const VIDIOC_DECODER_CMD:u32 = _IOWR('V', 96, size_of::<v4l2_decoder_cmd>());
110pub const VIDIOC_TRY_DECODER_CMD:u32 = _IOWR('V', 97, size_of::<v4l2_decoder_cmd>());
111pub const VIDIOC_ENUM_DV_TIMINGS:u32 = _IOWR('V', 98, size_of::<v4l2_enum_dv_timings>());
112pub const VIDIOC_QUERY_DV_TIMINGS:u32 = _IOR('V', 99, size_of::<v4l2_dv_timings>());
113pub const VIDIOC_DV_TIMINGS_CAP:u32 = _IOWR('V', 100, size_of::<v4l2_dv_timings_cap>());
114pub const VIDIOC_ENUM_FREQ_BANDS:u32 = _IOWR('V', 101, size_of::<v4l2_frequency_band>());
115
116/*
117 * Experimental, meant for debugging, testing and internal use.
118 * Never use this in applications!
119 */
120pub const VIDIOC_DBG_G_CHIP_INFO:u32 = _IOWR('V', 102, size_of::<v4l2_dbg_chip_info>());
121
122pub const VIDIOC_QUERY_EXT_CTRL:u32 = _IOWR('V', 103, size_of::<v4l2_query_ext_ctrl>());
123
124#[cfg(test)]
125mod tests {
126
127    use super::*;
128
129    use rstest::rstest;
130
131    // TODO really need to test many more, if not all of the values.
132
133    #[rstest(
134        datum, expected,
135        case(VIDIOC_QUERYCAP, 2154321408),
136        case(VIDIOC_OVERLAY, 1074025998),
137        case(VIDIOC_G_PRIORITY, 2147767875),
138        case(VIDIOC_S_PRIORITY, 1074026052),
139        case(VIDIOC_LOG_STATUS, 22086),
140     )]
141    fn check_vidioc_symbol_values(datum: u32, expected: u32) {
142        assert_eq!(datum, expected);
143    }
144
145}