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