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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 RtcpPacketTypeCounterObserver* packet_type_counter_observer, | 42 RtcpPacketTypeCounterObserver* packet_type_counter_observer, |
43 RtcpBandwidthObserver* rtcp_bandwidth_observer, | 43 RtcpBandwidthObserver* rtcp_bandwidth_observer, |
44 RtcpIntraFrameObserver* rtcp_intra_frame_observer, | 44 RtcpIntraFrameObserver* rtcp_intra_frame_observer, |
45 TransportFeedbackObserver* transport_feedback_observer, | 45 TransportFeedbackObserver* transport_feedback_observer, |
46 ModuleRtpRtcpImpl* owner) | 46 ModuleRtpRtcpImpl* owner) |
47 : TMMBRHelp(), | 47 : TMMBRHelp(), |
48 _clock(clock), | 48 _clock(clock), |
49 receiver_only_(receiver_only), | 49 receiver_only_(receiver_only), |
50 _lastReceived(0), | 50 _lastReceived(0), |
51 _rtpRtcp(*owner), | 51 _rtpRtcp(*owner), |
52 _criticalSectionFeedbacks( | |
53 CriticalSectionWrapper::CreateCriticalSection()), | |
54 _cbRtcpBandwidthObserver(rtcp_bandwidth_observer), | 52 _cbRtcpBandwidthObserver(rtcp_bandwidth_observer), |
55 _cbRtcpIntraFrameObserver(rtcp_intra_frame_observer), | 53 _cbRtcpIntraFrameObserver(rtcp_intra_frame_observer), |
56 _cbTransportFeedbackObserver(transport_feedback_observer), | 54 _cbTransportFeedbackObserver(transport_feedback_observer), |
57 _criticalSectionRTCPReceiver( | |
58 CriticalSectionWrapper::CreateCriticalSection()), | |
59 main_ssrc_(0), | 55 main_ssrc_(0), |
60 _remoteSSRC(0), | 56 _remoteSSRC(0), |
61 _remoteSenderInfo(), | 57 _remoteSenderInfo(), |
62 _lastReceivedSRNTPsecs(0), | 58 _lastReceivedSRNTPsecs(0), |
63 _lastReceivedSRNTPfrac(0), | 59 _lastReceivedSRNTPfrac(0), |
64 _lastReceivedXRNTPsecs(0), | 60 _lastReceivedXRNTPsecs(0), |
65 _lastReceivedXRNTPfrac(0), | 61 _lastReceivedXRNTPfrac(0), |
66 xr_rrtr_status_(false), | 62 xr_rrtr_status_(false), |
67 xr_rr_rtt_ms_(0), | 63 xr_rr_rtt_ms_(0), |
68 _receivedInfoMap(), | 64 _receivedInfoMap(), |
69 _lastReceivedRrMs(0), | 65 _lastReceivedRrMs(0), |
70 _lastIncreasedSequenceNumberMs(0), | 66 _lastIncreasedSequenceNumberMs(0), |
71 stats_callback_(NULL), | 67 stats_callback_(NULL), |
72 packet_type_counter_observer_(packet_type_counter_observer), | 68 packet_type_counter_observer_(packet_type_counter_observer), |
73 num_skipped_packets_(0), | 69 num_skipped_packets_(0), |
74 last_skipped_packets_warning_(clock->TimeInMilliseconds()) { | 70 last_skipped_packets_warning_(clock->TimeInMilliseconds()) { |
75 memset(&_remoteSenderInfo, 0, sizeof(_remoteSenderInfo)); | 71 memset(&_remoteSenderInfo, 0, sizeof(_remoteSenderInfo)); |
76 } | 72 } |
77 | 73 |
78 RTCPReceiver::~RTCPReceiver() { | 74 RTCPReceiver::~RTCPReceiver() { |
79 delete _criticalSectionRTCPReceiver; | |
80 delete _criticalSectionFeedbacks; | |
81 | |
82 ReportBlockMap::iterator it = _receivedReportBlockMap.begin(); | 75 ReportBlockMap::iterator it = _receivedReportBlockMap.begin(); |
83 for (; it != _receivedReportBlockMap.end(); ++it) { | 76 for (; it != _receivedReportBlockMap.end(); ++it) { |
84 ReportBlockInfoMap* info_map = &(it->second); | 77 ReportBlockInfoMap* info_map = &(it->second); |
85 while (!info_map->empty()) { | 78 while (!info_map->empty()) { |
86 ReportBlockInfoMap::iterator it_info = info_map->begin(); | 79 ReportBlockInfoMap::iterator it_info = info_map->begin(); |
87 delete it_info->second; | 80 delete it_info->second; |
88 info_map->erase(it_info); | 81 info_map->erase(it_info); |
89 } | 82 } |
90 } | 83 } |
91 while (!_receivedInfoMap.empty()) { | 84 while (!_receivedInfoMap.empty()) { |
92 std::map<uint32_t, RTCPReceiveInformation*>::iterator first = | 85 std::map<uint32_t, RTCPReceiveInformation*>::iterator first = |
93 _receivedInfoMap.begin(); | 86 _receivedInfoMap.begin(); |
94 delete first->second; | 87 delete first->second; |
95 _receivedInfoMap.erase(first); | 88 _receivedInfoMap.erase(first); |
96 } | 89 } |
97 while (!_receivedCnameMap.empty()) { | 90 while (!_receivedCnameMap.empty()) { |
98 std::map<uint32_t, RTCPCnameInformation*>::iterator first = | 91 std::map<uint32_t, RTCPCnameInformation*>::iterator first = |
99 _receivedCnameMap.begin(); | 92 _receivedCnameMap.begin(); |
100 delete first->second; | 93 delete first->second; |
101 _receivedCnameMap.erase(first); | 94 _receivedCnameMap.erase(first); |
102 } | 95 } |
103 } | 96 } |
104 | 97 |
105 int64_t RTCPReceiver::LastReceived() { | 98 int64_t RTCPReceiver::LastReceived() { |
106 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 99 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
107 return _lastReceived; | 100 return _lastReceived; |
108 } | 101 } |
109 | 102 |
110 int64_t RTCPReceiver::LastReceivedReceiverReport() const { | 103 int64_t RTCPReceiver::LastReceivedReceiverReport() const { |
111 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 104 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
112 int64_t last_received_rr = -1; | 105 int64_t last_received_rr = -1; |
113 for (ReceivedInfoMap::const_iterator it = _receivedInfoMap.begin(); | 106 for (ReceivedInfoMap::const_iterator it = _receivedInfoMap.begin(); |
114 it != _receivedInfoMap.end(); ++it) { | 107 it != _receivedInfoMap.end(); ++it) { |
115 if (it->second->lastTimeReceived > last_received_rr) { | 108 if (it->second->lastTimeReceived > last_received_rr) { |
116 last_received_rr = it->second->lastTimeReceived; | 109 last_received_rr = it->second->lastTimeReceived; |
117 } | 110 } |
118 } | 111 } |
119 return last_received_rr; | 112 return last_received_rr; |
120 } | 113 } |
121 | 114 |
122 void RTCPReceiver::SetRemoteSSRC(uint32_t ssrc) { | 115 void RTCPReceiver::SetRemoteSSRC(uint32_t ssrc) { |
123 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 116 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
124 | 117 |
125 // new SSRC reset old reports | 118 // new SSRC reset old reports |
126 memset(&_remoteSenderInfo, 0, sizeof(_remoteSenderInfo)); | 119 memset(&_remoteSenderInfo, 0, sizeof(_remoteSenderInfo)); |
127 _lastReceivedSRNTPsecs = 0; | 120 _lastReceivedSRNTPsecs = 0; |
128 _lastReceivedSRNTPfrac = 0; | 121 _lastReceivedSRNTPfrac = 0; |
129 | 122 |
130 _remoteSSRC = ssrc; | 123 _remoteSSRC = ssrc; |
131 } | 124 } |
132 | 125 |
133 uint32_t RTCPReceiver::RemoteSSRC() const { | 126 uint32_t RTCPReceiver::RemoteSSRC() const { |
134 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 127 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
135 return _remoteSSRC; | 128 return _remoteSSRC; |
136 } | 129 } |
137 | 130 |
138 void RTCPReceiver::SetSsrcs(uint32_t main_ssrc, | 131 void RTCPReceiver::SetSsrcs(uint32_t main_ssrc, |
139 const std::set<uint32_t>& registered_ssrcs) { | 132 const std::set<uint32_t>& registered_ssrcs) { |
140 uint32_t old_ssrc = 0; | 133 uint32_t old_ssrc = 0; |
141 { | 134 { |
142 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 135 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
143 old_ssrc = main_ssrc_; | 136 old_ssrc = main_ssrc_; |
144 main_ssrc_ = main_ssrc; | 137 main_ssrc_ = main_ssrc; |
145 registered_ssrcs_ = registered_ssrcs; | 138 registered_ssrcs_ = registered_ssrcs; |
146 } | 139 } |
147 { | 140 { |
148 if (_cbRtcpIntraFrameObserver && old_ssrc != main_ssrc) { | 141 if (_cbRtcpIntraFrameObserver && old_ssrc != main_ssrc) { |
149 _cbRtcpIntraFrameObserver->OnLocalSsrcChanged(old_ssrc, main_ssrc); | 142 _cbRtcpIntraFrameObserver->OnLocalSsrcChanged(old_ssrc, main_ssrc); |
150 } | 143 } |
151 } | 144 } |
152 } | 145 } |
153 | 146 |
154 int32_t RTCPReceiver::RTT(uint32_t remoteSSRC, | 147 int32_t RTCPReceiver::RTT(uint32_t remoteSSRC, |
155 int64_t* RTT, | 148 int64_t* RTT, |
156 int64_t* avgRTT, | 149 int64_t* avgRTT, |
157 int64_t* minRTT, | 150 int64_t* minRTT, |
158 int64_t* maxRTT) const { | 151 int64_t* maxRTT) const { |
159 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 152 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
160 | 153 |
161 RTCPReportBlockInformation* reportBlock = | 154 RTCPReportBlockInformation* reportBlock = |
162 GetReportBlockInformation(remoteSSRC, main_ssrc_); | 155 GetReportBlockInformation(remoteSSRC, main_ssrc_); |
163 | 156 |
164 if (reportBlock == NULL) { | 157 if (reportBlock == NULL) { |
165 return -1; | 158 return -1; |
166 } | 159 } |
167 if (RTT) { | 160 if (RTT) { |
168 *RTT = reportBlock->RTT; | 161 *RTT = reportBlock->RTT; |
169 } | 162 } |
170 if (avgRTT) { | 163 if (avgRTT) { |
171 *avgRTT = reportBlock->avgRTT; | 164 *avgRTT = reportBlock->avgRTT; |
172 } | 165 } |
173 if (minRTT) { | 166 if (minRTT) { |
174 *minRTT = reportBlock->minRTT; | 167 *minRTT = reportBlock->minRTT; |
175 } | 168 } |
176 if (maxRTT) { | 169 if (maxRTT) { |
177 *maxRTT = reportBlock->maxRTT; | 170 *maxRTT = reportBlock->maxRTT; |
178 } | 171 } |
179 return 0; | 172 return 0; |
180 } | 173 } |
181 | 174 |
182 void RTCPReceiver::SetRtcpXrRrtrStatus(bool enable) { | 175 void RTCPReceiver::SetRtcpXrRrtrStatus(bool enable) { |
183 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 176 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
184 xr_rrtr_status_ = enable; | 177 xr_rrtr_status_ = enable; |
185 } | 178 } |
186 | 179 |
187 bool RTCPReceiver::GetAndResetXrRrRtt(int64_t* rtt_ms) { | 180 bool RTCPReceiver::GetAndResetXrRrRtt(int64_t* rtt_ms) { |
188 assert(rtt_ms); | 181 assert(rtt_ms); |
189 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 182 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
190 if (xr_rr_rtt_ms_ == 0) { | 183 if (xr_rr_rtt_ms_ == 0) { |
191 return false; | 184 return false; |
192 } | 185 } |
193 *rtt_ms = xr_rr_rtt_ms_; | 186 *rtt_ms = xr_rr_rtt_ms_; |
194 xr_rr_rtt_ms_ = 0; | 187 xr_rr_rtt_ms_ = 0; |
195 return true; | 188 return true; |
196 } | 189 } |
197 | 190 |
198 // TODO(pbos): Make this fail when we haven't received NTP. | 191 // TODO(pbos): Make this fail when we haven't received NTP. |
199 bool RTCPReceiver::NTP(uint32_t* ReceivedNTPsecs, | 192 bool RTCPReceiver::NTP(uint32_t* ReceivedNTPsecs, |
200 uint32_t* ReceivedNTPfrac, | 193 uint32_t* ReceivedNTPfrac, |
201 uint32_t* RTCPArrivalTimeSecs, | 194 uint32_t* RTCPArrivalTimeSecs, |
202 uint32_t* RTCPArrivalTimeFrac, | 195 uint32_t* RTCPArrivalTimeFrac, |
203 uint32_t* rtcp_timestamp) const | 196 uint32_t* rtcp_timestamp) const |
204 { | 197 { |
205 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 198 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
206 if(ReceivedNTPsecs) | 199 if(ReceivedNTPsecs) |
207 { | 200 { |
208 *ReceivedNTPsecs = _remoteSenderInfo.NTPseconds; // NTP from incoming Se
ndReport | 201 *ReceivedNTPsecs = _remoteSenderInfo.NTPseconds; // NTP from incoming Se
ndReport |
209 } | 202 } |
210 if(ReceivedNTPfrac) | 203 if(ReceivedNTPfrac) |
211 { | 204 { |
212 *ReceivedNTPfrac = _remoteSenderInfo.NTPfraction; | 205 *ReceivedNTPfrac = _remoteSenderInfo.NTPfraction; |
213 } | 206 } |
214 if(RTCPArrivalTimeFrac) | 207 if(RTCPArrivalTimeFrac) |
215 { | 208 { |
216 *RTCPArrivalTimeFrac = _lastReceivedSRNTPfrac; // local NTP time when we
received a RTCP packet with a send block | 209 *RTCPArrivalTimeFrac = _lastReceivedSRNTPfrac; // local NTP time when we
received a RTCP packet with a send block |
217 } | 210 } |
218 if(RTCPArrivalTimeSecs) | 211 if(RTCPArrivalTimeSecs) |
219 { | 212 { |
220 *RTCPArrivalTimeSecs = _lastReceivedSRNTPsecs; | 213 *RTCPArrivalTimeSecs = _lastReceivedSRNTPsecs; |
221 } | 214 } |
222 if (rtcp_timestamp) { | 215 if (rtcp_timestamp) { |
223 *rtcp_timestamp = _remoteSenderInfo.RTPtimeStamp; | 216 *rtcp_timestamp = _remoteSenderInfo.RTPtimeStamp; |
224 } | 217 } |
225 return true; | 218 return true; |
226 } | 219 } |
227 | 220 |
228 bool RTCPReceiver::LastReceivedXrReferenceTimeInfo( | 221 bool RTCPReceiver::LastReceivedXrReferenceTimeInfo( |
229 RtcpReceiveTimeInfo* info) const { | 222 RtcpReceiveTimeInfo* info) const { |
230 assert(info); | 223 assert(info); |
231 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 224 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
232 if (_lastReceivedXRNTPsecs == 0 && _lastReceivedXRNTPfrac == 0) { | 225 if (_lastReceivedXRNTPsecs == 0 && _lastReceivedXRNTPfrac == 0) { |
233 return false; | 226 return false; |
234 } | 227 } |
235 | 228 |
236 info->sourceSSRC = _remoteXRReceiveTimeInfo.sourceSSRC; | 229 info->sourceSSRC = _remoteXRReceiveTimeInfo.sourceSSRC; |
237 info->lastRR = _remoteXRReceiveTimeInfo.lastRR; | 230 info->lastRR = _remoteXRReceiveTimeInfo.lastRR; |
238 | 231 |
239 // Get the delay since last received report (RFC 3611). | 232 // Get the delay since last received report (RFC 3611). |
240 uint32_t receive_time = RTCPUtility::MidNtp(_lastReceivedXRNTPsecs, | 233 uint32_t receive_time = RTCPUtility::MidNtp(_lastReceivedXRNTPsecs, |
241 _lastReceivedXRNTPfrac); | 234 _lastReceivedXRNTPfrac); |
242 | 235 |
243 uint32_t ntp_sec = 0; | 236 uint32_t ntp_sec = 0; |
244 uint32_t ntp_frac = 0; | 237 uint32_t ntp_frac = 0; |
245 _clock->CurrentNtp(ntp_sec, ntp_frac); | 238 _clock->CurrentNtp(ntp_sec, ntp_frac); |
246 uint32_t now = RTCPUtility::MidNtp(ntp_sec, ntp_frac); | 239 uint32_t now = RTCPUtility::MidNtp(ntp_sec, ntp_frac); |
247 | 240 |
248 info->delaySinceLastRR = now - receive_time; | 241 info->delaySinceLastRR = now - receive_time; |
249 return true; | 242 return true; |
250 } | 243 } |
251 | 244 |
252 int32_t RTCPReceiver::SenderInfoReceived(RTCPSenderInfo* senderInfo) const { | 245 int32_t RTCPReceiver::SenderInfoReceived(RTCPSenderInfo* senderInfo) const { |
253 assert(senderInfo); | 246 assert(senderInfo); |
254 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 247 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
255 if (_lastReceivedSRNTPsecs == 0) { | 248 if (_lastReceivedSRNTPsecs == 0) { |
256 return -1; | 249 return -1; |
257 } | 250 } |
258 memcpy(senderInfo, &(_remoteSenderInfo), sizeof(RTCPSenderInfo)); | 251 memcpy(senderInfo, &(_remoteSenderInfo), sizeof(RTCPSenderInfo)); |
259 return 0; | 252 return 0; |
260 } | 253 } |
261 | 254 |
262 // statistics | 255 // statistics |
263 // we can get multiple receive reports when we receive the report from a CE | 256 // we can get multiple receive reports when we receive the report from a CE |
264 int32_t RTCPReceiver::StatisticsReceived( | 257 int32_t RTCPReceiver::StatisticsReceived( |
265 std::vector<RTCPReportBlock>* receiveBlocks) const { | 258 std::vector<RTCPReportBlock>* receiveBlocks) const { |
266 assert(receiveBlocks); | 259 assert(receiveBlocks); |
267 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 260 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
268 ReportBlockMap::const_iterator it = _receivedReportBlockMap.begin(); | 261 ReportBlockMap::const_iterator it = _receivedReportBlockMap.begin(); |
269 for (; it != _receivedReportBlockMap.end(); ++it) { | 262 for (; it != _receivedReportBlockMap.end(); ++it) { |
270 const ReportBlockInfoMap* info_map = &(it->second); | 263 const ReportBlockInfoMap* info_map = &(it->second); |
271 ReportBlockInfoMap::const_iterator it_info = info_map->begin(); | 264 ReportBlockInfoMap::const_iterator it_info = info_map->begin(); |
272 for (; it_info != info_map->end(); ++it_info) { | 265 for (; it_info != info_map->end(); ++it_info) { |
273 receiveBlocks->push_back(it_info->second->remoteReceiveBlock); | 266 receiveBlocks->push_back(it_info->second->remoteReceiveBlock); |
274 } | 267 } |
275 } | 268 } |
276 return 0; | 269 return 0; |
277 } | 270 } |
278 | 271 |
279 int32_t | 272 int32_t |
280 RTCPReceiver::IncomingRTCPPacket(RTCPPacketInformation& rtcpPacketInformation, | 273 RTCPReceiver::IncomingRTCPPacket(RTCPPacketInformation& rtcpPacketInformation, |
281 RTCPUtility::RTCPParserV2* rtcpParser) | 274 RTCPUtility::RTCPParserV2* rtcpParser) |
282 { | 275 { |
283 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 276 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
284 | 277 |
285 _lastReceived = _clock->TimeInMilliseconds(); | 278 _lastReceived = _clock->TimeInMilliseconds(); |
286 | 279 |
287 if (packet_type_counter_.first_packet_time_ms == -1) { | 280 if (packet_type_counter_.first_packet_time_ms == -1) { |
288 packet_type_counter_.first_packet_time_ms = _lastReceived; | 281 packet_type_counter_.first_packet_time_ms = _lastReceived; |
289 } | 282 } |
290 | 283 |
291 RTCPUtility::RTCPPacketTypes pktType = rtcpParser->Begin(); | 284 RTCPUtility::RTCPPacketTypes pktType = rtcpParser->Begin(); |
292 while (pktType != RTCPPacketTypes::kInvalid) { | 285 while (pktType != RTCPPacketTypes::kInvalid) { |
293 // Each "case" is responsible for iterate the parser to the | 286 // Each "case" is responsible for iterate the parser to the |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 const ReportBlockInfoMap* info_map = &(it->second); | 576 const ReportBlockInfoMap* info_map = &(it->second); |
584 ReportBlockInfoMap::const_iterator it_info = info_map->find(remote_ssrc); | 577 ReportBlockInfoMap::const_iterator it_info = info_map->find(remote_ssrc); |
585 if (it_info == info_map->end()) { | 578 if (it_info == info_map->end()) { |
586 return NULL; | 579 return NULL; |
587 } | 580 } |
588 return it_info->second; | 581 return it_info->second; |
589 } | 582 } |
590 | 583 |
591 RTCPCnameInformation* | 584 RTCPCnameInformation* |
592 RTCPReceiver::CreateCnameInformation(uint32_t remoteSSRC) { | 585 RTCPReceiver::CreateCnameInformation(uint32_t remoteSSRC) { |
593 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 586 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
594 | 587 |
595 std::map<uint32_t, RTCPCnameInformation*>::iterator it = | 588 std::map<uint32_t, RTCPCnameInformation*>::iterator it = |
596 _receivedCnameMap.find(remoteSSRC); | 589 _receivedCnameMap.find(remoteSSRC); |
597 | 590 |
598 if (it != _receivedCnameMap.end()) { | 591 if (it != _receivedCnameMap.end()) { |
599 return it->second; | 592 return it->second; |
600 } | 593 } |
601 RTCPCnameInformation* cnameInfo = new RTCPCnameInformation; | 594 RTCPCnameInformation* cnameInfo = new RTCPCnameInformation; |
602 memset(cnameInfo->name, 0, RTCP_CNAME_SIZE); | 595 memset(cnameInfo->name, 0, RTCP_CNAME_SIZE); |
603 _receivedCnameMap[remoteSSRC] = cnameInfo; | 596 _receivedCnameMap[remoteSSRC] = cnameInfo; |
604 return cnameInfo; | 597 return cnameInfo; |
605 } | 598 } |
606 | 599 |
607 RTCPCnameInformation* | 600 RTCPCnameInformation* |
608 RTCPReceiver::GetCnameInformation(uint32_t remoteSSRC) const { | 601 RTCPReceiver::GetCnameInformation(uint32_t remoteSSRC) const { |
609 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 602 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
610 | 603 |
611 std::map<uint32_t, RTCPCnameInformation*>::const_iterator it = | 604 std::map<uint32_t, RTCPCnameInformation*>::const_iterator it = |
612 _receivedCnameMap.find(remoteSSRC); | 605 _receivedCnameMap.find(remoteSSRC); |
613 | 606 |
614 if (it == _receivedCnameMap.end()) { | 607 if (it == _receivedCnameMap.end()) { |
615 return NULL; | 608 return NULL; |
616 } | 609 } |
617 return it->second; | 610 return it->second; |
618 } | 611 } |
619 | 612 |
620 RTCPReceiveInformation* | 613 RTCPReceiveInformation* |
621 RTCPReceiver::CreateReceiveInformation(uint32_t remoteSSRC) { | 614 RTCPReceiver::CreateReceiveInformation(uint32_t remoteSSRC) { |
622 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 615 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
623 | 616 |
624 std::map<uint32_t, RTCPReceiveInformation*>::iterator it = | 617 std::map<uint32_t, RTCPReceiveInformation*>::iterator it = |
625 _receivedInfoMap.find(remoteSSRC); | 618 _receivedInfoMap.find(remoteSSRC); |
626 | 619 |
627 if (it != _receivedInfoMap.end()) { | 620 if (it != _receivedInfoMap.end()) { |
628 return it->second; | 621 return it->second; |
629 } | 622 } |
630 RTCPReceiveInformation* receiveInfo = new RTCPReceiveInformation; | 623 RTCPReceiveInformation* receiveInfo = new RTCPReceiveInformation; |
631 _receivedInfoMap[remoteSSRC] = receiveInfo; | 624 _receivedInfoMap[remoteSSRC] = receiveInfo; |
632 return receiveInfo; | 625 return receiveInfo; |
633 } | 626 } |
634 | 627 |
635 RTCPReceiveInformation* | 628 RTCPReceiveInformation* |
636 RTCPReceiver::GetReceiveInformation(uint32_t remoteSSRC) { | 629 RTCPReceiver::GetReceiveInformation(uint32_t remoteSSRC) { |
637 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 630 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
638 | 631 |
639 std::map<uint32_t, RTCPReceiveInformation*>::iterator it = | 632 std::map<uint32_t, RTCPReceiveInformation*>::iterator it = |
640 _receivedInfoMap.find(remoteSSRC); | 633 _receivedInfoMap.find(remoteSSRC); |
641 if (it == _receivedInfoMap.end()) { | 634 if (it == _receivedInfoMap.end()) { |
642 return NULL; | 635 return NULL; |
643 } | 636 } |
644 return it->second; | 637 return it->second; |
645 } | 638 } |
646 | 639 |
647 void RTCPReceiver::UpdateReceiveInformation( | 640 void RTCPReceiver::UpdateReceiveInformation( |
648 RTCPReceiveInformation& receiveInformation) { | 641 RTCPReceiveInformation& receiveInformation) { |
649 // Update that this remote is alive | 642 // Update that this remote is alive |
650 receiveInformation.lastTimeReceived = _clock->TimeInMilliseconds(); | 643 receiveInformation.lastTimeReceived = _clock->TimeInMilliseconds(); |
651 } | 644 } |
652 | 645 |
653 bool RTCPReceiver::RtcpRrTimeout(int64_t rtcp_interval_ms) { | 646 bool RTCPReceiver::RtcpRrTimeout(int64_t rtcp_interval_ms) { |
654 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 647 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
655 if (_lastReceivedRrMs == 0) | 648 if (_lastReceivedRrMs == 0) |
656 return false; | 649 return false; |
657 | 650 |
658 int64_t time_out_ms = kRrTimeoutIntervals * rtcp_interval_ms; | 651 int64_t time_out_ms = kRrTimeoutIntervals * rtcp_interval_ms; |
659 if (_clock->TimeInMilliseconds() > _lastReceivedRrMs + time_out_ms) { | 652 if (_clock->TimeInMilliseconds() > _lastReceivedRrMs + time_out_ms) { |
660 // Reset the timer to only trigger one log. | 653 // Reset the timer to only trigger one log. |
661 _lastReceivedRrMs = 0; | 654 _lastReceivedRrMs = 0; |
662 return true; | 655 return true; |
663 } | 656 } |
664 return false; | 657 return false; |
665 } | 658 } |
666 | 659 |
667 bool RTCPReceiver::RtcpRrSequenceNumberTimeout(int64_t rtcp_interval_ms) { | 660 bool RTCPReceiver::RtcpRrSequenceNumberTimeout(int64_t rtcp_interval_ms) { |
668 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 661 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
669 if (_lastIncreasedSequenceNumberMs == 0) | 662 if (_lastIncreasedSequenceNumberMs == 0) |
670 return false; | 663 return false; |
671 | 664 |
672 int64_t time_out_ms = kRrTimeoutIntervals * rtcp_interval_ms; | 665 int64_t time_out_ms = kRrTimeoutIntervals * rtcp_interval_ms; |
673 if (_clock->TimeInMilliseconds() > _lastIncreasedSequenceNumberMs + | 666 if (_clock->TimeInMilliseconds() > _lastIncreasedSequenceNumberMs + |
674 time_out_ms) { | 667 time_out_ms) { |
675 // Reset the timer to only trigger one log. | 668 // Reset the timer to only trigger one log. |
676 _lastIncreasedSequenceNumberMs = 0; | 669 _lastIncreasedSequenceNumberMs = 0; |
677 return true; | 670 return true; |
678 } | 671 } |
679 return false; | 672 return false; |
680 } | 673 } |
681 | 674 |
682 bool RTCPReceiver::UpdateRTCPReceiveInformationTimers() { | 675 bool RTCPReceiver::UpdateRTCPReceiveInformationTimers() { |
683 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 676 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
684 | 677 |
685 bool updateBoundingSet = false; | 678 bool updateBoundingSet = false; |
686 int64_t timeNow = _clock->TimeInMilliseconds(); | 679 int64_t timeNow = _clock->TimeInMilliseconds(); |
687 | 680 |
688 std::map<uint32_t, RTCPReceiveInformation*>::iterator receiveInfoIt = | 681 std::map<uint32_t, RTCPReceiveInformation*>::iterator receiveInfoIt = |
689 _receivedInfoMap.begin(); | 682 _receivedInfoMap.begin(); |
690 | 683 |
691 while (receiveInfoIt != _receivedInfoMap.end()) { | 684 while (receiveInfoIt != _receivedInfoMap.end()) { |
692 RTCPReceiveInformation* receiveInfo = receiveInfoIt->second; | 685 RTCPReceiveInformation* receiveInfo = receiveInfoIt->second; |
693 if (receiveInfo == NULL) { | 686 if (receiveInfo == NULL) { |
(...skipping 23 matching lines...) Expand all Loading... |
717 delete receiveInfoItemToBeErased->second; | 710 delete receiveInfoItemToBeErased->second; |
718 _receivedInfoMap.erase(receiveInfoItemToBeErased); | 711 _receivedInfoMap.erase(receiveInfoItemToBeErased); |
719 } else { | 712 } else { |
720 receiveInfoIt++; | 713 receiveInfoIt++; |
721 } | 714 } |
722 } | 715 } |
723 return updateBoundingSet; | 716 return updateBoundingSet; |
724 } | 717 } |
725 | 718 |
726 int32_t RTCPReceiver::BoundingSet(bool* tmmbrOwner, TMMBRSet* boundingSetRec) { | 719 int32_t RTCPReceiver::BoundingSet(bool* tmmbrOwner, TMMBRSet* boundingSetRec) { |
727 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 720 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
728 | 721 |
729 std::map<uint32_t, RTCPReceiveInformation*>::iterator receiveInfoIt = | 722 std::map<uint32_t, RTCPReceiveInformation*>::iterator receiveInfoIt = |
730 _receivedInfoMap.find(_remoteSSRC); | 723 _receivedInfoMap.find(_remoteSSRC); |
731 | 724 |
732 if (receiveInfoIt == _receivedInfoMap.end()) { | 725 if (receiveInfoIt == _receivedInfoMap.end()) { |
733 return -1; | 726 return -1; |
734 } | 727 } |
735 RTCPReceiveInformation* receiveInfo = receiveInfoIt->second; | 728 RTCPReceiveInformation* receiveInfo = receiveInfoIt->second; |
736 if (receiveInfo == NULL) { | 729 if (receiveInfo == NULL) { |
737 return -1; | 730 return -1; |
(...skipping 28 matching lines...) Expand all Loading... |
766 | 759 |
767 void RTCPReceiver::HandleSDESChunk(RTCPUtility::RTCPParserV2& rtcpParser) { | 760 void RTCPReceiver::HandleSDESChunk(RTCPUtility::RTCPParserV2& rtcpParser) { |
768 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 761 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
769 RTCPCnameInformation* cnameInfo = | 762 RTCPCnameInformation* cnameInfo = |
770 CreateCnameInformation(rtcpPacket.CName.SenderSSRC); | 763 CreateCnameInformation(rtcpPacket.CName.SenderSSRC); |
771 assert(cnameInfo); | 764 assert(cnameInfo); |
772 | 765 |
773 cnameInfo->name[RTCP_CNAME_SIZE - 1] = 0; | 766 cnameInfo->name[RTCP_CNAME_SIZE - 1] = 0; |
774 strncpy(cnameInfo->name, rtcpPacket.CName.CName, RTCP_CNAME_SIZE - 1); | 767 strncpy(cnameInfo->name, rtcpPacket.CName.CName, RTCP_CNAME_SIZE - 1); |
775 { | 768 { |
776 CriticalSectionScoped lock(_criticalSectionFeedbacks); | 769 rtc::CritScope lock(&_criticalSectionFeedbacks); |
777 if (stats_callback_ != NULL) { | 770 if (stats_callback_ != NULL) { |
778 stats_callback_->CNameChanged(rtcpPacket.CName.CName, | 771 stats_callback_->CNameChanged(rtcpPacket.CName.CName, |
779 rtcpPacket.CName.SenderSSRC); | 772 rtcpPacket.CName.SenderSSRC); |
780 } | 773 } |
781 } | 774 } |
782 } | 775 } |
783 | 776 |
784 void RTCPReceiver::HandleNACK(RTCPUtility::RTCPParserV2& rtcpParser, | 777 void RTCPReceiver::HandleNACK(RTCPUtility::RTCPParserV2& rtcpParser, |
785 RTCPPacketInformation& rtcpPacketInformation) { | 778 RTCPPacketInformation& rtcpPacketInformation) { |
786 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 779 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1276 // we have a new bandwidth estimate on this channel | 1269 // we have a new bandwidth estimate on this channel |
1277 if (_cbRtcpBandwidthObserver) { | 1270 if (_cbRtcpBandwidthObserver) { |
1278 _cbRtcpBandwidthObserver->OnReceivedEstimatedBitrate(bitrate * 1000); | 1271 _cbRtcpBandwidthObserver->OnReceivedEstimatedBitrate(bitrate * 1000); |
1279 } | 1272 } |
1280 } | 1273 } |
1281 return 0; | 1274 return 0; |
1282 } | 1275 } |
1283 | 1276 |
1284 void RTCPReceiver::RegisterRtcpStatisticsCallback( | 1277 void RTCPReceiver::RegisterRtcpStatisticsCallback( |
1285 RtcpStatisticsCallback* callback) { | 1278 RtcpStatisticsCallback* callback) { |
1286 CriticalSectionScoped cs(_criticalSectionFeedbacks); | 1279 rtc::CritScope cs(&_criticalSectionFeedbacks); |
1287 stats_callback_ = callback; | 1280 stats_callback_ = callback; |
1288 } | 1281 } |
1289 | 1282 |
1290 RtcpStatisticsCallback* RTCPReceiver::GetRtcpStatisticsCallback() { | 1283 RtcpStatisticsCallback* RTCPReceiver::GetRtcpStatisticsCallback() { |
1291 CriticalSectionScoped cs(_criticalSectionFeedbacks); | 1284 rtc::CritScope cs(&_criticalSectionFeedbacks); |
1292 return stats_callback_; | 1285 return stats_callback_; |
1293 } | 1286 } |
1294 | 1287 |
1295 // Holding no Critical section | 1288 // Holding no Critical section |
1296 void RTCPReceiver::TriggerCallbacksFromRTCPPacket( | 1289 void RTCPReceiver::TriggerCallbacksFromRTCPPacket( |
1297 RTCPPacketInformation& rtcpPacketInformation) { | 1290 RTCPPacketInformation& rtcpPacketInformation) { |
1298 // Process TMMBR and REMB first to avoid multiple callbacks | 1291 // Process TMMBR and REMB first to avoid multiple callbacks |
1299 // to OnNetworkChanged. | 1292 // to OnNetworkChanged. |
1300 if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpTmmbr) { | 1293 if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpTmmbr) { |
1301 // Might trigger a OnReceivedBandwidthEstimateUpdate. | 1294 // Might trigger a OnReceivedBandwidthEstimateUpdate. |
1302 UpdateTMMBR(); | 1295 UpdateTMMBR(); |
1303 } | 1296 } |
1304 uint32_t local_ssrc; | 1297 uint32_t local_ssrc; |
1305 std::set<uint32_t> registered_ssrcs; | 1298 std::set<uint32_t> registered_ssrcs; |
1306 { | 1299 { |
1307 // We don't want to hold this critsect when triggering the callbacks below. | 1300 // We don't want to hold this critsect when triggering the callbacks below. |
1308 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 1301 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
1309 local_ssrc = main_ssrc_; | 1302 local_ssrc = main_ssrc_; |
1310 registered_ssrcs = registered_ssrcs_; | 1303 registered_ssrcs = registered_ssrcs_; |
1311 } | 1304 } |
1312 if (!receiver_only_ && | 1305 if (!receiver_only_ && |
1313 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq)) { | 1306 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq)) { |
1314 _rtpRtcp.OnRequestSendReport(); | 1307 _rtpRtcp.OnRequestSendReport(); |
1315 } | 1308 } |
1316 if (!receiver_only_ && | 1309 if (!receiver_only_ && |
1317 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack)) { | 1310 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack)) { |
1318 if (rtcpPacketInformation.nackSequenceNumbers.size() > 0) { | 1311 if (rtcpPacketInformation.nackSequenceNumbers.size() > 0) { |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1371 rtcpPacketInformation.transport_feedback_->GetMediaSourceSsrc(); | 1364 rtcpPacketInformation.transport_feedback_->GetMediaSourceSsrc(); |
1372 if (media_source_ssrc == local_ssrc || | 1365 if (media_source_ssrc == local_ssrc || |
1373 registered_ssrcs.find(media_source_ssrc) != registered_ssrcs.end()) { | 1366 registered_ssrcs.find(media_source_ssrc) != registered_ssrcs.end()) { |
1374 _cbTransportFeedbackObserver->OnTransportFeedback( | 1367 _cbTransportFeedbackObserver->OnTransportFeedback( |
1375 *rtcpPacketInformation.transport_feedback_.get()); | 1368 *rtcpPacketInformation.transport_feedback_.get()); |
1376 } | 1369 } |
1377 } | 1370 } |
1378 } | 1371 } |
1379 | 1372 |
1380 if (!receiver_only_) { | 1373 if (!receiver_only_) { |
1381 CriticalSectionScoped cs(_criticalSectionFeedbacks); | 1374 rtc::CritScope cs(&_criticalSectionFeedbacks); |
1382 if (stats_callback_) { | 1375 if (stats_callback_) { |
1383 for (ReportBlockList::const_iterator it = | 1376 for (ReportBlockList::const_iterator it = |
1384 rtcpPacketInformation.report_blocks.begin(); | 1377 rtcpPacketInformation.report_blocks.begin(); |
1385 it != rtcpPacketInformation.report_blocks.end(); | 1378 it != rtcpPacketInformation.report_blocks.end(); |
1386 ++it) { | 1379 ++it) { |
1387 RtcpStatistics stats; | 1380 RtcpStatistics stats; |
1388 stats.cumulative_lost = it->cumulativeLost; | 1381 stats.cumulative_lost = it->cumulativeLost; |
1389 stats.extended_max_sequence_number = it->extendedHighSeqNum; | 1382 stats.extended_max_sequence_number = it->extendedHighSeqNum; |
1390 stats.fraction_lost = it->fractionLost; | 1383 stats.fraction_lost = it->fractionLost; |
1391 stats.jitter = it->jitter; | 1384 stats.jitter = it->jitter; |
1392 | 1385 |
1393 stats_callback_->StatisticsUpdated(stats, it->sourceSSRC); | 1386 stats_callback_->StatisticsUpdated(stats, it->sourceSSRC); |
1394 } | 1387 } |
1395 } | 1388 } |
1396 } | 1389 } |
1397 } | 1390 } |
1398 | 1391 |
1399 int32_t RTCPReceiver::CNAME(uint32_t remoteSSRC, | 1392 int32_t RTCPReceiver::CNAME(uint32_t remoteSSRC, |
1400 char cName[RTCP_CNAME_SIZE]) const { | 1393 char cName[RTCP_CNAME_SIZE]) const { |
1401 assert(cName); | 1394 assert(cName); |
1402 | 1395 |
1403 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 1396 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
1404 RTCPCnameInformation* cnameInfo = GetCnameInformation(remoteSSRC); | 1397 RTCPCnameInformation* cnameInfo = GetCnameInformation(remoteSSRC); |
1405 if (cnameInfo == NULL) { | 1398 if (cnameInfo == NULL) { |
1406 return -1; | 1399 return -1; |
1407 } | 1400 } |
1408 cName[RTCP_CNAME_SIZE - 1] = 0; | 1401 cName[RTCP_CNAME_SIZE - 1] = 0; |
1409 strncpy(cName, cnameInfo->name, RTCP_CNAME_SIZE - 1); | 1402 strncpy(cName, cnameInfo->name, RTCP_CNAME_SIZE - 1); |
1410 return 0; | 1403 return 0; |
1411 } | 1404 } |
1412 | 1405 |
1413 // no callbacks allowed inside this function | 1406 // no callbacks allowed inside this function |
1414 int32_t RTCPReceiver::TMMBRReceived(uint32_t size, | 1407 int32_t RTCPReceiver::TMMBRReceived(uint32_t size, |
1415 uint32_t accNumCandidates, | 1408 uint32_t accNumCandidates, |
1416 TMMBRSet* candidateSet) const { | 1409 TMMBRSet* candidateSet) const { |
1417 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 1410 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
1418 | 1411 |
1419 std::map<uint32_t, RTCPReceiveInformation*>::const_iterator | 1412 std::map<uint32_t, RTCPReceiveInformation*>::const_iterator |
1420 receiveInfoIt = _receivedInfoMap.begin(); | 1413 receiveInfoIt = _receivedInfoMap.begin(); |
1421 if (receiveInfoIt == _receivedInfoMap.end()) { | 1414 if (receiveInfoIt == _receivedInfoMap.end()) { |
1422 return -1; | 1415 return -1; |
1423 } | 1416 } |
1424 uint32_t num = accNumCandidates; | 1417 uint32_t num = accNumCandidates; |
1425 if (candidateSet) { | 1418 if (candidateSet) { |
1426 while( num < size && receiveInfoIt != _receivedInfoMap.end()) { | 1419 while( num < size && receiveInfoIt != _receivedInfoMap.end()) { |
1427 RTCPReceiveInformation* receiveInfo = receiveInfoIt->second; | 1420 RTCPReceiveInformation* receiveInfo = receiveInfoIt->second; |
(...skipping 16 matching lines...) Expand all Loading... |
1444 return -1; | 1437 return -1; |
1445 } | 1438 } |
1446 num += receiveInfo->TmmbrSet.lengthOfSet(); | 1439 num += receiveInfo->TmmbrSet.lengthOfSet(); |
1447 receiveInfoIt++; | 1440 receiveInfoIt++; |
1448 } | 1441 } |
1449 } | 1442 } |
1450 return num; | 1443 return num; |
1451 } | 1444 } |
1452 | 1445 |
1453 } // namespace webrtc | 1446 } // namespace webrtc |
OLD | NEW |