xref: /aosp_15_r20/external/crosvm/media/libvda/src/encode/event.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 //! 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