Roc Toolkit internal modules
Roc Toolkit: real-time audio streaming
Loading...
Searching...
No Matches
headers.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015 Roc Streaming authors
3 *
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 */
8
9//! @file roc_rtp/headers.h
10//! @brief RTP headers.
11
12#ifndef ROC_RTP_HEADERS_H_
13#define ROC_RTP_HEADERS_H_
14
15#include "roc_core/attributes.h"
16#include "roc_core/endian.h"
17#include "roc_core/panic.h"
18#include "roc_core/stddefs.h"
19#include "roc_packet/units.h"
20
21namespace roc {
22namespace rtp {
23
24//! RTP protocol version.
25enum Version {
26 V2 = 2 //!< RTP version 2.
27};
28
29//! RTP payload type.
31 PayloadType_L16_Stereo = 10, //!< Audio, 16-bit PCM, 2 channels, 44100 Hz.
32 PayloadType_L16_Mono = 11 //!< Audio, 16-bit PCM, 1 channel, 44100 Hz.
33};
34
35//! RTP header.
36//!
37//! Contains fixed size part of 12 bytes and variable size CSRC array.
38//!
39//! RFC 3550 5.1: "RTP Fixed Header Fields"
40//!
41//! @code
42//! 0 1 2 3 4
43//! 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
44//! +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45//! |V=2|P|X| CC |M| PT | sequence number |
46//! +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
47//! | timestamp |
48//! +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
49//! | SSRC |
50//! +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
51//! | CSRC |
52//! | .... |
53//! +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54//! @endcode
56private:
57 enum {
58 //! @name RTP protocol version.
59 // @{
60 Flag_VersionShift = 6,
61 Flag_VersionMask = 0x3,
62 // @}
63
64 //! @name RTP padding flag.
65 //! @remarks
66 //! If this flag is set, packet contains padding at the end. Last byte
67 //! contains padding length.
68 // @{
69 Flag_PaddingShift = 5,
70 Flag_PaddingMask = 0x1,
71 // @}
72
73 //! @name RTP extension header flag.
74 //! @remarks
75 //! If this flag is set, packet contains extension header between main
76 //! header and payload.
77 // @{
78 Flag_ExtensionShift = 4,
79 Flag_ExtensionMask = 0x1,
80 // @}
81
82 //! @name Number of CSRC items at the end of RTP header.
83 // @{
84 Flag_CSRCShift = 0,
85 Flag_CSRCMask = 0xf,
86 // @}
87
88 //! @name RTP marker bit.
89 //! @remarks
90 //! Semantics of marker bit may vary and is defined by profile in use.
91 // @{
92 MPT_MarkerShift = 7,
93 MPT_MarkerMask = 0x1,
94 // @}
95
96 //! @name RTP payload type.
97 // @{
98 MPT_PayloadTypeShift = 0,
99 MPT_PayloadTypeMask = 0x7f
100 // @}
101 };
102
103 //! Packed flags (Flag_*).
104 uint8_t flags_;
105
106 //! Packed marker and payload type fields (MPT__*).
107 uint8_t mpt_;
108
109 //! Sequence number.
110 uint16_t seqnum_;
111
112 //! Timestamp.
113 uint32_t timestamp_;
114
115 //! Stream identifiers (SSRC and zero or more CSRC).
116 uint32_t ssrc_[1];
117
118public:
119 //! Get header size in bytes.
120 uint32_t header_size() const {
121 roc_panic_if(sizeof(*this) != 12);
122 return (uint32_t)sizeof(*this) + num_csrc() * (uint32_t)sizeof(uint32_t);
123 }
124
125 //! Clear header.
126 void clear() {
127 memset(this, 0, sizeof(*this));
128 }
129
130 //! Get version.
131 uint8_t version() const {
132 return ((flags_ >> Flag_VersionShift) & Flag_VersionMask);
133 }
134
135 //! Set version.
137 roc_panic_if((v & Flag_VersionMask) != v);
138 flags_ &= (uint8_t) ~(Flag_VersionMask << Flag_VersionShift);
139 flags_ |= ((uint8_t)v << Flag_VersionShift);
140 }
141
142 //! Get padding flag.
143 bool has_padding() const {
144 return (flags_ & (Flag_PaddingMask << Flag_PaddingShift));
145 }
146
147 //! Set padding flag.
148 void set_padding(bool v) {
149 flags_ &= (uint8_t) ~(Flag_PaddingMask << Flag_PaddingShift);
150 flags_ |= ((v ? 1 : 0) << Flag_PaddingShift);
151 }
152
153 //! Get extension flag.
154 bool has_extension() const {
155 return (flags_ & (Flag_ExtensionMask << Flag_ExtensionShift));
156 }
157
158 //! Get payload type.
159 uint8_t payload_type() const {
160 return ((mpt_ >> MPT_PayloadTypeShift) & MPT_PayloadTypeMask);
161 }
162
163 //! Set payload type.
164 void set_payload_type(uint8_t pt) {
165 roc_panic_if((pt & MPT_PayloadTypeMask) != pt);
166 mpt_ &= (uint8_t) ~(MPT_PayloadTypeMask << MPT_PayloadTypeShift);
167 mpt_ |= (pt << MPT_PayloadTypeShift);
168 }
169
170 //! Get marker bit.
171 bool marker() const {
172 return (mpt_ & (MPT_MarkerMask << MPT_MarkerShift));
173 }
174
175 //! Set marker bit.
176 void set_marker(bool m) {
177 mpt_ &= (uint8_t) ~(MPT_MarkerMask << MPT_MarkerShift);
178 mpt_ |= ((!!m) << MPT_MarkerShift);
179 }
180
181 //! Get sequence number.
183 return core::ntoh16u(seqnum_);
184 }
185
186 //! Set sequence number.
188 seqnum_ = core::hton16u(sn);
189 }
190
191 //! Get timestamp.
193 return core::ntoh32u(timestamp_);
194 }
195
196 //! Set timestamp.
198 timestamp_ = core::hton32u(ts);
199 }
200
201 //! Get SSRC.
203 return core::ntoh32u(ssrc_[0]);
204 }
205
206 //! Set SSRC.
208 ssrc_[0] = core::hton32u(s);
209 }
210
211 //! Get CSRC count.
212 uint8_t num_csrc() const {
213 return ((flags_ >> Flag_CSRCShift) & Flag_CSRCMask);
214 }
215
216 //! Get CSRC with given index.
217 packet::stream_source_t csrc(size_t index) const {
218 roc_panic_if(index >= num_csrc());
219 return core::ntoh32u(ssrc_[index + 1]);
220 }
222
223//! RTP extension header.
224//!
225//! Extension contains fixed size header of 4 bytes followed by variable
226//! length data.
227//!
228//! RFC 3550 5.3.1: "RTP Header Extension"
229//!
230//! @code
231//! 0 1 2 3 4
232//! 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
233//! +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
234//! | type | length |
235//! +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
236//! | extension data |
237//! | .... |
238//! +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
239//! @endcode
241private:
242 //! Extenson type.
243 uint16_t type_;
244
245 //! Number of 32-bit words in data following extension header.
246 uint16_t len_;
247
248public:
249 //! Get extension type.
250 uint16_t type() const {
251 return core::ntoh16u(type_);
252 }
253
254 //! Get extension data size in bytes (without extension header itself).
255 uint32_t data_size() const {
256 return (uint32_t(core::ntoh16u(len_)) << 2);
257 }
259
260} // namespace rtp
261} // namespace roc
262
263#endif // ROC_RTP_HEADERS_H_
Compiler attributes.
#define ROC_ATTR_PACKED_BEGIN
Pack structure fields. Place these before class or struct keyword.
Definition attributes.h:55
#define ROC_ATTR_PACKED_END
Pack structure fields. Place these between '}' and ';'.
Definition attributes.h:58
RTP extension header.
Definition headers.h:240
uint16_t type() const
Get extension type.
Definition headers.h:250
uint32_t data_size() const
Get extension data size in bytes (without extension header itself).
Definition headers.h:255
RTP header.
Definition headers.h:55
packet::seqnum_t seqnum() const
Get sequence number.
Definition headers.h:182
void set_ssrc(packet::stream_source_t s)
Set SSRC.
Definition headers.h:207
void set_seqnum(packet::seqnum_t sn)
Set sequence number.
Definition headers.h:187
void set_version(Version v)
Set version.
Definition headers.h:136
void set_payload_type(uint8_t pt)
Set payload type.
Definition headers.h:164
packet::stream_timestamp_t timestamp() const
Get timestamp.
Definition headers.h:192
void set_timestamp(packet::stream_timestamp_t ts)
Set timestamp.
Definition headers.h:197
bool has_padding() const
Get padding flag.
Definition headers.h:143
packet::stream_source_t csrc(size_t index) const
Get CSRC with given index.
Definition headers.h:217
uint8_t version() const
Get version.
Definition headers.h:131
uint32_t header_size() const
Get header size in bytes.
Definition headers.h:120
void set_marker(bool m)
Set marker bit.
Definition headers.h:176
bool has_extension() const
Get extension flag.
Definition headers.h:154
bool marker() const
Get marker bit.
Definition headers.h:171
void clear()
Clear header.
Definition headers.h:126
void set_padding(bool v)
Set padding flag.
Definition headers.h:148
packet::stream_source_t ssrc() const
Get SSRC.
Definition headers.h:202
uint8_t payload_type() const
Get payload type.
Definition headers.h:159
uint8_t num_csrc() const
Get CSRC count.
Definition headers.h:212
Endian conversion functions.
uint16_t hton16u(uint16_t v)
Host to network byte order (unsigned 16-bit).
Definition endian.h:54
uint16_t ntoh16u(uint16_t v)
Network to host byte order (unsigned 16-bit).
Definition endian.h:24
uint32_t hton32u(uint32_t v)
Host to network byte order (unsigned 32-bit).
Definition endian.h:64
uint32_t ntoh32u(uint32_t v)
Network to host byte order (unsigned 32-bit).
Definition endian.h:34
uint32_t stream_source_t
Packet stream identifier.
Definition units.h:27
uint16_t seqnum_t
Packet sequence number.
Definition units.h:78
uint32_t stream_timestamp_t
Packet stream timestamp.
Definition units.h:36
Version
RTP protocol version.
Definition headers.h:25
@ V2
RTP version 2.
Definition headers.h:26
PayloadType
RTP payload type.
Definition headers.h:30
@ PayloadType_L16_Mono
Audio, 16-bit PCM, 1 channel, 44100 Hz.
Definition headers.h:32
@ PayloadType_L16_Stereo
Audio, 16-bit PCM, 2 channels, 44100 Hz.
Definition headers.h:31
Root namespace.
Panic.
#define roc_panic_if(x)
Panic if condition is true.
Definition panic.h:26
Commonly used types and functions.
Various units used in packets.