OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_PACKET_H_ | 10 #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_PACKET_H_ |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 struct ExtensionInfo { | 135 struct ExtensionInfo { |
136 ExtensionType type; | 136 ExtensionType type; |
137 uint16_t offset; | 137 uint16_t offset; |
138 uint8_t length; | 138 uint8_t length; |
139 }; | 139 }; |
140 | 140 |
141 // Helper function for Parse. Fill header fields using data in given buffer, | 141 // Helper function for Parse. Fill header fields using data in given buffer, |
142 // but does not touch packet own buffer, leaving packet in invalid state. | 142 // but does not touch packet own buffer, leaving packet in invalid state. |
143 bool ParseBuffer(const uint8_t* buffer, size_t size); | 143 bool ParseBuffer(const uint8_t* buffer, size_t size); |
144 | 144 |
145 // Find an extension based on the type field of the parameter. | 145 // Find an extension |type|. |
146 // If found, length field would be validated, the offset field will be set | 146 // Returns view of the raw extension or empty view on failure. |
147 // and true returned, | 147 rtc::ArrayView<const uint8_t> FindExtension(ExtensionType type) const; |
148 // otherwise the parameter will be unchanged and false is returned. | |
149 bool FindExtension(ExtensionType type, | |
150 uint8_t length, | |
151 uint16_t* offset) const; | |
152 | 148 |
153 // Find or allocate an extension |type|. Returns view of size |length| | 149 // Find or allocate an extension |type|. Returns view of size |length| |
154 // to write raw extension to or an empty view on failure. | 150 // to write raw extension to or an empty view on failure. |
155 rtc::ArrayView<uint8_t> AllocateExtension(ExtensionType type, size_t length); | 151 rtc::ArrayView<uint8_t> AllocateExtension(ExtensionType type, size_t length); |
156 | 152 |
157 uint8_t* WriteAt(size_t offset); | 153 uint8_t* WriteAt(size_t offset); |
158 void WriteAt(size_t offset, uint8_t byte); | 154 void WriteAt(size_t offset, uint8_t byte); |
159 | 155 |
160 // Header. | 156 // Header. |
161 bool marker_; | 157 bool marker_; |
162 uint8_t payload_type_; | 158 uint8_t payload_type_; |
163 uint8_t padding_size_; | 159 uint8_t padding_size_; |
164 uint16_t sequence_number_; | 160 uint16_t sequence_number_; |
165 uint32_t timestamp_; | 161 uint32_t timestamp_; |
166 uint32_t ssrc_; | 162 uint32_t ssrc_; |
167 size_t payload_offset_; // Match header size with csrcs and extensions. | 163 size_t payload_offset_; // Match header size with csrcs and extensions. |
168 size_t payload_size_; | 164 size_t payload_size_; |
169 | 165 |
170 ExtensionInfo extension_entries_[kMaxExtensionHeaders]; | 166 ExtensionInfo extension_entries_[kMaxExtensionHeaders]; |
171 uint16_t extensions_size_ = 0; // Unaligned. | 167 uint16_t extensions_size_ = 0; // Unaligned. |
172 rtc::CopyOnWriteBuffer buffer_; | 168 rtc::CopyOnWriteBuffer buffer_; |
173 }; | 169 }; |
174 | 170 |
175 template <typename Extension> | 171 template <typename Extension> |
176 bool Packet::HasExtension() const { | 172 bool Packet::HasExtension() const { |
177 uint16_t offset = 0; | 173 return !FindExtension(Extension::kId).empty(); |
178 return FindExtension(Extension::kId, Extension::kValueSizeBytes, &offset); | |
179 } | 174 } |
180 | 175 |
181 template <typename Extension, typename... Values> | 176 template <typename Extension, typename... Values> |
182 bool Packet::GetExtension(Values... values) const { | 177 bool Packet::GetExtension(Values... values) const { |
183 uint16_t offset = 0; | 178 auto raw = FindExtension(Extension::kId); |
184 if (!FindExtension(Extension::kId, Extension::kValueSizeBytes, &offset)) | 179 if (raw.empty()) |
185 return false; | 180 return false; |
186 return Extension::Parse(data() + offset, values...); | 181 return Extension::Parse(raw, values...); |
187 } | 182 } |
188 | 183 |
189 template <typename Extension, typename... Values> | 184 template <typename Extension, typename... Values> |
190 bool Packet::SetExtension(Values... values) { | 185 bool Packet::SetExtension(Values... values) { |
191 auto buffer = AllocateExtension(Extension::kId, Extension::kValueSizeBytes); | 186 auto buffer = AllocateExtension(Extension::kId, Extension::kValueSizeBytes); |
192 if (buffer.empty()) | 187 if (buffer.empty()) |
193 return false; | 188 return false; |
194 return Extension::Write(buffer.data(), values...); | 189 return Extension::Write(buffer.data(), values...); |
195 } | 190 } |
196 | 191 |
197 template <typename Extension> | 192 template <typename Extension> |
198 bool Packet::ReserveExtension() { | 193 bool Packet::ReserveExtension() { |
199 auto buffer = AllocateExtension(Extension::kId, Extension::kValueSizeBytes); | 194 auto buffer = AllocateExtension(Extension::kId, Extension::kValueSizeBytes); |
200 if (buffer.empty()) | 195 if (buffer.empty()) |
201 return false; | 196 return false; |
202 memset(buffer.data(), 0, Extension::kValueSizeBytes); | 197 memset(buffer.data(), 0, Extension::kValueSizeBytes); |
203 return true; | 198 return true; |
204 } | 199 } |
205 } // namespace rtp | 200 } // namespace rtp |
206 } // namespace webrtc | 201 } // namespace webrtc |
207 | 202 |
208 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_PACKET_H_ | 203 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_PACKET_H_ |
OLD | NEW |