xref: /aosp_15_r20/external/virtio-media/device/src/protocol.rs (revision 1b4853f54772485c5dd4001ae33a7a958bcc97a1)
1*1b4853f5SAndroid Build Coastguard Worker // Copyright 2024 The ChromiumOS Authors
2*1b4853f5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*1b4853f5SAndroid Build Coastguard Worker // found in the LICENSE file.
4*1b4853f5SAndroid Build Coastguard Worker 
5*1b4853f5SAndroid Build Coastguard Worker use enumn::N;
6*1b4853f5SAndroid Build Coastguard Worker use v4l2r::bindings::v4l2_event;
7*1b4853f5SAndroid Build Coastguard Worker use v4l2r::ioctl::V4l2Buffer;
8*1b4853f5SAndroid Build Coastguard Worker use zerocopy::AsBytes;
9*1b4853f5SAndroid Build Coastguard Worker use zerocopy::FromBytes;
10*1b4853f5SAndroid Build Coastguard Worker use zerocopy::FromZeroes;
11*1b4853f5SAndroid Build Coastguard Worker 
12*1b4853f5SAndroid Build Coastguard Worker pub const VIRTIO_ID_MEDIA: u32 = 49;
13*1b4853f5SAndroid Build Coastguard Worker 
14*1b4853f5SAndroid Build Coastguard Worker const VIRTIO_MEDIA_CARD_NAME_LEN: usize = 32;
15*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug, AsBytes)]
16*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
17*1b4853f5SAndroid Build Coastguard Worker pub struct VirtioMediaDeviceConfig {
18*1b4853f5SAndroid Build Coastguard Worker     /// The device_caps field of struct video_device.
19*1b4853f5SAndroid Build Coastguard Worker     pub device_caps: u32,
20*1b4853f5SAndroid Build Coastguard Worker     /// The vfl_devnode_type of the device.
21*1b4853f5SAndroid Build Coastguard Worker     pub device_type: u32,
22*1b4853f5SAndroid Build Coastguard Worker     /// The `card` field of v4l2_capability.
23*1b4853f5SAndroid Build Coastguard Worker     pub card: [u8; VIRTIO_MEDIA_CARD_NAME_LEN],
24*1b4853f5SAndroid Build Coastguard Worker }
25*1b4853f5SAndroid Build Coastguard Worker 
26*1b4853f5SAndroid Build Coastguard Worker impl AsRef<[u8]> for VirtioMediaDeviceConfig {
as_ref(&self) -> &[u8]27*1b4853f5SAndroid Build Coastguard Worker     fn as_ref(&self) -> &[u8] {
28*1b4853f5SAndroid Build Coastguard Worker         self.as_bytes()
29*1b4853f5SAndroid Build Coastguard Worker     }
30*1b4853f5SAndroid Build Coastguard Worker }
31*1b4853f5SAndroid Build Coastguard Worker 
32*1b4853f5SAndroid Build Coastguard Worker pub const VIRTIO_MEDIA_CMD_OPEN: u32 = 1;
33*1b4853f5SAndroid Build Coastguard Worker pub const VIRTIO_MEDIA_CMD_CLOSE: u32 = 2;
34*1b4853f5SAndroid Build Coastguard Worker pub const VIRTIO_MEDIA_CMD_IOCTL: u32 = 3;
35*1b4853f5SAndroid Build Coastguard Worker pub const VIRTIO_MEDIA_CMD_MMAP: u32 = 4;
36*1b4853f5SAndroid Build Coastguard Worker pub const VIRTIO_MEDIA_CMD_MUNMAP: u32 = 5;
37*1b4853f5SAndroid Build Coastguard Worker 
38*1b4853f5SAndroid Build Coastguard Worker pub const VIRTIO_MEDIA_MMAP_FLAG_RW: u32 = 1 << 0;
39*1b4853f5SAndroid Build Coastguard Worker 
40*1b4853f5SAndroid Build Coastguard Worker #[derive(PartialEq, Eq, PartialOrd, Ord, N, Clone, Copy, Debug)]
41*1b4853f5SAndroid Build Coastguard Worker #[repr(u32)]
42*1b4853f5SAndroid Build Coastguard Worker #[allow(non_camel_case_types)]
43*1b4853f5SAndroid Build Coastguard Worker pub enum V4l2Ioctl {
44*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_QUERYCAP = 0,
45*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_ENUM_FMT = 2,
46*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_FMT = 4,
47*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_FMT = 5,
48*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_REQBUFS = 8,
49*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_QUERYBUF = 9,
50*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_FBUF = 10,
51*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_FBUF = 11,
52*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_OVERLAY = 14,
53*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_QBUF = 15,
54*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_EXPBUF = 16,
55*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_DQBUF = 17,
56*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_STREAMON = 18,
57*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_STREAMOFF = 19,
58*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_PARM = 21,
59*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_PARM = 22,
60*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_STD = 23,
61*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_STD = 24,
62*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_ENUMSTD = 25,
63*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_ENUMINPUT = 26,
64*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_CTRL = 27,
65*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_CTRL = 28,
66*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_TUNER = 29,
67*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_TUNER = 30,
68*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_AUDIO = 33,
69*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_AUDIO = 34,
70*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_QUERYCTRL = 36,
71*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_QUERYMENU = 37,
72*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_INPUT = 38,
73*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_INPUT = 39,
74*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_EDID = 40,
75*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_EDID = 41,
76*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_OUTPUT = 46,
77*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_OUTPUT = 47,
78*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_ENUMOUTPUT = 48,
79*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_AUDOUT = 49,
80*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_AUDOUT = 50,
81*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_MODULATOR = 54,
82*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_MODULATOR = 55,
83*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_FREQUENCY = 56,
84*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_FREQUENCY = 57,
85*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_CROPCAP = 58,
86*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_CROP = 59,
87*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_CROP = 60,
88*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_JPEGCOMP = 61,
89*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_JPEGCOMP = 62,
90*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_QUERYSTD = 63,
91*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_TRY_FMT = 64,
92*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_ENUMAUDIO = 65,
93*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_ENUMAUDOUT = 66,
94*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_PRIORITY = 67,
95*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_PRIORITY = 68,
96*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_SLICED_VBI_CAP = 69,
97*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_LOG_STATUS = 70,
98*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_EXT_CTRLS = 71,
99*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_EXT_CTRLS = 72,
100*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_TRY_EXT_CTRLS = 73,
101*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_ENUM_FRAMESIZES = 74,
102*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_ENUM_FRAMEINTERVALS = 75,
103*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_ENC_INDEX = 76,
104*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_ENCODER_CMD = 77,
105*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_TRY_ENCODER_CMD = 78,
106*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_DBG_S_REGISTER = 79,
107*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_DBG_G_REGISTER = 80,
108*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_HW_FREQ_SEEK = 82,
109*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_DV_TIMINGS = 87,
110*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_DV_TIMINGS = 88,
111*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_DQEVENT = 89,
112*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_SUBSCRIBE_EVENT = 90,
113*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_UNSUBSCRIBE_EVENT = 91,
114*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_CREATE_BUFS = 92,
115*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_PREPARE_BUF = 93,
116*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_G_SELECTION = 94,
117*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_S_SELECTION = 95,
118*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_DECODER_CMD = 96,
119*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_TRY_DECODER_CMD = 97,
120*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_ENUM_DV_TIMINGS = 98,
121*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_QUERY_DV_TIMINGS = 99,
122*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_DV_TIMINGS_CAP = 100,
123*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_ENUM_FREQ_BANDS = 101,
124*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_DBG_G_CHIP_INFO = 102,
125*1b4853f5SAndroid Build Coastguard Worker     VIDIOC_QUERY_EXT_CTRL = 103,
126*1b4853f5SAndroid Build Coastguard Worker }
127*1b4853f5SAndroid Build Coastguard Worker 
128*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
129*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug, FromZeroes, FromBytes)]
130*1b4853f5SAndroid Build Coastguard Worker pub struct SgEntry {
131*1b4853f5SAndroid Build Coastguard Worker     pub start: u64,
132*1b4853f5SAndroid Build Coastguard Worker     pub len: u32,
133*1b4853f5SAndroid Build Coastguard Worker     __padding: u32,
134*1b4853f5SAndroid Build Coastguard Worker }
135*1b4853f5SAndroid Build Coastguard Worker 
136*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
137*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug, FromZeroes, FromBytes)]
138*1b4853f5SAndroid Build Coastguard Worker pub struct CmdHeader {
139*1b4853f5SAndroid Build Coastguard Worker     pub cmd: u32,
140*1b4853f5SAndroid Build Coastguard Worker     _padding: u32,
141*1b4853f5SAndroid Build Coastguard Worker }
142*1b4853f5SAndroid Build Coastguard Worker 
143*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
144*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug, AsBytes)]
145*1b4853f5SAndroid Build Coastguard Worker pub struct RespHeader {
146*1b4853f5SAndroid Build Coastguard Worker     pub errno: i32,
147*1b4853f5SAndroid Build Coastguard Worker     _padding: u32,
148*1b4853f5SAndroid Build Coastguard Worker }
149*1b4853f5SAndroid Build Coastguard Worker 
150*1b4853f5SAndroid Build Coastguard Worker impl RespHeader {
ok() -> Self151*1b4853f5SAndroid Build Coastguard Worker     pub fn ok() -> Self {
152*1b4853f5SAndroid Build Coastguard Worker         Self {
153*1b4853f5SAndroid Build Coastguard Worker             errno: 0,
154*1b4853f5SAndroid Build Coastguard Worker             _padding: 0,
155*1b4853f5SAndroid Build Coastguard Worker         }
156*1b4853f5SAndroid Build Coastguard Worker     }
157*1b4853f5SAndroid Build Coastguard Worker 
err(errno: i32) -> Self158*1b4853f5SAndroid Build Coastguard Worker     pub fn err(errno: i32) -> Self {
159*1b4853f5SAndroid Build Coastguard Worker         Self { errno, _padding: 0 }
160*1b4853f5SAndroid Build Coastguard Worker     }
161*1b4853f5SAndroid Build Coastguard Worker }
162*1b4853f5SAndroid Build Coastguard Worker 
163*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
164*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug, FromZeroes, FromBytes)]
165*1b4853f5SAndroid Build Coastguard Worker pub struct OpenCmd {}
166*1b4853f5SAndroid Build Coastguard Worker 
167*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
168*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug, AsBytes)]
169*1b4853f5SAndroid Build Coastguard Worker pub struct OpenResp {
170*1b4853f5SAndroid Build Coastguard Worker     hdr: RespHeader,
171*1b4853f5SAndroid Build Coastguard Worker     session_id: u32,
172*1b4853f5SAndroid Build Coastguard Worker     _padding: u32,
173*1b4853f5SAndroid Build Coastguard Worker }
174*1b4853f5SAndroid Build Coastguard Worker 
175*1b4853f5SAndroid Build Coastguard Worker impl OpenResp {
ok(session_id: u32) -> Self176*1b4853f5SAndroid Build Coastguard Worker     pub fn ok(session_id: u32) -> Self {
177*1b4853f5SAndroid Build Coastguard Worker         Self {
178*1b4853f5SAndroid Build Coastguard Worker             hdr: RespHeader::ok(),
179*1b4853f5SAndroid Build Coastguard Worker             session_id,
180*1b4853f5SAndroid Build Coastguard Worker             _padding: 0,
181*1b4853f5SAndroid Build Coastguard Worker         }
182*1b4853f5SAndroid Build Coastguard Worker     }
183*1b4853f5SAndroid Build Coastguard Worker }
184*1b4853f5SAndroid Build Coastguard Worker 
185*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
186*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug, FromZeroes, FromBytes)]
187*1b4853f5SAndroid Build Coastguard Worker pub struct CloseCmd {
188*1b4853f5SAndroid Build Coastguard Worker     pub session_id: u32,
189*1b4853f5SAndroid Build Coastguard Worker     _padding: u32,
190*1b4853f5SAndroid Build Coastguard Worker }
191*1b4853f5SAndroid Build Coastguard Worker 
192*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
193*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug, FromZeroes, FromBytes)]
194*1b4853f5SAndroid Build Coastguard Worker pub struct IoctlCmd {
195*1b4853f5SAndroid Build Coastguard Worker     pub session_id: u32,
196*1b4853f5SAndroid Build Coastguard Worker     pub code: u32,
197*1b4853f5SAndroid Build Coastguard Worker }
198*1b4853f5SAndroid Build Coastguard Worker 
199*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
200*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug, FromZeroes, FromBytes)]
201*1b4853f5SAndroid Build Coastguard Worker pub struct MmapCmd {
202*1b4853f5SAndroid Build Coastguard Worker     pub session_id: u32,
203*1b4853f5SAndroid Build Coastguard Worker     pub flags: u32,
204*1b4853f5SAndroid Build Coastguard Worker     pub offset: u32,
205*1b4853f5SAndroid Build Coastguard Worker }
206*1b4853f5SAndroid Build Coastguard Worker 
207*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
208*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug, AsBytes)]
209*1b4853f5SAndroid Build Coastguard Worker pub struct MmapResp {
210*1b4853f5SAndroid Build Coastguard Worker     hdr: RespHeader,
211*1b4853f5SAndroid Build Coastguard Worker     guest_addr: u64,
212*1b4853f5SAndroid Build Coastguard Worker     len: u64,
213*1b4853f5SAndroid Build Coastguard Worker }
214*1b4853f5SAndroid Build Coastguard Worker 
215*1b4853f5SAndroid Build Coastguard Worker impl MmapResp {
ok(addr: u64, len: u64) -> Self216*1b4853f5SAndroid Build Coastguard Worker     pub fn ok(addr: u64, len: u64) -> Self {
217*1b4853f5SAndroid Build Coastguard Worker         Self {
218*1b4853f5SAndroid Build Coastguard Worker             hdr: RespHeader::ok(),
219*1b4853f5SAndroid Build Coastguard Worker             guest_addr: addr,
220*1b4853f5SAndroid Build Coastguard Worker             len,
221*1b4853f5SAndroid Build Coastguard Worker         }
222*1b4853f5SAndroid Build Coastguard Worker     }
223*1b4853f5SAndroid Build Coastguard Worker }
224*1b4853f5SAndroid Build Coastguard Worker 
225*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
226*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug, FromZeroes, FromBytes)]
227*1b4853f5SAndroid Build Coastguard Worker pub struct MunmapCmd {
228*1b4853f5SAndroid Build Coastguard Worker     pub guest_addr: u64,
229*1b4853f5SAndroid Build Coastguard Worker }
230*1b4853f5SAndroid Build Coastguard Worker 
231*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
232*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug, AsBytes)]
233*1b4853f5SAndroid Build Coastguard Worker pub struct MunmapResp {
234*1b4853f5SAndroid Build Coastguard Worker     hdr: RespHeader,
235*1b4853f5SAndroid Build Coastguard Worker }
236*1b4853f5SAndroid Build Coastguard Worker 
237*1b4853f5SAndroid Build Coastguard Worker impl MunmapResp {
ok() -> Self238*1b4853f5SAndroid Build Coastguard Worker     pub fn ok() -> Self {
239*1b4853f5SAndroid Build Coastguard Worker         Self {
240*1b4853f5SAndroid Build Coastguard Worker             hdr: RespHeader::ok(),
241*1b4853f5SAndroid Build Coastguard Worker         }
242*1b4853f5SAndroid Build Coastguard Worker     }
243*1b4853f5SAndroid Build Coastguard Worker }
244*1b4853f5SAndroid Build Coastguard Worker 
245*1b4853f5SAndroid Build Coastguard Worker pub const VIRTIO_MEDIA_EVENT_ERROR: u32 = 0;
246*1b4853f5SAndroid Build Coastguard Worker pub const VIRTIO_MEDIA_EVENT_DQBUF: u32 = 1;
247*1b4853f5SAndroid Build Coastguard Worker pub const VIRTIO_MEDIA_EVENT_EVENT: u32 = 2;
248*1b4853f5SAndroid Build Coastguard Worker 
249*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
250*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug, AsBytes)]
251*1b4853f5SAndroid Build Coastguard Worker pub struct EventHeader {
252*1b4853f5SAndroid Build Coastguard Worker     event: u32,
253*1b4853f5SAndroid Build Coastguard Worker     session_id: u32,
254*1b4853f5SAndroid Build Coastguard Worker }
255*1b4853f5SAndroid Build Coastguard Worker 
256*1b4853f5SAndroid Build Coastguard Worker impl EventHeader {
new(event: u32, session_id: u32) -> Self257*1b4853f5SAndroid Build Coastguard Worker     pub fn new(event: u32, session_id: u32) -> Self {
258*1b4853f5SAndroid Build Coastguard Worker         Self { event, session_id }
259*1b4853f5SAndroid Build Coastguard Worker     }
260*1b4853f5SAndroid Build Coastguard Worker }
261*1b4853f5SAndroid Build Coastguard Worker 
262*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
263*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug, AsBytes)]
264*1b4853f5SAndroid Build Coastguard Worker pub struct ErrorEvent {
265*1b4853f5SAndroid Build Coastguard Worker     hdr: EventHeader,
266*1b4853f5SAndroid Build Coastguard Worker     errno: i32,
267*1b4853f5SAndroid Build Coastguard Worker     _padding: u32,
268*1b4853f5SAndroid Build Coastguard Worker }
269*1b4853f5SAndroid Build Coastguard Worker 
270*1b4853f5SAndroid Build Coastguard Worker impl ErrorEvent {
new(session_id: u32, errno: i32) -> Self271*1b4853f5SAndroid Build Coastguard Worker     pub fn new(session_id: u32, errno: i32) -> Self {
272*1b4853f5SAndroid Build Coastguard Worker         Self {
273*1b4853f5SAndroid Build Coastguard Worker             hdr: EventHeader::new(VIRTIO_MEDIA_EVENT_ERROR, session_id),
274*1b4853f5SAndroid Build Coastguard Worker             errno,
275*1b4853f5SAndroid Build Coastguard Worker             _padding: 0,
276*1b4853f5SAndroid Build Coastguard Worker         }
277*1b4853f5SAndroid Build Coastguard Worker     }
278*1b4853f5SAndroid Build Coastguard Worker }
279*1b4853f5SAndroid Build Coastguard Worker 
280*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
281*1b4853f5SAndroid Build Coastguard Worker #[derive(Debug)]
282*1b4853f5SAndroid Build Coastguard Worker pub struct DequeueBufferEvent {
283*1b4853f5SAndroid Build Coastguard Worker     hdr: EventHeader,
284*1b4853f5SAndroid Build Coastguard Worker     v4l2_buffer: V4l2Buffer,
285*1b4853f5SAndroid Build Coastguard Worker }
286*1b4853f5SAndroid Build Coastguard Worker 
287*1b4853f5SAndroid Build Coastguard Worker impl DequeueBufferEvent {
new(session_id: u32, v4l2_buffer: V4l2Buffer) -> Self288*1b4853f5SAndroid Build Coastguard Worker     pub fn new(session_id: u32, v4l2_buffer: V4l2Buffer) -> Self {
289*1b4853f5SAndroid Build Coastguard Worker         Self {
290*1b4853f5SAndroid Build Coastguard Worker             hdr: EventHeader::new(VIRTIO_MEDIA_EVENT_DQBUF, session_id),
291*1b4853f5SAndroid Build Coastguard Worker             v4l2_buffer,
292*1b4853f5SAndroid Build Coastguard Worker         }
293*1b4853f5SAndroid Build Coastguard Worker     }
294*1b4853f5SAndroid Build Coastguard Worker }
295*1b4853f5SAndroid Build Coastguard Worker 
296*1b4853f5SAndroid Build Coastguard Worker #[repr(C)]
297*1b4853f5SAndroid Build Coastguard Worker pub struct SessionEvent {
298*1b4853f5SAndroid Build Coastguard Worker     pub hdr: EventHeader,
299*1b4853f5SAndroid Build Coastguard Worker     v4l2_event: v4l2_event,
300*1b4853f5SAndroid Build Coastguard Worker }
301*1b4853f5SAndroid Build Coastguard Worker 
302*1b4853f5SAndroid Build Coastguard Worker impl SessionEvent {
new(session_id: u32, v4l2_event: v4l2_event) -> Self303*1b4853f5SAndroid Build Coastguard Worker     pub fn new(session_id: u32, v4l2_event: v4l2_event) -> Self {
304*1b4853f5SAndroid Build Coastguard Worker         Self {
305*1b4853f5SAndroid Build Coastguard Worker             hdr: EventHeader::new(VIRTIO_MEDIA_EVENT_EVENT, session_id),
306*1b4853f5SAndroid Build Coastguard Worker             v4l2_event,
307*1b4853f5SAndroid Build Coastguard Worker         }
308*1b4853f5SAndroid Build Coastguard Worker     }
309*1b4853f5SAndroid Build Coastguard Worker }
310*1b4853f5SAndroid Build Coastguard Worker 
311*1b4853f5SAndroid Build Coastguard Worker #[allow(clippy::large_enum_variant)]
312*1b4853f5SAndroid Build Coastguard Worker pub enum V4l2Event {
313*1b4853f5SAndroid Build Coastguard Worker     Error(ErrorEvent),
314*1b4853f5SAndroid Build Coastguard Worker     DequeueBuffer(DequeueBufferEvent),
315*1b4853f5SAndroid Build Coastguard Worker     Event(SessionEvent),
316*1b4853f5SAndroid Build Coastguard Worker }
317