pub mod define;
pub mod errors;
pub mod packetizer;
pub mod unpacketizer;
use bytes::BytesMut;
use std::fmt;
#[derive(Eq, PartialEq, Debug, Clone)]
pub struct ChunkBasicHeader {
pub format: u8,
pub chunk_stream_id: u32,
}
impl ChunkBasicHeader {
pub fn new(fmt: u8, csid: u32) -> ChunkBasicHeader {
ChunkBasicHeader {
format: fmt,
chunk_stream_id: csid,
}
}
}
#[derive(Eq, PartialEq, Debug, Clone)]
pub enum ExtendTimestampType {
NONE,
FORMAT0,
FORMAT12,
}
#[derive(Eq, PartialEq, Debug, Clone)]
pub struct ChunkMessageHeader {
pub timestamp: u32,
pub msg_length: u32,
pub msg_type_id: u8,
pub msg_streamd_id: u32,
pub timestamp_delta: u32,
pub extended_timestamp_type: ExtendTimestampType,
}
impl ChunkMessageHeader {
pub fn new(timestamp: u32, msg_length: u32, msg_type_id: u8, msg_stream_id: u32) -> Self {
Self {
timestamp,
msg_length,
msg_type_id,
msg_streamd_id: msg_stream_id,
timestamp_delta: 0,
extended_timestamp_type: ExtendTimestampType::NONE,
}
}
}
pub struct ChunkHeader {
pub basic_header: ChunkBasicHeader,
pub message_header: ChunkMessageHeader,
}
impl Default for ChunkHeader {
fn default() -> Self {
Self::new()
}
}
impl ChunkHeader {
pub fn new() -> ChunkHeader {
ChunkHeader {
basic_header: ChunkBasicHeader::new(0, 0),
message_header: ChunkMessageHeader::new(0, 0, 0, 0),
}
}
}
#[derive(Eq, PartialEq, Clone)]
pub struct ChunkInfo {
pub basic_header: ChunkBasicHeader,
pub message_header: ChunkMessageHeader,
pub payload: BytesMut,
}
impl fmt::Debug for ChunkInfo {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let hex_payload = hex::encode(&self.payload);
let formatted_payload = hex_payload
.as_bytes()
.chunks(2)
.map(|chunk| format!("0x{}{}", chunk[0] as char, chunk[1] as char))
.collect::<Vec<_>>()
.join(", ");
write!(
f,
"ChunkInfo {{ basic_header: {:?}, message_header: {:?}, payload: {} }}",
self.basic_header, self.message_header, formatted_payload
)
}
}
impl Default for ChunkInfo {
fn default() -> Self {
Self::new(0, 0, 0, 0, 0, 0, BytesMut::new())
}
}
impl ChunkInfo {
pub fn new(
csid: u32,
format: u8,
timestamp: u32,
msg_length: u32,
msg_type_id: u8,
msg_stream_id: u32,
payload: BytesMut,
) -> Self {
Self {
basic_header: ChunkBasicHeader::new(format, csid),
message_header: ChunkMessageHeader::new(
timestamp,
msg_length,
msg_type_id,
msg_stream_id,
),
payload,
}
}
}