1 use super::errors::RtcpError; 2 use super::rtcp_header::RtcpHeader; 3 use super::rtcp_rr::ReportBlock; 4 use crate::rtp::utils::Marshal; 5 use crate::rtp::utils::Unmarshal; 6 use byteorder::BigEndian; 7 use bytes::BytesMut; 8 use bytesio::bytes_reader::BytesReader; 9 use bytesio::bytes_writer::BytesWriter; 10 11 // 0 1 2 3 12 // 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 13 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 14 // header |V=2|P| RC | PT=SR=200 | length | 15 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 16 // | SSRC of sender | 17 // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 18 // sender | NTP timestamp, most significant word | 19 // info +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 20 // | NTP timestamp, least significant word | 21 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 22 // | RTP timestamp | 23 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 24 // | sender's packet count | 25 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 26 // | sender's octet count | 27 // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 28 // report | SSRC_1 (SSRC of first source) | 29 // block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 30 // 1 | fraction lost | cumulative number of packets lost | 31 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 32 // | extended highest sequence number received | 33 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 34 // | interarrival jitter | 35 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 36 // | last SR (LSR) | 37 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 38 // | delay since last SR (DLSR) | 39 // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 40 // report | SSRC_2 (SSRC of second source) | 41 // block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 42 // 2 : ... : 43 // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 44 // | profile-specific extensions | 45 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 46 47 #[derive(Debug, Clone, Default)] 48 pub struct RtcpSenderReport { 49 pub header: RtcpHeader, 50 pub ssrc: u32, 51 pub ntp: u64, 52 rtp_timestamp: u32, 53 sender_packet_count: u32, 54 sender_octet_count: u32, 55 pub report_blocks: Vec<ReportBlock>, 56 } 57 58 impl Unmarshal<&mut BytesReader, Result<Self, RtcpError>> for RtcpSenderReport { unmarshal(reader: &mut BytesReader) -> Result<Self, RtcpError> where Self: Sized,59 fn unmarshal(reader: &mut BytesReader) -> Result<Self, RtcpError> 60 where 61 Self: Sized, 62 { 63 let mut sender_report = RtcpSenderReport { 64 header: RtcpHeader::unmarshal(reader)?, 65 ssrc: reader.read_u32::<BigEndian>()?, 66 ntp: reader.read_u64::<BigEndian>()?, 67 rtp_timestamp: reader.read_u32::<BigEndian>()?, 68 sender_packet_count: reader.read_u32::<BigEndian>()?, 69 sender_octet_count: reader.read_u32::<BigEndian>()?, 70 ..Default::default() 71 }; 72 73 for _ in 0..sender_report.header.report_count { 74 let report_block = ReportBlock::unmarshal(reader)?; 75 sender_report.report_blocks.push(report_block); 76 } 77 78 Ok(sender_report) 79 } 80 } 81 82 impl Marshal<Result<BytesMut, RtcpError>> for RtcpSenderReport { marshal(&self) -> Result<BytesMut, RtcpError>83 fn marshal(&self) -> Result<BytesMut, RtcpError> { 84 let mut writer = BytesWriter::default(); 85 86 let header_bytesmut = self.header.marshal()?; 87 writer.write(&header_bytesmut[..])?; 88 89 writer.write_u32::<BigEndian>(self.ssrc)?; 90 writer.write_u64::<BigEndian>(self.ntp)?; 91 writer.write_u32::<BigEndian>(self.rtp_timestamp)?; 92 writer.write_u32::<BigEndian>(self.sender_packet_count)?; 93 writer.write_u32::<BigEndian>(self.sender_octet_count)?; 94 95 for report_block in &self.report_blocks { 96 let data = report_block.marshal()?; 97 writer.write(&data[..])?; 98 } 99 100 Ok(writer.extract_current_bytes()) 101 } 102 } 103