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