xref: /xiu/protocol/rtsp/src/rtp/mod.rs (revision b36cf5da)
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