use {
bytes::BytesMut,
bytesio::bytes_reader::BytesReader,
xflv::amf0::{amf0_reader::Amf0Reader, Amf0ValueType},
};
#[derive(Clone)]
pub struct MetaData {
chunk_body: BytesMut,
}
impl Default for MetaData {
fn default() -> Self {
Self::new()
}
}
impl MetaData {
pub fn new() -> Self {
Self {
chunk_body: BytesMut::new(),
}
}
pub fn save(&mut self, body: &BytesMut) {
if self.is_metadata(body.clone()) {
self.chunk_body = body.clone();
}
}
pub fn is_metadata(&mut self, body: BytesMut) -> bool {
let reader = BytesReader::new(body);
let result = Amf0Reader::new(reader).read_all();
let mut values: Vec<Amf0ValueType> = Vec::new();
match result {
Ok(v) => {
values.extend_from_slice(&v[..]);
}
Err(_) => return false,
}
if values.len() < 2 {
return false;
}
log::info!("metadata: {:?}", values);
let mut is_metadata = false;
if let Amf0ValueType::UTF8String(str) = values.remove(0) {
if str == "@setDataFrame" || str == "onMetaData" {
is_metadata = true;
}
}
is_metadata
}
pub fn get_chunk_body(&self) -> BytesMut {
self.chunk_body.clone()
}
}