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