use crate::error::Error;
use crate::header::*;
use crate::packetizer::Marshaller;
use bytes::{BufMut, Bytes, BytesMut};
use std::fmt;
#[cfg(test)]
mod packet_test;
#[derive(Debug, Eq, PartialEq, Default)]
pub struct Packet {
pub header: Header,
pub payload: Bytes,
}
impl fmt::Display for Packet {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut out = "RTP PACKET:\n".to_string();
out += format!("\tVersion: {}\n", self.header.version).as_str();
out += format!("\tMarker: {}\n", self.header.marker).as_str();
out += format!("\tPayload Type: {}\n", self.header.payload_type).as_str();
out += format!("\tSequence Number: {}\n", self.header.sequence_number).as_str();
out += format!("\tTimestamp: {}\n", self.header.timestamp).as_str();
out += format!("\tSSRC: {} ({:x})\n", self.header.ssrc, self.header.ssrc).as_str();
out += format!("\tPayload Length: {}\n", self.payload.len()).as_str();
write!(f, "{}", out)
}
}
impl Marshaller for Packet {
fn unmarshal(raw_packet: &Bytes) -> Result<Self, Error> {
let header = Header::unmarshal(raw_packet)?;
let payload = raw_packet.slice(header.marshal_size()..);
Ok(Packet { header, payload })
}
fn marshal_size(&self) -> usize {
self.header.marshal_size() + self.payload.len()
}
fn marshal_to(&self, buf: &mut BytesMut) -> Result<usize, Error> {
let n = self.header.marshal_to(buf)?;
buf.put(&*self.payload);
Ok(n + self.payload.len())
}
}