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