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