1 use byteorder::BigEndian; 2 use bytes::BytesMut; 3 use bytesio::bytes_errors::BytesReadError; 4 use bytesio::bytes_errors::BytesWriteError; 5 use bytesio::bytes_reader::BytesReader; 6 use bytesio::bytes_writer::BytesWriter; 7 8 use super::utils::Marshal; 9 use super::utils::Unmarshal; 10 11 #[derive(Debug, Clone, Default)] 12 pub struct RtpHeader { 13 pub version: u8, // 2 bits 14 pub padding_flag: u8, // 1 bit 15 pub extension_flag: u8, // 1 bit 16 pub cc: u8, // 4 bits 17 pub marker: u8, // 1 bit 18 pub payload_type: u8, // 7 bits 19 pub seq_number: u16, 20 pub timestamp: u32, 21 pub ssrc: u32, 22 pub csrcs: Vec<u32>, 23 } 24 25 impl Unmarshal<&mut BytesReader, Result<Self, BytesReadError>> for RtpHeader { unmarshal(reader: &mut BytesReader) -> Result<Self, BytesReadError> where Self: Sized,26 fn unmarshal(reader: &mut BytesReader) -> Result<Self, BytesReadError> 27 where 28 Self: Sized, 29 { 30 let mut rtp_header = RtpHeader::default(); 31 32 let byte_1st: u8 = reader.read_u8()?; 33 rtp_header.version = byte_1st >> 6; 34 rtp_header.padding_flag = byte_1st >> 5 & 0x01; 35 rtp_header.extension_flag = byte_1st >> 4 & 0x01; 36 rtp_header.cc = byte_1st & 0x0F; 37 38 let byte_2nd = reader.read_u8()?; 39 rtp_header.marker = byte_2nd >> 7; 40 rtp_header.payload_type = byte_2nd & 0x7F; 41 rtp_header.seq_number = reader.read_u16::<BigEndian>()?; 42 rtp_header.timestamp = reader.read_u32::<BigEndian>()?; 43 rtp_header.ssrc = reader.read_u32::<BigEndian>()?; 44 45 for _ in 0..rtp_header.cc { 46 rtp_header.csrcs.push(reader.read_u32::<BigEndian>()?); 47 } 48 49 Ok(rtp_header) 50 } 51 } 52 53 impl Marshal<Result<BytesMut, BytesWriteError>> for RtpHeader { 54 // 0 1 2 3 55 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 56 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 57 // |V=2|P|X| CC |M| PT | sequence number | 58 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 59 // | timestamp | 60 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 61 // | synchronization source (SSRC) identifier | 62 // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 63 // | contributing source (CSRC) identifiers | 64 // | .... | 65 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ marshal(&self) -> Result<BytesMut, BytesWriteError>66 fn marshal(&self) -> Result<BytesMut, BytesWriteError> { 67 let mut writer = BytesWriter::default(); 68 69 let byte_1st: u8 = (self.version << 6) 70 | (self.padding_flag << 5) 71 | (self.extension_flag << 4) 72 | (self.cc & 0x0F); 73 writer.write_u8(byte_1st)?; 74 75 let byte_2nd: u8 = (self.marker << 7) | self.payload_type; 76 writer.write_u8(byte_2nd)?; 77 78 writer.write_u16::<BigEndian>(self.seq_number)?; 79 writer.write_u32::<BigEndian>(self.timestamp)?; 80 writer.write_u32::<BigEndian>(self.ssrc)?; 81 82 for csrc in &self.csrcs { 83 writer.write_u32::<BigEndian>(*csrc)?; 84 } 85 86 Ok(writer.extract_current_bytes()) 87 } 88 } 89