1 pub mod define; 2 pub mod errors; 3 pub mod rtcp; 4 pub mod rtp_aac; 5 pub mod rtp_h264; 6 pub mod rtp_h265; 7 pub mod rtp_header; 8 pub mod utils; 9 10 use byteorder::BigEndian; 11 use bytes::{BufMut, BytesMut}; 12 use bytesio::bytes_errors::BytesReadError; 13 use bytesio::bytes_errors::BytesWriteError; 14 use bytesio::bytes_reader::BytesReader; 15 use bytesio::bytes_writer::BytesWriter; 16 use rtp_header::RtpHeader; 17 18 use self::utils::Marshal; 19 use self::utils::Unmarshal; 20 21 #[derive(Debug, Clone, Default)] 22 pub struct RtpPacket { 23 pub header: RtpHeader, 24 pub header_extension_profile: u16, 25 pub header_extension_length: u16, 26 pub header_extension_payload: BytesMut, 27 pub payload: BytesMut, 28 pub padding: BytesMut, 29 } 30 31 impl Unmarshal<&mut BytesReader, Result<Self, BytesReadError>> for RtpPacket { 32 //https://blog.jianchihu.net/webrtc-research-rtp-header-extension.html unmarshal(reader: &mut BytesReader) -> Result<Self, BytesReadError> where Self: Sized,33 fn unmarshal(reader: &mut BytesReader) -> Result<Self, BytesReadError> 34 where 35 Self: Sized, 36 { 37 let mut rtp_packet = RtpPacket { 38 header: RtpHeader::unmarshal(reader)?, 39 ..Default::default() 40 }; 41 42 if rtp_packet.header.extension_flag == 1 { 43 // 0 1 2 3 44 // 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 45 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 46 // | defined by profile | length | 47 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 48 // | header extension | 49 // | .... | 50 // header_extension = profile(2 bytes) + length(2 bytes) + header extension payload 51 rtp_packet.header_extension_profile = reader.read_u16::<BigEndian>()?; 52 rtp_packet.header_extension_length = reader.read_u16::<BigEndian>()?; 53 rtp_packet.header_extension_payload = 54 reader.read_bytes(4 * rtp_packet.header_extension_length as usize)?; 55 } 56 57 if rtp_packet.header.padding_flag == 1 { 58 let padding_length = reader.get(reader.len() - 1)? as usize; 59 rtp_packet 60 .payload 61 .put(reader.read_bytes(reader.len() - padding_length)?); 62 rtp_packet.padding.put(reader.read_bytes(padding_length)?); 63 } else { 64 rtp_packet.payload.put(reader.extract_remaining_bytes()); 65 } 66 67 Ok(rtp_packet) 68 } 69 } 70 71 impl Marshal<Result<BytesMut, BytesWriteError>> for RtpPacket { marshal(&self) -> Result<BytesMut, BytesWriteError>72 fn marshal(&self) -> Result<BytesMut, BytesWriteError> { 73 let mut writer = BytesWriter::new(); 74 75 let header_bytesmut = self.header.marshal()?; 76 writer.write(&header_bytesmut[..])?; 77 78 if self.header.extension_flag == 1 { 79 writer.write_u16::<BigEndian>(self.header_extension_profile)?; 80 writer.write_u16::<BigEndian>(self.header_extension_length)?; 81 writer.write(&self.header_extension_payload[..])?; 82 } 83 84 writer.write(&self.payload[..])?; 85 if self.header.padding_flag == 1 { 86 writer.write(&self.padding[..])?; 87 } 88 89 Ok(writer.extract_current_bytes()) 90 } 91 } 92 93 impl RtpPacket { new(header: RtpHeader) -> Self94 fn new(header: RtpHeader) -> Self { 95 Self { 96 header, 97 ..Default::default() 98 } 99 } 100 101 // pub fn unpack(&mut self, reader: &mut BytesReader) -> Result<(), BytesReadError> { 102 // self.header = RtpHeader::unmarshal(reader)?; 103 104 // if self.header.extension_flag == 1 { 105 // // 0 1 2 3 106 // // 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 107 // // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 108 // // | defined by profile | length | 109 // // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 110 // // | header extension | 111 // // | .... | 112 // // header_extension = profile(2 bytes) + length(2 bytes) + header extension payload 113 // self.header_extension_profile = reader.read_u16::<BigEndian>()?; 114 // self.header_extension_length = reader.read_u16::<BigEndian>()?; 115 // self.header_extension_payload = 116 // reader.read_bytes(4 * self.header_extension_length as usize)?; 117 // } 118 119 // if self.header.padding_flag == 1 { 120 // let padding_length = reader.get(reader.len() - 1)? as usize; 121 // self.payload 122 // .put(reader.read_bytes(reader.len() - padding_length)?); 123 // self.padding.put(reader.extract_remaining_bytes()); 124 // } 125 126 // Ok(()) 127 // } 128 // pub fn pack(&mut self) -> Result<BytesMut, BytesWriteError> { 129 // let mut writer = BytesWriter::new(); 130 131 // let header_bytesmut = self.header.marshal()?; 132 // writer.write(&header_bytesmut[..])?; 133 134 // writer.write_u16::<BigEndian>(self.header_extension_profile)?; 135 // writer.write_u16::<BigEndian>(self.header_extension_length)?; 136 // writer.write(&self.header_extension_payload[..])?; 137 138 // writer.write(&self.payload[..])?; 139 // writer.write(&self.padding[..])?; 140 141 // Ok(writer.extract_current_bytes()) 142 // } 143 } 144