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