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 //! Events reported by VDA encode API over pipe FD. 6*bb4ee6a4SAndroid Build Coastguard Worker 7*bb4ee6a4SAndroid Build Coastguard Worker use std::error; 8*bb4ee6a4SAndroid Build Coastguard Worker use std::fmt; 9*bb4ee6a4SAndroid Build Coastguard Worker use std::fmt::Display; 10*bb4ee6a4SAndroid Build Coastguard Worker 11*bb4ee6a4SAndroid Build Coastguard Worker use enumn::N; 12*bb4ee6a4SAndroid Build Coastguard Worker 13*bb4ee6a4SAndroid Build Coastguard Worker use super::bindings; 14*bb4ee6a4SAndroid Build Coastguard Worker use super::session::VeaInputBufferId; 15*bb4ee6a4SAndroid Build Coastguard Worker use super::session::VeaOutputBufferId; 16*bb4ee6a4SAndroid Build Coastguard Worker use crate::error::*; 17*bb4ee6a4SAndroid Build Coastguard Worker 18*bb4ee6a4SAndroid Build Coastguard Worker /// Represents an error from a libvda encode session. 19*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug, Clone, Copy, N)] 20*bb4ee6a4SAndroid Build Coastguard Worker #[repr(u32)] 21*bb4ee6a4SAndroid Build Coastguard Worker pub enum VeaError { 22*bb4ee6a4SAndroid Build Coastguard Worker IllegalState = bindings::vea_error_ILLEGAL_STATE_ERROR, 23*bb4ee6a4SAndroid Build Coastguard Worker InvalidArgument = bindings::vea_error_INVALID_ARGUMENT_ERROR, 24*bb4ee6a4SAndroid Build Coastguard Worker PlatformFailure = bindings::vea_error_PLATFORM_FAILURE_ERROR, 25*bb4ee6a4SAndroid Build Coastguard Worker } 26*bb4ee6a4SAndroid Build Coastguard Worker 27*bb4ee6a4SAndroid Build Coastguard Worker impl error::Error for VeaError {} 28*bb4ee6a4SAndroid Build Coastguard Worker 29*bb4ee6a4SAndroid Build Coastguard Worker impl VeaError { new(res: bindings::vea_error_t) -> VeaError30*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) fn new(res: bindings::vea_error_t) -> VeaError { 31*bb4ee6a4SAndroid Build Coastguard Worker VeaError::n(res).unwrap_or_else(|| panic!("Unknown error is reported from VEA: {}", res)) 32*bb4ee6a4SAndroid Build Coastguard Worker } 33*bb4ee6a4SAndroid Build Coastguard Worker } 34*bb4ee6a4SAndroid Build Coastguard Worker 35*bb4ee6a4SAndroid Build Coastguard Worker impl Display for VeaError { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result36*bb4ee6a4SAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 37*bb4ee6a4SAndroid Build Coastguard Worker use self::VeaError::*; 38*bb4ee6a4SAndroid Build Coastguard Worker match self { 39*bb4ee6a4SAndroid Build Coastguard Worker IllegalState => write!(f, "illegal state"), 40*bb4ee6a4SAndroid Build Coastguard Worker InvalidArgument => write!(f, "invalid argument"), 41*bb4ee6a4SAndroid Build Coastguard Worker PlatformFailure => write!(f, "platform failure"), 42*bb4ee6a4SAndroid Build Coastguard Worker } 43*bb4ee6a4SAndroid Build Coastguard Worker } 44*bb4ee6a4SAndroid Build Coastguard Worker } 45*bb4ee6a4SAndroid Build Coastguard Worker 46*bb4ee6a4SAndroid Build Coastguard Worker /// Represents a notified event from libvda. 47*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug)] 48*bb4ee6a4SAndroid Build Coastguard Worker pub enum Event { 49*bb4ee6a4SAndroid Build Coastguard Worker /// Requests the user to provide input buffers. 50*bb4ee6a4SAndroid Build Coastguard Worker RequireInputBuffers { 51*bb4ee6a4SAndroid Build Coastguard Worker input_count: u32, 52*bb4ee6a4SAndroid Build Coastguard Worker input_frame_width: u32, 53*bb4ee6a4SAndroid Build Coastguard Worker input_frame_height: u32, 54*bb4ee6a4SAndroid Build Coastguard Worker output_buffer_size: u32, 55*bb4ee6a4SAndroid Build Coastguard Worker }, 56*bb4ee6a4SAndroid Build Coastguard Worker /// Notifies the user that an input buffer has been processed. 57*bb4ee6a4SAndroid Build Coastguard Worker ProcessedInputBuffer(VeaInputBufferId), 58*bb4ee6a4SAndroid Build Coastguard Worker /// Notifies the user that an output buffer has been processed. 59*bb4ee6a4SAndroid Build Coastguard Worker ProcessedOutputBuffer { 60*bb4ee6a4SAndroid Build Coastguard Worker output_buffer_id: VeaOutputBufferId, 61*bb4ee6a4SAndroid Build Coastguard Worker payload_size: u32, 62*bb4ee6a4SAndroid Build Coastguard Worker key_frame: bool, 63*bb4ee6a4SAndroid Build Coastguard Worker timestamp: i64, 64*bb4ee6a4SAndroid Build Coastguard Worker }, 65*bb4ee6a4SAndroid Build Coastguard Worker /// Notifies the result of operation issued by `Session::flush`. 66*bb4ee6a4SAndroid Build Coastguard Worker FlushResponse { flush_done: bool }, 67*bb4ee6a4SAndroid Build Coastguard Worker /// Notifies the user of an error. 68*bb4ee6a4SAndroid Build Coastguard Worker NotifyError(VeaError), 69*bb4ee6a4SAndroid Build Coastguard Worker } 70*bb4ee6a4SAndroid Build Coastguard Worker 71*bb4ee6a4SAndroid Build Coastguard Worker impl Event { 72*bb4ee6a4SAndroid Build Coastguard Worker /// Creates a new `Event` from a `vea_event_t` instance. 73*bb4ee6a4SAndroid Build Coastguard Worker /// This function is safe if `event` was a value read from libvda's pipe. new(event: bindings::vea_event_t) -> Result<Self>74*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) unsafe fn new(event: bindings::vea_event_t) -> Result<Self> { 75*bb4ee6a4SAndroid Build Coastguard Worker use self::Event::*; 76*bb4ee6a4SAndroid Build Coastguard Worker 77*bb4ee6a4SAndroid Build Coastguard Worker let bindings::vea_event_t { 78*bb4ee6a4SAndroid Build Coastguard Worker event_data, 79*bb4ee6a4SAndroid Build Coastguard Worker event_type, 80*bb4ee6a4SAndroid Build Coastguard Worker } = event; 81*bb4ee6a4SAndroid Build Coastguard Worker 82*bb4ee6a4SAndroid Build Coastguard Worker match event_type { 83*bb4ee6a4SAndroid Build Coastguard Worker bindings::vea_event_type_REQUIRE_INPUT_BUFFERS => { 84*bb4ee6a4SAndroid Build Coastguard Worker let d = event_data.require_input_buffers; 85*bb4ee6a4SAndroid Build Coastguard Worker Ok(RequireInputBuffers { 86*bb4ee6a4SAndroid Build Coastguard Worker input_count: d.input_count, 87*bb4ee6a4SAndroid Build Coastguard Worker input_frame_width: d.input_frame_width, 88*bb4ee6a4SAndroid Build Coastguard Worker input_frame_height: d.input_frame_height, 89*bb4ee6a4SAndroid Build Coastguard Worker output_buffer_size: d.output_buffer_size, 90*bb4ee6a4SAndroid Build Coastguard Worker }) 91*bb4ee6a4SAndroid Build Coastguard Worker } 92*bb4ee6a4SAndroid Build Coastguard Worker bindings::vea_event_type_PROCESSED_INPUT_BUFFER => { 93*bb4ee6a4SAndroid Build Coastguard Worker Ok(ProcessedInputBuffer(event_data.processed_input_buffer_id)) 94*bb4ee6a4SAndroid Build Coastguard Worker } 95*bb4ee6a4SAndroid Build Coastguard Worker bindings::vea_event_type_PROCESSED_OUTPUT_BUFFER => { 96*bb4ee6a4SAndroid Build Coastguard Worker let d = event_data.processed_output_buffer; 97*bb4ee6a4SAndroid Build Coastguard Worker Ok(ProcessedOutputBuffer { 98*bb4ee6a4SAndroid Build Coastguard Worker output_buffer_id: d.output_buffer_id, 99*bb4ee6a4SAndroid Build Coastguard Worker payload_size: d.payload_size, 100*bb4ee6a4SAndroid Build Coastguard Worker key_frame: d.key_frame == 1, 101*bb4ee6a4SAndroid Build Coastguard Worker timestamp: d.timestamp, 102*bb4ee6a4SAndroid Build Coastguard Worker }) 103*bb4ee6a4SAndroid Build Coastguard Worker } 104*bb4ee6a4SAndroid Build Coastguard Worker bindings::vea_event_type_VEA_FLUSH_RESPONSE => Ok(FlushResponse { 105*bb4ee6a4SAndroid Build Coastguard Worker flush_done: event_data.flush_done == 1, 106*bb4ee6a4SAndroid Build Coastguard Worker }), 107*bb4ee6a4SAndroid Build Coastguard Worker bindings::vea_event_type_VEA_NOTIFY_ERROR => { 108*bb4ee6a4SAndroid Build Coastguard Worker Ok(NotifyError(VeaError::new(event_data.error))) 109*bb4ee6a4SAndroid Build Coastguard Worker } 110*bb4ee6a4SAndroid Build Coastguard Worker t => panic!("Unknown event is reported from VEA: {}", t), 111*bb4ee6a4SAndroid Build Coastguard Worker } 112*bb4ee6a4SAndroid Build Coastguard Worker } 113*bb4ee6a4SAndroid Build Coastguard Worker } 114