xref: /aosp_15_r20/external/crosvm/devices/src/virtio/video/control.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2020 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker //! Implementation of data structures for virtio-video controls.
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker use std::convert::From;
8*bb4ee6a4SAndroid Build Coastguard Worker use std::io;
9*bb4ee6a4SAndroid Build Coastguard Worker 
10*bb4ee6a4SAndroid Build Coastguard Worker use data_model::Le32;
11*bb4ee6a4SAndroid Build Coastguard Worker 
12*bb4ee6a4SAndroid Build Coastguard Worker use crate::virtio::video::format::BitrateMode;
13*bb4ee6a4SAndroid Build Coastguard Worker use crate::virtio::video::format::Format;
14*bb4ee6a4SAndroid Build Coastguard Worker use crate::virtio::video::format::Level;
15*bb4ee6a4SAndroid Build Coastguard Worker use crate::virtio::video::format::Profile;
16*bb4ee6a4SAndroid Build Coastguard Worker use crate::virtio::video::protocol::*;
17*bb4ee6a4SAndroid Build Coastguard Worker use crate::virtio::video::response::Response;
18*bb4ee6a4SAndroid Build Coastguard Worker use crate::virtio::Writer;
19*bb4ee6a4SAndroid Build Coastguard Worker 
20*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug)]
21*bb4ee6a4SAndroid Build Coastguard Worker pub enum QueryCtrlType {
22*bb4ee6a4SAndroid Build Coastguard Worker     Profile(Format),
23*bb4ee6a4SAndroid Build Coastguard Worker     Level(Format),
24*bb4ee6a4SAndroid Build Coastguard Worker }
25*bb4ee6a4SAndroid Build Coastguard Worker 
26*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug, Clone)]
27*bb4ee6a4SAndroid Build Coastguard Worker pub enum QueryCtrlResponse {
28*bb4ee6a4SAndroid Build Coastguard Worker     Profile(Vec<Profile>),
29*bb4ee6a4SAndroid Build Coastguard Worker     #[allow(dead_code)]
30*bb4ee6a4SAndroid Build Coastguard Worker     Level(Vec<Level>),
31*bb4ee6a4SAndroid Build Coastguard Worker }
32*bb4ee6a4SAndroid Build Coastguard Worker 
33*bb4ee6a4SAndroid Build Coastguard Worker impl Response for QueryCtrlResponse {
write(&self, w: &mut Writer) -> Result<(), io::Error>34*bb4ee6a4SAndroid Build Coastguard Worker     fn write(&self, w: &mut Writer) -> Result<(), io::Error> {
35*bb4ee6a4SAndroid Build Coastguard Worker         match self {
36*bb4ee6a4SAndroid Build Coastguard Worker             QueryCtrlResponse::Profile(ps) => {
37*bb4ee6a4SAndroid Build Coastguard Worker                 w.write_obj(virtio_video_query_control_resp_profile {
38*bb4ee6a4SAndroid Build Coastguard Worker                     num: Le32::from(ps.len() as u32),
39*bb4ee6a4SAndroid Build Coastguard Worker                     ..Default::default()
40*bb4ee6a4SAndroid Build Coastguard Worker                 })?;
41*bb4ee6a4SAndroid Build Coastguard Worker                 w.write_iter(ps.iter().map(|p| Le32::from(*p as u32)))
42*bb4ee6a4SAndroid Build Coastguard Worker             }
43*bb4ee6a4SAndroid Build Coastguard Worker             QueryCtrlResponse::Level(ls) => {
44*bb4ee6a4SAndroid Build Coastguard Worker                 w.write_obj(virtio_video_query_control_resp_level {
45*bb4ee6a4SAndroid Build Coastguard Worker                     num: Le32::from(ls.len() as u32),
46*bb4ee6a4SAndroid Build Coastguard Worker                     ..Default::default()
47*bb4ee6a4SAndroid Build Coastguard Worker                 })?;
48*bb4ee6a4SAndroid Build Coastguard Worker                 w.write_iter(ls.iter().map(|l| Le32::from(*l as u32)))
49*bb4ee6a4SAndroid Build Coastguard Worker             }
50*bb4ee6a4SAndroid Build Coastguard Worker         }
51*bb4ee6a4SAndroid Build Coastguard Worker     }
52*bb4ee6a4SAndroid Build Coastguard Worker }
53*bb4ee6a4SAndroid Build Coastguard Worker 
54*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug)]
55*bb4ee6a4SAndroid Build Coastguard Worker pub enum CtrlType {
56*bb4ee6a4SAndroid Build Coastguard Worker     Bitrate,
57*bb4ee6a4SAndroid Build Coastguard Worker     Profile,
58*bb4ee6a4SAndroid Build Coastguard Worker     Level,
59*bb4ee6a4SAndroid Build Coastguard Worker     ForceKeyframe,
60*bb4ee6a4SAndroid Build Coastguard Worker     BitrateMode,
61*bb4ee6a4SAndroid Build Coastguard Worker     BitratePeak,
62*bb4ee6a4SAndroid Build Coastguard Worker     PrependSpsPpsToIdr,
63*bb4ee6a4SAndroid Build Coastguard Worker }
64*bb4ee6a4SAndroid Build Coastguard Worker 
65*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug, Clone)]
66*bb4ee6a4SAndroid Build Coastguard Worker pub enum CtrlVal {
67*bb4ee6a4SAndroid Build Coastguard Worker     Bitrate(u32),
68*bb4ee6a4SAndroid Build Coastguard Worker     Profile(Profile),
69*bb4ee6a4SAndroid Build Coastguard Worker     Level(Level),
70*bb4ee6a4SAndroid Build Coastguard Worker     ForceKeyframe,
71*bb4ee6a4SAndroid Build Coastguard Worker     BitrateMode(BitrateMode),
72*bb4ee6a4SAndroid Build Coastguard Worker     BitratePeak(u32),
73*bb4ee6a4SAndroid Build Coastguard Worker     PrependSpsPpsToIdr(bool),
74*bb4ee6a4SAndroid Build Coastguard Worker }
75*bb4ee6a4SAndroid Build Coastguard Worker 
76*bb4ee6a4SAndroid Build Coastguard Worker impl Response for CtrlVal {
write(&self, w: &mut Writer) -> Result<(), io::Error>77*bb4ee6a4SAndroid Build Coastguard Worker     fn write(&self, w: &mut Writer) -> Result<(), io::Error> {
78*bb4ee6a4SAndroid Build Coastguard Worker         match self {
79*bb4ee6a4SAndroid Build Coastguard Worker             CtrlVal::Bitrate(r) => w.write_obj(virtio_video_control_val_bitrate {
80*bb4ee6a4SAndroid Build Coastguard Worker                 bitrate: Le32::from(*r),
81*bb4ee6a4SAndroid Build Coastguard Worker                 ..Default::default()
82*bb4ee6a4SAndroid Build Coastguard Worker             }),
83*bb4ee6a4SAndroid Build Coastguard Worker             CtrlVal::BitratePeak(r) => w.write_obj(virtio_video_control_val_bitrate_peak {
84*bb4ee6a4SAndroid Build Coastguard Worker                 bitrate_peak: Le32::from(*r),
85*bb4ee6a4SAndroid Build Coastguard Worker                 ..Default::default()
86*bb4ee6a4SAndroid Build Coastguard Worker             }),
87*bb4ee6a4SAndroid Build Coastguard Worker             CtrlVal::BitrateMode(m) => w.write_obj(virtio_video_control_val_bitrate_mode {
88*bb4ee6a4SAndroid Build Coastguard Worker                 bitrate_mode: Le32::from(*m as u32),
89*bb4ee6a4SAndroid Build Coastguard Worker                 ..Default::default()
90*bb4ee6a4SAndroid Build Coastguard Worker             }),
91*bb4ee6a4SAndroid Build Coastguard Worker             CtrlVal::Profile(p) => w.write_obj(virtio_video_control_val_profile {
92*bb4ee6a4SAndroid Build Coastguard Worker                 profile: Le32::from(*p as u32),
93*bb4ee6a4SAndroid Build Coastguard Worker                 ..Default::default()
94*bb4ee6a4SAndroid Build Coastguard Worker             }),
95*bb4ee6a4SAndroid Build Coastguard Worker             CtrlVal::Level(l) => w.write_obj(virtio_video_control_val_level {
96*bb4ee6a4SAndroid Build Coastguard Worker                 level: Le32::from(*l as u32),
97*bb4ee6a4SAndroid Build Coastguard Worker                 ..Default::default()
98*bb4ee6a4SAndroid Build Coastguard Worker             }),
99*bb4ee6a4SAndroid Build Coastguard Worker             CtrlVal::ForceKeyframe => Err(io::Error::new(
100*bb4ee6a4SAndroid Build Coastguard Worker                 io::ErrorKind::InvalidInput,
101*bb4ee6a4SAndroid Build Coastguard Worker                 "Button controls should not be queried.",
102*bb4ee6a4SAndroid Build Coastguard Worker             )),
103*bb4ee6a4SAndroid Build Coastguard Worker             CtrlVal::PrependSpsPpsToIdr(p) => {
104*bb4ee6a4SAndroid Build Coastguard Worker                 w.write_obj(virtio_video_control_val_prepend_spspps_to_idr {
105*bb4ee6a4SAndroid Build Coastguard Worker                     prepend_spspps_to_idr: Le32::from(*p as u32),
106*bb4ee6a4SAndroid Build Coastguard Worker                     ..Default::default()
107*bb4ee6a4SAndroid Build Coastguard Worker                 })
108*bb4ee6a4SAndroid Build Coastguard Worker             }
109*bb4ee6a4SAndroid Build Coastguard Worker         }
110*bb4ee6a4SAndroid Build Coastguard Worker     }
111*bb4ee6a4SAndroid Build Coastguard Worker }
112