OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 | 10 |
(...skipping 14 matching lines...) Expand all Loading... |
25 | 25 |
26 void RtpHeaderExtensionMap::Erase() { | 26 void RtpHeaderExtensionMap::Erase() { |
27 while (!extensionMap_.empty()) { | 27 while (!extensionMap_.empty()) { |
28 std::map<uint8_t, HeaderExtension*>::iterator it = | 28 std::map<uint8_t, HeaderExtension*>::iterator it = |
29 extensionMap_.begin(); | 29 extensionMap_.begin(); |
30 delete it->second; | 30 delete it->second; |
31 extensionMap_.erase(it); | 31 extensionMap_.erase(it); |
32 } | 32 } |
33 } | 33 } |
34 | 34 |
35 int32_t RtpHeaderExtensionMap::Register(const RTPExtensionType type, | 35 int32_t RtpHeaderExtensionMap::Register(RTPExtensionType type, uint8_t id) { |
36 const uint8_t id) { | |
37 return Register(type, id, true); | |
38 } | |
39 | |
40 int32_t RtpHeaderExtensionMap::RegisterInactive(const RTPExtensionType type, | |
41 const uint8_t id) { | |
42 return Register(type, id, false); | |
43 } | |
44 | |
45 int32_t RtpHeaderExtensionMap::Register(const RTPExtensionType type, | |
46 const uint8_t id, | |
47 bool active) { | |
48 if (id < 1 || id > 14) { | 36 if (id < 1 || id > 14) { |
49 return -1; | 37 return -1; |
50 } | 38 } |
51 std::map<uint8_t, HeaderExtension*>::iterator it = | 39 std::map<uint8_t, HeaderExtension*>::iterator it = |
52 extensionMap_.find(id); | 40 extensionMap_.find(id); |
53 if (it != extensionMap_.end()) { | 41 if (it != extensionMap_.end()) { |
54 if (it->second->type != type) { | 42 if (it->second->type != type) { |
55 // An extension is already registered with the same id | 43 // An extension is already registered with the same id |
56 // but a different type, so return failure. | 44 // but a different type, so return failure. |
57 return -1; | 45 return -1; |
58 } | 46 } |
59 // This extension type is already registered with this id, | 47 // This extension type is already registered with this id, |
60 // so return success. | 48 // so return success. |
61 it->second->active = active; | |
62 return 0; | 49 return 0; |
63 } | 50 } |
64 extensionMap_[id] = new HeaderExtension(type, active); | 51 extensionMap_[id] = new HeaderExtension(type); |
65 return 0; | 52 return 0; |
66 } | 53 } |
67 | 54 |
68 bool RtpHeaderExtensionMap::SetActive(const RTPExtensionType type, | |
69 bool active) { | |
70 for (auto& kv : extensionMap_) { | |
71 if (kv.second->type == type) { | |
72 kv.second->active = active; | |
73 return true; | |
74 } | |
75 } | |
76 return false; | |
77 } | |
78 | |
79 int32_t RtpHeaderExtensionMap::Deregister(const RTPExtensionType type) { | 55 int32_t RtpHeaderExtensionMap::Deregister(const RTPExtensionType type) { |
80 uint8_t id; | 56 uint8_t id; |
81 if (GetId(type, &id) != 0) { | 57 if (GetId(type, &id) != 0) { |
82 return 0; | 58 return 0; |
83 } | 59 } |
84 std::map<uint8_t, HeaderExtension*>::iterator it = | 60 std::map<uint8_t, HeaderExtension*>::iterator it = |
85 extensionMap_.find(id); | 61 extensionMap_.find(id); |
86 assert(it != extensionMap_.end()); | 62 assert(it != extensionMap_.end()); |
87 delete it->second; | 63 delete it->second; |
88 extensionMap_.erase(it); | 64 extensionMap_.erase(it); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 for (auto kv : extensionMap_) { | 117 for (auto kv : extensionMap_) { |
142 if (kv.second->type == type) | 118 if (kv.second->type == type) |
143 return kv.first; | 119 return kv.first; |
144 } | 120 } |
145 return kInvalidId; | 121 return kInvalidId; |
146 } | 122 } |
147 | 123 |
148 size_t RtpHeaderExtensionMap::GetTotalLengthInBytes() const { | 124 size_t RtpHeaderExtensionMap::GetTotalLengthInBytes() const { |
149 // Get length for each extension block. | 125 // Get length for each extension block. |
150 size_t length = 0; | 126 size_t length = 0; |
151 std::map<uint8_t, HeaderExtension*>::const_iterator it = | 127 for (const auto& kv : extensionMap_) |
152 extensionMap_.begin(); | 128 length += kv.second->length; |
153 while (it != extensionMap_.end()) { | |
154 HeaderExtension* extension = it->second; | |
155 if (extension->active) { | |
156 length += extension->length; | |
157 } | |
158 it++; | |
159 } | |
160 // Add RTP extension header length. | 129 // Add RTP extension header length. |
161 if (length > 0) { | 130 if (length > 0) |
162 length += kRtpOneByteHeaderLength; | 131 length += kRtpOneByteHeaderLength; |
163 } | |
164 // Pad up to nearest 32bit word. | 132 // Pad up to nearest 32bit word. |
165 length = RtpUtility::Word32Align(length); | 133 length = RtpUtility::Word32Align(length); |
166 return length; | 134 return length; |
167 } | 135 } |
168 | 136 |
169 int32_t RtpHeaderExtensionMap::GetLengthUntilBlockStartInBytes( | |
170 const RTPExtensionType type) const { | |
171 uint8_t id; | |
172 if (GetId(type, &id) != 0) { | |
173 // Not registered. | |
174 return -1; | |
175 } | |
176 // Get length until start of extension block type. | |
177 uint16_t length = kRtpOneByteHeaderLength; | |
178 | |
179 std::map<uint8_t, HeaderExtension*>::const_iterator it = | |
180 extensionMap_.begin(); | |
181 while (it != extensionMap_.end()) { | |
182 HeaderExtension* extension = it->second; | |
183 if (extension->type == type) { | |
184 if (!extension->active) { | |
185 return -1; | |
186 } | |
187 break; | |
188 } else if (extension->active) { | |
189 length += extension->length; | |
190 } | |
191 it++; | |
192 } | |
193 return length; | |
194 } | |
195 | |
196 int32_t RtpHeaderExtensionMap::Size() const { | 137 int32_t RtpHeaderExtensionMap::Size() const { |
197 int32_t count = 0; | 138 return extensionMap_.size(); |
198 for (auto& kv : extensionMap_) { | |
199 if (kv.second->active) { | |
200 count++; | |
201 } | |
202 } | |
203 return count; | |
204 } | |
205 | |
206 RTPExtensionType RtpHeaderExtensionMap::First() const { | |
207 for (auto& kv : extensionMap_) { | |
208 if (kv.second->active) { | |
209 return kv.second->type; | |
210 } | |
211 } | |
212 | |
213 return kRtpExtensionNone; | |
214 } | |
215 | |
216 RTPExtensionType RtpHeaderExtensionMap::Next(RTPExtensionType type) const { | |
217 uint8_t id; | |
218 if (GetId(type, &id) != 0) { | |
219 return kRtpExtensionNone; | |
220 } | |
221 std::map<uint8_t, HeaderExtension*>::const_iterator it = | |
222 extensionMap_.find(id); | |
223 if (it == extensionMap_.end() || !it->second->active) { | |
224 return kRtpExtensionNone; | |
225 } | |
226 while ((++it) != extensionMap_.end()) { | |
227 if (it->second->active) { | |
228 return it->second->type; | |
229 } | |
230 } | |
231 | |
232 return kRtpExtensionNone; | |
233 } | 139 } |
234 | 140 |
235 void RtpHeaderExtensionMap::GetCopy(RtpHeaderExtensionMap* map) const { | 141 void RtpHeaderExtensionMap::GetCopy(RtpHeaderExtensionMap* map) const { |
236 assert(map); | 142 assert(map); |
237 std::map<uint8_t, HeaderExtension*>::const_iterator it = | 143 std::map<uint8_t, HeaderExtension*>::const_iterator it = |
238 extensionMap_.begin(); | 144 extensionMap_.begin(); |
239 while (it != extensionMap_.end()) { | 145 while (it != extensionMap_.end()) { |
240 HeaderExtension* extension = it->second; | 146 HeaderExtension* extension = it->second; |
241 map->Register(extension->type, it->first, extension->active); | 147 map->Register(extension->type, it->first); |
242 it++; | 148 it++; |
243 } | 149 } |
244 } | 150 } |
245 } // namespace webrtc | 151 } // namespace webrtc |
OLD | NEW |