// Copyright 2025 The ChromiumOS Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. use std::path::PathBuf; use std::rc::Rc; use crate::c2_wrapper::c2_decoder::C2DecoderBackend; use crate::decoder::stateless::av1::Av1; use crate::decoder::stateless::h264::H264; use crate::decoder::stateless::h265::H265; use crate::decoder::stateless::vp8::Vp8; use crate::decoder::stateless::vp9::Vp9; use crate::decoder::stateless::DynStatelessVideoDecoder; use crate::decoder::stateless::StatelessDecoder; use crate::decoder::stateless::StatelessVideoDecoder; use crate::decoder::BlockingMode; use crate::video_frame::VideoFrame; use crate::EncodedFormat; use crate::Fourcc; #[derive(Clone, Debug)] pub struct C2VaapiDecoderOptions { pub libva_device_path: Option, } pub struct C2VaapiDecoder { display: Rc, } impl C2DecoderBackend for C2VaapiDecoder { type DecoderOptions = C2VaapiDecoderOptions; fn new(options: C2VaapiDecoderOptions) -> Result { let display = match options.libva_device_path { Some(libva_device_path) => libva::Display::open_drm_display(libva_device_path.clone()) .map_err(|_| format!("failed to open libva display {libva_device_path:?}"))?, None => libva::Display::open().ok_or("failed to open libva display")?, }; Ok(Self { display: display }) } fn supported_output_formats(&self) -> Result, String> { let image_fmts = self .display .query_image_formats() .map_err(|_| String::from("Failed to query image formats."))?; let mut supported_formats: Vec = Vec::new(); for format in image_fmts.iter() { supported_formats.push(Fourcc::from(format.fourcc)); } return Ok(supported_formats); } fn get_decoder( &mut self, format: EncodedFormat, ) -> Result, String> { Ok(match format { EncodedFormat::H264 => StatelessDecoder::::new_vaapi( self.display.clone(), BlockingMode::NonBlocking, ) .map_err(|_| "Failed to instantiate H264 encoder")? .into_trait_object(), EncodedFormat::H265 => StatelessDecoder::::new_vaapi( self.display.clone(), BlockingMode::NonBlocking, ) .map_err(|_| "Failed to instantiate H265 encoder")? .into_trait_object(), EncodedFormat::VP8 => StatelessDecoder::::new_vaapi( self.display.clone(), BlockingMode::NonBlocking, ) .map_err(|_| "Failed to instantiate VP8 encoder")? .into_trait_object(), EncodedFormat::VP9 => StatelessDecoder::::new_vaapi( self.display.clone(), BlockingMode::NonBlocking, ) .map_err(|_| "Failed to instantiate VP9 encoder")? .into_trait_object(), EncodedFormat::AV1 => StatelessDecoder::::new_vaapi( self.display.clone(), BlockingMode::NonBlocking, ) .map_err(|_| "Failed to instantiate AV1 encoder")? .into_trait_object(), }) } }