xref: /aosp_15_r20/external/crosvm/media/libvda/src/decode/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 over pipe FD.
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker use std::fmt;
8*bb4ee6a4SAndroid Build Coastguard Worker use std::fmt::Display;
9*bb4ee6a4SAndroid Build Coastguard Worker 
10*bb4ee6a4SAndroid Build Coastguard Worker use enumn::N;
11*bb4ee6a4SAndroid Build Coastguard Worker 
12*bb4ee6a4SAndroid Build Coastguard Worker use super::bindings;
13*bb4ee6a4SAndroid Build Coastguard Worker use crate::error::*;
14*bb4ee6a4SAndroid Build Coastguard Worker 
15*bb4ee6a4SAndroid Build Coastguard Worker /// Represents a response from libvda.
16*bb4ee6a4SAndroid Build Coastguard Worker ///
17*bb4ee6a4SAndroid Build Coastguard Worker /// Each value corresponds to a value of [`VideoDecodeAccelerator::Result`](https://cs.chromium.org/chromium/src/components/arc/common/video_decode_accelerator.mojom?rcl=128dc1f18791dc4593b9fd671aab84cb72bf6830&l=84).
18*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug, Clone, Copy, N)]
19*bb4ee6a4SAndroid Build Coastguard Worker #[repr(u32)]
20*bb4ee6a4SAndroid Build Coastguard Worker pub enum Response {
21*bb4ee6a4SAndroid Build Coastguard Worker     Success = bindings::vda_result_SUCCESS,
22*bb4ee6a4SAndroid Build Coastguard Worker     IllegalState = bindings::vda_result_ILLEGAL_STATE,
23*bb4ee6a4SAndroid Build Coastguard Worker     InvalidArgument = bindings::vda_result_INVALID_ARGUMENT,
24*bb4ee6a4SAndroid Build Coastguard Worker     UnreadableInput = bindings::vda_result_UNREADABLE_INPUT,
25*bb4ee6a4SAndroid Build Coastguard Worker     PlatformFailure = bindings::vda_result_PLATFORM_FAILURE,
26*bb4ee6a4SAndroid Build Coastguard Worker     InsufficientResources = bindings::vda_result_INSUFFICIENT_RESOURCES,
27*bb4ee6a4SAndroid Build Coastguard Worker     Cancelled = bindings::vda_result_CANCELLED,
28*bb4ee6a4SAndroid Build Coastguard Worker }
29*bb4ee6a4SAndroid Build Coastguard Worker 
30*bb4ee6a4SAndroid Build Coastguard Worker impl Response {
new(res: bindings::vda_result_t) -> Response31*bb4ee6a4SAndroid Build Coastguard Worker     pub(crate) fn new(res: bindings::vda_result_t) -> Response {
32*bb4ee6a4SAndroid Build Coastguard Worker         Response::n(res).unwrap_or_else(|| panic!("Unknown response is reported from VDA: {}", res))
33*bb4ee6a4SAndroid Build Coastguard Worker     }
34*bb4ee6a4SAndroid Build Coastguard Worker }
35*bb4ee6a4SAndroid Build Coastguard Worker 
36*bb4ee6a4SAndroid Build Coastguard Worker impl Display for Response {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result37*bb4ee6a4SAndroid Build Coastguard Worker     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
38*bb4ee6a4SAndroid Build Coastguard Worker         use self::Response::*;
39*bb4ee6a4SAndroid Build Coastguard Worker         match self {
40*bb4ee6a4SAndroid Build Coastguard Worker             Success => write!(f, "success"),
41*bb4ee6a4SAndroid Build Coastguard Worker             IllegalState => write!(f, "illegal state"),
42*bb4ee6a4SAndroid Build Coastguard Worker             InvalidArgument => write!(f, "invalid argument"),
43*bb4ee6a4SAndroid Build Coastguard Worker             UnreadableInput => write!(f, "unreadable input"),
44*bb4ee6a4SAndroid Build Coastguard Worker             PlatformFailure => write!(f, "platform failure"),
45*bb4ee6a4SAndroid Build Coastguard Worker             InsufficientResources => write!(f, "insufficient resources"),
46*bb4ee6a4SAndroid Build Coastguard Worker             Cancelled => write!(f, "cancelled"),
47*bb4ee6a4SAndroid Build Coastguard Worker         }
48*bb4ee6a4SAndroid Build Coastguard Worker     }
49*bb4ee6a4SAndroid Build Coastguard Worker }
50*bb4ee6a4SAndroid Build Coastguard Worker 
51*bb4ee6a4SAndroid Build Coastguard Worker impl From<Response> for Result<()> {
from(r: Response) -> Self52*bb4ee6a4SAndroid Build Coastguard Worker     fn from(r: Response) -> Self {
53*bb4ee6a4SAndroid Build Coastguard Worker         match r {
54*bb4ee6a4SAndroid Build Coastguard Worker             Response::Success => Ok(()),
55*bb4ee6a4SAndroid Build Coastguard Worker             _ => Err(Error::LibVdaFailure(r)),
56*bb4ee6a4SAndroid Build Coastguard Worker         }
57*bb4ee6a4SAndroid Build Coastguard Worker     }
58*bb4ee6a4SAndroid Build Coastguard Worker }
59*bb4ee6a4SAndroid Build Coastguard Worker 
60*bb4ee6a4SAndroid Build Coastguard Worker /// Represents a notified event from libvda.
61*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug)]
62*bb4ee6a4SAndroid Build Coastguard Worker pub enum Event {
63*bb4ee6a4SAndroid Build Coastguard Worker     /// Requests the users to provide output buffers.
64*bb4ee6a4SAndroid Build Coastguard Worker     ProvidePictureBuffers {
65*bb4ee6a4SAndroid Build Coastguard Worker         min_num_buffers: u32,
66*bb4ee6a4SAndroid Build Coastguard Worker         width: i32,
67*bb4ee6a4SAndroid Build Coastguard Worker         height: i32,
68*bb4ee6a4SAndroid Build Coastguard Worker         visible_rect_left: i32,
69*bb4ee6a4SAndroid Build Coastguard Worker         visible_rect_top: i32,
70*bb4ee6a4SAndroid Build Coastguard Worker         visible_rect_right: i32,
71*bb4ee6a4SAndroid Build Coastguard Worker         visible_rect_bottom: i32,
72*bb4ee6a4SAndroid Build Coastguard Worker     },
73*bb4ee6a4SAndroid Build Coastguard Worker     /// Notifies the user of a decoded frame ready for display.
74*bb4ee6a4SAndroid Build Coastguard Worker     /// These events will arrive in display order.
75*bb4ee6a4SAndroid Build Coastguard Worker     PictureReady {
76*bb4ee6a4SAndroid Build Coastguard Worker         buffer_id: i32,
77*bb4ee6a4SAndroid Build Coastguard Worker         bitstream_id: i32,
78*bb4ee6a4SAndroid Build Coastguard Worker         left: i32,
79*bb4ee6a4SAndroid Build Coastguard Worker         top: i32,
80*bb4ee6a4SAndroid Build Coastguard Worker         right: i32,
81*bb4ee6a4SAndroid Build Coastguard Worker         bottom: i32,
82*bb4ee6a4SAndroid Build Coastguard Worker     },
83*bb4ee6a4SAndroid Build Coastguard Worker     /// Notifies the end of bitstream buffer.
84*bb4ee6a4SAndroid Build Coastguard Worker     NotifyEndOfBitstreamBuffer {
85*bb4ee6a4SAndroid Build Coastguard Worker         bitstream_id: i32,
86*bb4ee6a4SAndroid Build Coastguard Worker     },
87*bb4ee6a4SAndroid Build Coastguard Worker     NotifyError(Response),
88*bb4ee6a4SAndroid Build Coastguard Worker     /// Notifies the result of operation issued by `Session::reset`.
89*bb4ee6a4SAndroid Build Coastguard Worker     ResetResponse(Response),
90*bb4ee6a4SAndroid Build Coastguard Worker     /// Notifies the result of operation issued by `Session::flush`.
91*bb4ee6a4SAndroid Build Coastguard Worker     FlushResponse(Response),
92*bb4ee6a4SAndroid Build Coastguard Worker }
93*bb4ee6a4SAndroid Build Coastguard Worker 
94*bb4ee6a4SAndroid Build Coastguard Worker impl Event {
95*bb4ee6a4SAndroid Build Coastguard Worker     /// Creates a new `Event` from a `vda_event_t` instance.
96*bb4ee6a4SAndroid Build Coastguard Worker     /// This function is safe if `event` was a value read from libvda's pipe.
new(event: bindings::vda_event_t) -> Result<Event>97*bb4ee6a4SAndroid Build Coastguard Worker     pub(crate) unsafe fn new(event: bindings::vda_event_t) -> Result<Event> {
98*bb4ee6a4SAndroid Build Coastguard Worker         use self::Event::*;
99*bb4ee6a4SAndroid Build Coastguard Worker 
100*bb4ee6a4SAndroid Build Coastguard Worker         let data = event.event_data;
101*bb4ee6a4SAndroid Build Coastguard Worker         match event.event_type {
102*bb4ee6a4SAndroid Build Coastguard Worker             bindings::vda_event_type_PROVIDE_PICTURE_BUFFERS => {
103*bb4ee6a4SAndroid Build Coastguard Worker                 let d = data.provide_picture_buffers;
104*bb4ee6a4SAndroid Build Coastguard Worker                 Ok(ProvidePictureBuffers {
105*bb4ee6a4SAndroid Build Coastguard Worker                     min_num_buffers: d.min_num_buffers,
106*bb4ee6a4SAndroid Build Coastguard Worker                     width: d.width,
107*bb4ee6a4SAndroid Build Coastguard Worker                     height: d.height,
108*bb4ee6a4SAndroid Build Coastguard Worker                     visible_rect_left: d.visible_rect_left,
109*bb4ee6a4SAndroid Build Coastguard Worker                     visible_rect_top: d.visible_rect_top,
110*bb4ee6a4SAndroid Build Coastguard Worker                     visible_rect_right: d.visible_rect_right,
111*bb4ee6a4SAndroid Build Coastguard Worker                     visible_rect_bottom: d.visible_rect_bottom,
112*bb4ee6a4SAndroid Build Coastguard Worker                 })
113*bb4ee6a4SAndroid Build Coastguard Worker             }
114*bb4ee6a4SAndroid Build Coastguard Worker             bindings::vda_event_type_PICTURE_READY => {
115*bb4ee6a4SAndroid Build Coastguard Worker                 let d = data.picture_ready;
116*bb4ee6a4SAndroid Build Coastguard Worker                 Ok(PictureReady {
117*bb4ee6a4SAndroid Build Coastguard Worker                     buffer_id: d.picture_buffer_id,
118*bb4ee6a4SAndroid Build Coastguard Worker                     bitstream_id: d.bitstream_id,
119*bb4ee6a4SAndroid Build Coastguard Worker                     left: d.crop_left,
120*bb4ee6a4SAndroid Build Coastguard Worker                     top: d.crop_top,
121*bb4ee6a4SAndroid Build Coastguard Worker                     right: d.crop_right,
122*bb4ee6a4SAndroid Build Coastguard Worker                     bottom: d.crop_bottom,
123*bb4ee6a4SAndroid Build Coastguard Worker                 })
124*bb4ee6a4SAndroid Build Coastguard Worker             }
125*bb4ee6a4SAndroid Build Coastguard Worker             bindings::vda_event_type_NOTIFY_END_OF_BITSTREAM_BUFFER => {
126*bb4ee6a4SAndroid Build Coastguard Worker                 Ok(NotifyEndOfBitstreamBuffer {
127*bb4ee6a4SAndroid Build Coastguard Worker                     bitstream_id: data.bitstream_id,
128*bb4ee6a4SAndroid Build Coastguard Worker                 })
129*bb4ee6a4SAndroid Build Coastguard Worker             }
130*bb4ee6a4SAndroid Build Coastguard Worker             bindings::vda_event_type_NOTIFY_ERROR => Ok(NotifyError(Response::new(data.result))),
131*bb4ee6a4SAndroid Build Coastguard Worker             bindings::vda_event_type_RESET_RESPONSE => {
132*bb4ee6a4SAndroid Build Coastguard Worker                 Ok(ResetResponse(Response::new(data.result)))
133*bb4ee6a4SAndroid Build Coastguard Worker             }
134*bb4ee6a4SAndroid Build Coastguard Worker             bindings::vda_event_type_FLUSH_RESPONSE => {
135*bb4ee6a4SAndroid Build Coastguard Worker                 Ok(FlushResponse(Response::new(data.result)))
136*bb4ee6a4SAndroid Build Coastguard Worker             }
137*bb4ee6a4SAndroid Build Coastguard Worker             t => panic!("Unknown event is reported from VDA: {}", t),
138*bb4ee6a4SAndroid Build Coastguard Worker         }
139*bb4ee6a4SAndroid Build Coastguard Worker     }
140*bb4ee6a4SAndroid Build Coastguard Worker }
141