Skip to main content

lingxia_platform/traits/
stream_decoder.rs

1use crate::error::PlatformError;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub enum VideoCodec {
5    H264,
6    H265,
7}
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10pub enum VideoFormat {
11    AnnexB,
12    Avcc,
13}
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq)]
16pub enum AudioCodec {
17    Aac,
18    PcmS16le,
19}
20
21#[derive(Debug, Clone, PartialEq, Eq)]
22pub struct VideoStreamConfig {
23    pub codec: VideoCodec,
24    pub format: VideoFormat,
25    pub sps: Vec<u8>,
26    pub pps: Vec<u8>,
27    pub vps: Vec<u8>,
28    pub nal_length_size: Option<u8>,
29    pub width: Option<u16>,
30    pub height: Option<u16>,
31}
32
33#[derive(Debug, Clone, PartialEq, Eq)]
34pub struct AudioStreamConfig {
35    pub codec: AudioCodec,
36    pub audio_specific_config: Vec<u8>,
37    pub sample_rate: Option<u32>,
38    pub channels: Option<u8>,
39    pub aac_is_adts: bool,
40}
41
42#[derive(Debug, Clone, PartialEq, Eq)]
43pub struct VideoFrame {
44    pub data: Vec<u8>,
45    pub dts_ms: u32,
46    pub pts_ms: u32,
47    pub keyframe: bool,
48}
49
50#[derive(Debug, Clone, PartialEq, Eq)]
51pub struct AudioFrame {
52    pub data: Vec<u8>,
53    pub dts_ms: u32,
54    pub pts_ms: u32,
55}
56
57pub trait VideoStreamDecoderHandle: Send + Sync {
58    fn supports_soft_reset(&self) -> bool {
59        false
60    }
61
62    fn supports_in_place_hard_reset(&self) -> bool {
63        false
64    }
65
66    fn reset_stream(&self, _hard: bool) -> Result<(), PlatformError> {
67        Ok(())
68    }
69
70    fn configure_video(&self, config: VideoStreamConfig) -> Result<(), PlatformError>;
71    fn configure_audio(&self, config: AudioStreamConfig) -> Result<(), PlatformError>;
72    fn push_video(&self, frame: VideoFrame) -> Result<(), PlatformError>;
73    fn push_audio(&self, frame: AudioFrame) -> Result<(), PlatformError>;
74    fn stop(&self) -> Result<(), PlatformError>;
75    fn flush(&self) -> Result<(), PlatformError> {
76        Ok(())
77    }
78}
79
80pub trait VideoStreamDecoderManager: Send + Sync + 'static {
81    fn create_stream_decoder(
82        &self,
83        component_id: &str,
84    ) -> Result<Box<dyn VideoStreamDecoderHandle>, PlatformError>;
85}