xref: /xiu/protocol/rtmp/src/cache/metadata.rs (revision b36cf5da)
1e2687b83SHarlanC use {
2067fdd3cSHarlanC     super::errors::MetadataError,
3067fdd3cSHarlanC     crate::amf0::{amf0_reader::Amf0Reader, amf0_writer::Amf0Writer, Amf0ValueType},
4e2687b83SHarlanC     bytes::BytesMut,
5*b36cf5daSHarlan     bytesio::bytes_reader::BytesReader,
6e2687b83SHarlanC };
7d20ba44cSwawacry #[derive(Clone)]
87adc8486SHarlanC pub struct MetaData {
97adc8486SHarlanC     chunk_body: BytesMut,
10f9029ceaSHarlanC     // values: Vec<Amf0ValueType>,
117adc8486SHarlanC }
127adc8486SHarlanC 
130ca99c20SHarlan impl Default for MetaData {
default() -> Self140ca99c20SHarlan     fn default() -> Self {
150ca99c20SHarlan         Self::new()
160ca99c20SHarlan     }
170ca99c20SHarlan }
180ca99c20SHarlan 
197adc8486SHarlanC impl MetaData {
new() -> Self200ca99c20SHarlan     pub fn new() -> Self {
217adc8486SHarlanC         Self {
227adc8486SHarlanC             chunk_body: BytesMut::new(),
23f9029ceaSHarlanC             //values: Vec::new(),
247adc8486SHarlanC         }
257adc8486SHarlanC     }
2661bf3e1bSHarlanC     //, values: Vec<Amf0ValueType>
save(&mut self, body: &BytesMut)278e71d710SHarlan     pub fn save(&mut self, body: &BytesMut) {
2861bf3e1bSHarlanC         if self.is_metadata(body.clone()) {
298e71d710SHarlan             self.chunk_body = body.clone();
307adc8486SHarlanC         }
317adc8486SHarlanC     }
327adc8486SHarlanC 
33067fdd3cSHarlanC     //used for the http-flv protocol
remove_set_data_frame(&mut self) -> Result<BytesMut, MetadataError>34067fdd3cSHarlanC     pub fn remove_set_data_frame(&mut self) -> Result<BytesMut, MetadataError> {
3513bac29aSHarlan         let mut amf_writer: Amf0Writer = Amf0Writer::new();
36067fdd3cSHarlanC         amf_writer.write_string(&String::from("@setDataFrame"))?;
37067fdd3cSHarlanC 
38067fdd3cSHarlanC         let (_, right) = self.chunk_body.split_at(amf_writer.len());
39067fdd3cSHarlanC 
40067fdd3cSHarlanC         Ok(BytesMut::from(right))
41067fdd3cSHarlanC     }
42067fdd3cSHarlanC 
is_metadata(&mut self, body: BytesMut) -> bool4361bf3e1bSHarlanC     pub fn is_metadata(&mut self, body: BytesMut) -> bool {
4461bf3e1bSHarlanC         let reader = BytesReader::new(body);
4561bf3e1bSHarlanC         let result = Amf0Reader::new(reader).read_all();
4661bf3e1bSHarlanC 
4761bf3e1bSHarlanC         let mut values: Vec<Amf0ValueType> = Vec::new();
4861bf3e1bSHarlanC 
4961bf3e1bSHarlanC         match result {
5061bf3e1bSHarlanC             Ok(v) => {
5161bf3e1bSHarlanC                 values.extend_from_slice(&v[..]);
5261bf3e1bSHarlanC             }
5361bf3e1bSHarlanC             Err(_) => return false,
5461bf3e1bSHarlanC         }
5561bf3e1bSHarlanC 
567adc8486SHarlanC         if values.len() < 2 {
577adc8486SHarlanC             return false;
587adc8486SHarlanC         }
597adc8486SHarlanC 
60ccd9a1faSHarlan         log::info!("metadata: {:?}", values);
61ccd9a1faSHarlan 
62c8d4d932SHarlan         let mut is_metadata = false;
63ded9d193SHarlan 
64ded9d193SHarlan         if let Amf0ValueType::UTF8String(str) = values.remove(0) {
65c8d4d932SHarlan             if str == "@setDataFrame" || str == "onMetaData" {
66c8d4d932SHarlan                 is_metadata = true;
677adc8486SHarlanC             }
687adc8486SHarlanC         }
69ded9d193SHarlan 
70ded9d193SHarlan         // match values.remove(0) {
71ded9d193SHarlan         //     Amf0ValueType::UTF8String(str) => {
72ded9d193SHarlan         //         if str == "@setDataFrame" || str == "onMetaData" {
73ded9d193SHarlan         //             is_metadata = true;
74ded9d193SHarlan         //         }
75ded9d193SHarlan         //     }
76ded9d193SHarlan         //     _ => {
77ded9d193SHarlan         //         //return false;
78ded9d193SHarlan         //     }
79ded9d193SHarlan         // }
80ded9d193SHarlan         // match values.remove(0) {
81ded9d193SHarlan         //     Amf0ValueType::UTF8String(str) => {
82ded9d193SHarlan         //         if str != "onMetaData" {
83ded9d193SHarlan         //             //return false;
84ded9d193SHarlan         //         }
85ded9d193SHarlan         //     }
86ded9d193SHarlan         //     _ => {
87ded9d193SHarlan         //         //return false;
88ded9d193SHarlan         //     }
89ded9d193SHarlan         // }
907adc8486SHarlanC 
91c8d4d932SHarlan         is_metadata
927adc8486SHarlanC     }
937adc8486SHarlanC 
get_chunk_body(&self) -> BytesMut947adc8486SHarlanC     pub fn get_chunk_body(&self) -> BytesMut {
9585c0af6aSLuca Barbato         self.chunk_body.clone()
967adc8486SHarlanC     }
977adc8486SHarlanC }
98