xref: /xiu/protocol/rtmp/src/cache/mod.rs (revision a6684c8d)
1 pub mod errors;
2 pub mod gop;
3 pub mod metadata;
4 
5 use {
6     crate::channels::define::ChannelData,
7     bytes::BytesMut,
8     errors::CacheError,
9     gop::Gop,
10     xflv::{define, demuxer_tag},
11 };
12 #[derive(Clone)]
13 pub struct Cache {
14     metadata: metadata::MetaData,
15     metadata_timestamp: u32,
16     video_seq: BytesMut,
17     video_timestamp: u32,
18     audio_seq: BytesMut,
19     audio_timestamp: u32,
20     gop: Gop,
21 }
22 
23 impl Default for Cache {
24     fn default() -> Self {
25         Self::new()
26     }
27 }
28 
29 impl Cache {
30     pub fn new() -> Self {
31         Self {
32             metadata: metadata::MetaData::new(),
33             metadata_timestamp: 0,
34             video_seq: BytesMut::new(),
35             video_timestamp: 0,
36             audio_seq: BytesMut::new(),
37             audio_timestamp: 0,
38             gop: Gop::new(),
39         }
40     }
41 
42     //, values: Vec<Amf0ValueType>
43     pub fn save_metadata(&mut self, chunk_body: BytesMut, timestamp: u32) {
44         self.metadata.save(chunk_body);
45         self.metadata_timestamp = timestamp;
46     }
47 
48     pub fn get_metadata(&self) -> Option<ChannelData> {
49         let data = self.metadata.get_chunk_body();
50         if !data.is_empty() {
51             Some(ChannelData::MetaData {
52                 timestamp: self.metadata_timestamp,
53                 data,
54             })
55         } else {
56             None
57         }
58     }
59 
60     pub fn save_audio_seq(
61         &mut self,
62         chunk_body: BytesMut,
63         timestamp: u32,
64     ) -> Result<(), CacheError> {
65         let mut parser = demuxer_tag::AudioTagHeaderDemuxer::new(chunk_body.clone());
66         let tag = parser.parse_tag_header()?;
67 
68         let channel_data = ChannelData::Audio {
69             timestamp,
70             data: chunk_body.clone(),
71         };
72         self.gop.save_gop_data(channel_data, false);
73 
74         if tag.sound_format == define::sound_format::AAC
75             && tag.aac_packet_type == define::aac_packet_type::AAC_SEQHDR
76         {
77             self.audio_seq = chunk_body;
78             self.audio_timestamp = timestamp;
79         }
80 
81         Ok(())
82     }
83 
84     pub fn get_audio_seq(&self) -> Option<ChannelData> {
85         if !self.audio_seq.is_empty() {
86             return Some(ChannelData::Audio {
87                 timestamp: self.audio_timestamp,
88                 data: self.audio_seq.clone(),
89             });
90         }
91         None
92     }
93 
94     pub fn get_video_seq(&self) -> Option<ChannelData> {
95         if !self.video_seq.is_empty() {
96             return Some(ChannelData::Video {
97                 timestamp: self.video_timestamp,
98                 data: self.video_seq.clone(),
99             });
100         }
101         None
102     }
103 
104     pub fn save_video_seq(
105         &mut self,
106         chunk_body: BytesMut,
107         timestamp: u32,
108     ) -> Result<(), CacheError> {
109         let mut parser = demuxer_tag::VideoTagHeaderDemuxer::new(chunk_body.clone());
110         let tag = parser.parse_tag_header()?;
111 
112         let channel_data = ChannelData::Video {
113             timestamp,
114             data: chunk_body.clone(),
115         };
116         let is_key_frame = tag.frame_type == define::frame_type::KEY_FRAME;
117         self.gop.save_gop_data(channel_data, is_key_frame);
118 
119         if is_key_frame && tag.avc_packet_type == define::avc_packet_type::AVC_SEQHDR {
120             self.video_seq = chunk_body;
121             self.video_timestamp = timestamp;
122         }
123 
124         Ok(())
125     }
126 
127     pub fn get_gop_data(self) -> Option<Vec<ChannelData>> {
128         if !self.gop.is_empty() {
129             Some(self.gop.get_gop_data())
130         } else {
131             None
132         }
133     }
134 }
135