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