1 use super::errors::RtcpError; 2 use super::rtcp_header::RtcpHeader; 3 use crate::rtp::utils::Marshal; 4 use crate::rtp::utils::Unmarshal; 5 use byteorder::BigEndian; 6 use bytes::BytesMut; 7 use bytesio::bytes_reader::BytesReader; 8 use bytesio::bytes_writer::BytesWriter; 9 10 #[derive(Debug, Clone, Default)] 11 pub struct ReportBlock { 12 pub ssrc: u32, 13 pub fraction_lost: u8, 14 pub cumutlative_num_of_packets_lost: u32, 15 pub extended_highest_seq_number: u32, 16 pub jitter: u32, 17 pub lsr: u32, 18 pub dlsr: u32, 19 } 20 21 impl Unmarshal<&mut BytesReader, Result<Self, RtcpError>> for ReportBlock { unmarshal(reader: &mut BytesReader) -> Result<Self, RtcpError> where Self: Sized,22 fn unmarshal(reader: &mut BytesReader) -> Result<Self, RtcpError> 23 where 24 Self: Sized, 25 { 26 Ok(ReportBlock { 27 ssrc: reader.read_u32::<BigEndian>()?, 28 fraction_lost: reader.read_u8()?, 29 cumutlative_num_of_packets_lost: reader.read_u24::<BigEndian>()?, 30 extended_highest_seq_number: reader.read_u32::<BigEndian>()?, 31 jitter: reader.read_u32::<BigEndian>()?, 32 lsr: reader.read_u32::<BigEndian>()?, 33 dlsr: reader.read_u32::<BigEndian>()?, 34 }) 35 } 36 } 37 38 impl Marshal<Result<BytesMut, RtcpError>> for ReportBlock { marshal(&self) -> Result<BytesMut, RtcpError>39 fn marshal(&self) -> Result<BytesMut, RtcpError> { 40 let mut writer = BytesWriter::default(); 41 42 writer.write_u32::<BigEndian>(self.ssrc)?; 43 writer.write_u8(self.fraction_lost)?; 44 writer.write_u24::<BigEndian>(self.cumutlative_num_of_packets_lost)?; 45 writer.write_u32::<BigEndian>(self.extended_highest_seq_number)?; 46 writer.write_u32::<BigEndian>(self.jitter)?; 47 writer.write_u32::<BigEndian>(self.lsr)?; 48 writer.write_u32::<BigEndian>(self.dlsr)?; 49 50 Ok(writer.extract_current_bytes()) 51 } 52 } 53 54 #[derive(Debug, Clone, Default)] 55 pub struct RtcpReceiverReport { 56 pub header: RtcpHeader, 57 pub ssrc: u32, 58 pub report_blocks: Vec<ReportBlock>, 59 } 60 61 impl Unmarshal<BytesMut, Result<Self, RtcpError>> for RtcpReceiverReport { unmarshal(data: BytesMut) -> Result<Self, RtcpError> where Self: Sized,62 fn unmarshal(data: BytesMut) -> Result<Self, RtcpError> 63 where 64 Self: Sized, 65 { 66 let mut reader = BytesReader::new(data); 67 68 let mut receiver_report = RtcpReceiverReport { 69 header: RtcpHeader::unmarshal(&mut reader)?, 70 ssrc: reader.read_u32::<BigEndian>()?, 71 ..Default::default() 72 }; 73 74 for _ in 0..receiver_report.header.report_count { 75 let report_block = ReportBlock::unmarshal(&mut reader)?; 76 receiver_report.report_blocks.push(report_block); 77 } 78 79 Ok(receiver_report) 80 } 81 } 82 83 impl Marshal<Result<BytesMut, RtcpError>> for RtcpReceiverReport { marshal(&self) -> Result<BytesMut, RtcpError>84 fn marshal(&self) -> Result<BytesMut, RtcpError> { 85 let mut writer = BytesWriter::default(); 86 87 let header_bytesmut = self.header.marshal()?; 88 writer.write(&header_bytesmut[..])?; 89 90 writer.write_u32::<BigEndian>(self.ssrc)?; 91 for report_block in &self.report_blocks { 92 let data = report_block.marshal()?; 93 writer.write(&data[..])?; 94 } 95 96 Ok(writer.extract_current_bytes()) 97 } 98 } 99