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 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 *rtt_ms = xr_rr_rtt_ms_; | 188 *rtt_ms = xr_rr_rtt_ms_; |
189 xr_rr_rtt_ms_ = 0; | 189 xr_rr_rtt_ms_ = 0; |
190 return true; | 190 return true; |
191 } | 191 } |
192 | 192 |
193 // TODO(pbos): Make this fail when we haven't received NTP. | 193 // TODO(pbos): Make this fail when we haven't received NTP. |
194 bool RTCPReceiver::NTP(uint32_t* ReceivedNTPsecs, | 194 bool RTCPReceiver::NTP(uint32_t* ReceivedNTPsecs, |
195 uint32_t* ReceivedNTPfrac, | 195 uint32_t* ReceivedNTPfrac, |
196 uint32_t* RTCPArrivalTimeSecs, | 196 uint32_t* RTCPArrivalTimeSecs, |
197 uint32_t* RTCPArrivalTimeFrac, | 197 uint32_t* RTCPArrivalTimeFrac, |
198 uint32_t* rtcp_timestamp) const | 198 uint32_t* rtcp_timestamp) const { |
199 { | 199 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
200 rtc::CritScope lock(&_criticalSectionRTCPReceiver); | 200 if (ReceivedNTPsecs) { |
201 if(ReceivedNTPsecs) | 201 *ReceivedNTPsecs = |
202 { | 202 _remoteSenderInfo.NTPseconds; // NTP from incoming SendReport |
203 *ReceivedNTPsecs = _remoteSenderInfo.NTPseconds; // NTP from incoming Se
ndReport | 203 } |
204 } | 204 if (ReceivedNTPfrac) { |
205 if(ReceivedNTPfrac) | 205 *ReceivedNTPfrac = _remoteSenderInfo.NTPfraction; |
206 { | 206 } |
207 *ReceivedNTPfrac = _remoteSenderInfo.NTPfraction; | 207 if (RTCPArrivalTimeFrac) { |
208 } | 208 *RTCPArrivalTimeFrac = _lastReceivedSRNTPfrac; // local NTP time when we |
209 if(RTCPArrivalTimeFrac) | 209 // received a RTCP packet |
210 { | 210 // with a send block |
211 *RTCPArrivalTimeFrac = _lastReceivedSRNTPfrac; // local NTP time when we
received a RTCP packet with a send block | 211 } |
212 } | 212 if (RTCPArrivalTimeSecs) { |
213 if(RTCPArrivalTimeSecs) | 213 *RTCPArrivalTimeSecs = _lastReceivedSRNTPsecs; |
214 { | 214 } |
215 *RTCPArrivalTimeSecs = _lastReceivedSRNTPsecs; | 215 if (rtcp_timestamp) { |
216 } | 216 *rtcp_timestamp = _remoteSenderInfo.RTPtimeStamp; |
217 if (rtcp_timestamp) { | 217 } |
218 *rtcp_timestamp = _remoteSenderInfo.RTPtimeStamp; | 218 return true; |
219 } | |
220 return true; | |
221 } | 219 } |
222 | 220 |
223 bool RTCPReceiver::LastReceivedXrReferenceTimeInfo( | 221 bool RTCPReceiver::LastReceivedXrReferenceTimeInfo( |
224 RtcpReceiveTimeInfo* info) const { | 222 RtcpReceiveTimeInfo* info) const { |
225 assert(info); | 223 assert(info); |
226 rtc::CritScope lock(&_criticalSectionRTCPReceiver); | 224 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
227 if (_lastReceivedXRNTPsecs == 0 && _lastReceivedXRNTPfrac == 0) { | 225 if (_lastReceivedXRNTPsecs == 0 && _lastReceivedXRNTPfrac == 0) { |
228 return false; | 226 return false; |
229 } | 227 } |
230 | 228 |
231 info->sourceSSRC = _remoteXRReceiveTimeInfo.sourceSSRC; | 229 info->sourceSSRC = _remoteXRReceiveTimeInfo.sourceSSRC; |
232 info->lastRR = _remoteXRReceiveTimeInfo.lastRR; | 230 info->lastRR = _remoteXRReceiveTimeInfo.lastRR; |
233 | 231 |
234 // Get the delay since last received report (RFC 3611). | 232 // Get the delay since last received report (RFC 3611). |
235 uint32_t receive_time = RTCPUtility::MidNtp(_lastReceivedXRNTPsecs, | 233 uint32_t receive_time = |
236 _lastReceivedXRNTPfrac); | 234 RTCPUtility::MidNtp(_lastReceivedXRNTPsecs, _lastReceivedXRNTPfrac); |
237 | 235 |
238 uint32_t ntp_sec = 0; | 236 uint32_t ntp_sec = 0; |
239 uint32_t ntp_frac = 0; | 237 uint32_t ntp_frac = 0; |
240 _clock->CurrentNtp(ntp_sec, ntp_frac); | 238 _clock->CurrentNtp(ntp_sec, ntp_frac); |
241 uint32_t now = RTCPUtility::MidNtp(ntp_sec, ntp_frac); | 239 uint32_t now = RTCPUtility::MidNtp(ntp_sec, ntp_frac); |
242 | 240 |
243 info->delaySinceLastRR = now - receive_time; | 241 info->delaySinceLastRR = now - receive_time; |
244 return true; | 242 return true; |
245 } | 243 } |
246 | 244 |
(...skipping 17 matching lines...) Expand all Loading... |
264 for (; it != _receivedReportBlockMap.end(); ++it) { | 262 for (; it != _receivedReportBlockMap.end(); ++it) { |
265 const ReportBlockInfoMap* info_map = &(it->second); | 263 const ReportBlockInfoMap* info_map = &(it->second); |
266 ReportBlockInfoMap::const_iterator it_info = info_map->begin(); | 264 ReportBlockInfoMap::const_iterator it_info = info_map->begin(); |
267 for (; it_info != info_map->end(); ++it_info) { | 265 for (; it_info != info_map->end(); ++it_info) { |
268 receiveBlocks->push_back(it_info->second->remoteReceiveBlock); | 266 receiveBlocks->push_back(it_info->second->remoteReceiveBlock); |
269 } | 267 } |
270 } | 268 } |
271 return 0; | 269 return 0; |
272 } | 270 } |
273 | 271 |
274 int32_t | 272 int32_t RTCPReceiver::IncomingRTCPPacket( |
275 RTCPReceiver::IncomingRTCPPacket(RTCPPacketInformation& rtcpPacketInformation, | 273 RTCPPacketInformation& rtcpPacketInformation, |
276 RTCPUtility::RTCPParserV2* rtcpParser) | 274 RTCPUtility::RTCPParserV2* rtcpParser) { |
277 { | 275 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
278 rtc::CritScope lock(&_criticalSectionRTCPReceiver); | |
279 | 276 |
280 _lastReceived = _clock->TimeInMilliseconds(); | 277 _lastReceived = _clock->TimeInMilliseconds(); |
281 | 278 |
282 if (packet_type_counter_.first_packet_time_ms == -1) { | 279 if (packet_type_counter_.first_packet_time_ms == -1) { |
283 packet_type_counter_.first_packet_time_ms = _lastReceived; | 280 packet_type_counter_.first_packet_time_ms = _lastReceived; |
| 281 } |
| 282 |
| 283 RTCPUtility::RTCPPacketTypes pktType = rtcpParser->Begin(); |
| 284 while (pktType != RTCPPacketTypes::kInvalid) { |
| 285 // Each "case" is responsible for iterate the parser to the |
| 286 // next top level packet. |
| 287 switch (pktType) { |
| 288 case RTCPPacketTypes::kSr: |
| 289 case RTCPPacketTypes::kRr: |
| 290 HandleSenderReceiverReport(*rtcpParser, rtcpPacketInformation); |
| 291 break; |
| 292 case RTCPPacketTypes::kSdes: |
| 293 HandleSDES(*rtcpParser, rtcpPacketInformation); |
| 294 break; |
| 295 case RTCPPacketTypes::kXrHeader: |
| 296 HandleXrHeader(*rtcpParser, rtcpPacketInformation); |
| 297 break; |
| 298 case RTCPPacketTypes::kXrReceiverReferenceTime: |
| 299 HandleXrReceiveReferenceTime(*rtcpParser, rtcpPacketInformation); |
| 300 break; |
| 301 case RTCPPacketTypes::kXrDlrrReportBlock: |
| 302 HandleXrDlrrReportBlock(*rtcpParser, rtcpPacketInformation); |
| 303 break; |
| 304 case RTCPPacketTypes::kXrVoipMetric: |
| 305 HandleXRVOIPMetric(*rtcpParser, rtcpPacketInformation); |
| 306 break; |
| 307 case RTCPPacketTypes::kBye: |
| 308 HandleBYE(*rtcpParser); |
| 309 break; |
| 310 case RTCPPacketTypes::kRtpfbNack: |
| 311 HandleNACK(*rtcpParser, rtcpPacketInformation); |
| 312 break; |
| 313 case RTCPPacketTypes::kRtpfbTmmbr: |
| 314 HandleTMMBR(*rtcpParser, rtcpPacketInformation); |
| 315 break; |
| 316 case RTCPPacketTypes::kRtpfbTmmbn: |
| 317 HandleTMMBN(*rtcpParser, rtcpPacketInformation); |
| 318 break; |
| 319 case RTCPPacketTypes::kRtpfbSrReq: |
| 320 HandleSR_REQ(*rtcpParser, rtcpPacketInformation); |
| 321 break; |
| 322 case RTCPPacketTypes::kPsfbPli: |
| 323 HandlePLI(*rtcpParser, rtcpPacketInformation); |
| 324 break; |
| 325 case RTCPPacketTypes::kPsfbSli: |
| 326 HandleSLI(*rtcpParser, rtcpPacketInformation); |
| 327 break; |
| 328 case RTCPPacketTypes::kPsfbRpsi: |
| 329 HandleRPSI(*rtcpParser, rtcpPacketInformation); |
| 330 break; |
| 331 case RTCPPacketTypes::kExtendedIj: |
| 332 HandleIJ(*rtcpParser, rtcpPacketInformation); |
| 333 break; |
| 334 case RTCPPacketTypes::kPsfbFir: |
| 335 HandleFIR(*rtcpParser, rtcpPacketInformation); |
| 336 break; |
| 337 case RTCPPacketTypes::kPsfbApp: |
| 338 HandlePsfbApp(*rtcpParser, rtcpPacketInformation); |
| 339 break; |
| 340 case RTCPPacketTypes::kApp: |
| 341 // generic application messages |
| 342 HandleAPP(*rtcpParser, rtcpPacketInformation); |
| 343 break; |
| 344 case RTCPPacketTypes::kAppItem: |
| 345 // generic application messages |
| 346 HandleAPPItem(*rtcpParser, rtcpPacketInformation); |
| 347 break; |
| 348 case RTCPPacketTypes::kTransportFeedback: |
| 349 HandleTransportFeedback(rtcpParser, &rtcpPacketInformation); |
| 350 break; |
| 351 default: |
| 352 rtcpParser->Iterate(); |
| 353 break; |
284 } | 354 } |
| 355 pktType = rtcpParser->PacketType(); |
| 356 } |
285 | 357 |
286 RTCPUtility::RTCPPacketTypes pktType = rtcpParser->Begin(); | 358 if (packet_type_counter_observer_ != NULL) { |
287 while (pktType != RTCPPacketTypes::kInvalid) { | 359 packet_type_counter_observer_->RtcpPacketTypesCounterUpdated( |
288 // Each "case" is responsible for iterate the parser to the | 360 main_ssrc_, packet_type_counter_); |
289 // next top level packet. | 361 } |
290 switch (pktType) | |
291 { | |
292 case RTCPPacketTypes::kSr: | |
293 case RTCPPacketTypes::kRr: | |
294 HandleSenderReceiverReport(*rtcpParser, rtcpPacketInformation); | |
295 break; | |
296 case RTCPPacketTypes::kSdes: | |
297 HandleSDES(*rtcpParser, rtcpPacketInformation); | |
298 break; | |
299 case RTCPPacketTypes::kXrHeader: | |
300 HandleXrHeader(*rtcpParser, rtcpPacketInformation); | |
301 break; | |
302 case RTCPPacketTypes::kXrReceiverReferenceTime: | |
303 HandleXrReceiveReferenceTime(*rtcpParser, rtcpPacketInformation); | |
304 break; | |
305 case RTCPPacketTypes::kXrDlrrReportBlock: | |
306 HandleXrDlrrReportBlock(*rtcpParser, rtcpPacketInformation); | |
307 break; | |
308 case RTCPPacketTypes::kXrVoipMetric: | |
309 HandleXRVOIPMetric(*rtcpParser, rtcpPacketInformation); | |
310 break; | |
311 case RTCPPacketTypes::kBye: | |
312 HandleBYE(*rtcpParser); | |
313 break; | |
314 case RTCPPacketTypes::kRtpfbNack: | |
315 HandleNACK(*rtcpParser, rtcpPacketInformation); | |
316 break; | |
317 case RTCPPacketTypes::kRtpfbTmmbr: | |
318 HandleTMMBR(*rtcpParser, rtcpPacketInformation); | |
319 break; | |
320 case RTCPPacketTypes::kRtpfbTmmbn: | |
321 HandleTMMBN(*rtcpParser, rtcpPacketInformation); | |
322 break; | |
323 case RTCPPacketTypes::kRtpfbSrReq: | |
324 HandleSR_REQ(*rtcpParser, rtcpPacketInformation); | |
325 break; | |
326 case RTCPPacketTypes::kPsfbPli: | |
327 HandlePLI(*rtcpParser, rtcpPacketInformation); | |
328 break; | |
329 case RTCPPacketTypes::kPsfbSli: | |
330 HandleSLI(*rtcpParser, rtcpPacketInformation); | |
331 break; | |
332 case RTCPPacketTypes::kPsfbRpsi: | |
333 HandleRPSI(*rtcpParser, rtcpPacketInformation); | |
334 break; | |
335 case RTCPPacketTypes::kExtendedIj: | |
336 HandleIJ(*rtcpParser, rtcpPacketInformation); | |
337 break; | |
338 case RTCPPacketTypes::kPsfbFir: | |
339 HandleFIR(*rtcpParser, rtcpPacketInformation); | |
340 break; | |
341 case RTCPPacketTypes::kPsfbApp: | |
342 HandlePsfbApp(*rtcpParser, rtcpPacketInformation); | |
343 break; | |
344 case RTCPPacketTypes::kApp: | |
345 // generic application messages | |
346 HandleAPP(*rtcpParser, rtcpPacketInformation); | |
347 break; | |
348 case RTCPPacketTypes::kAppItem: | |
349 // generic application messages | |
350 HandleAPPItem(*rtcpParser, rtcpPacketInformation); | |
351 break; | |
352 case RTCPPacketTypes::kTransportFeedback: | |
353 HandleTransportFeedback(rtcpParser, &rtcpPacketInformation); | |
354 break; | |
355 default: | |
356 rtcpParser->Iterate(); | |
357 break; | |
358 } | |
359 pktType = rtcpParser->PacketType(); | |
360 } | |
361 | 362 |
362 if (packet_type_counter_observer_ != NULL) { | 363 num_skipped_packets_ += rtcpParser->NumSkippedBlocks(); |
363 packet_type_counter_observer_->RtcpPacketTypesCounterUpdated( | |
364 main_ssrc_, packet_type_counter_); | |
365 } | |
366 | 364 |
367 num_skipped_packets_ += rtcpParser->NumSkippedBlocks(); | 365 int64_t now = _clock->TimeInMilliseconds(); |
| 366 if (now - last_skipped_packets_warning_ >= kMaxWarningLogIntervalMs && |
| 367 num_skipped_packets_ > 0) { |
| 368 last_skipped_packets_warning_ = now; |
| 369 LOG(LS_WARNING) << num_skipped_packets_ |
| 370 << " RTCP blocks were skipped due to being malformed or of " |
| 371 "unrecognized/unsupported type, during the past " |
| 372 << (kMaxWarningLogIntervalMs / 1000) << " second period."; |
| 373 } |
368 | 374 |
369 int64_t now = _clock->TimeInMilliseconds(); | 375 return 0; |
370 if (now - last_skipped_packets_warning_ >= kMaxWarningLogIntervalMs && | |
371 num_skipped_packets_ > 0) { | |
372 last_skipped_packets_warning_ = now; | |
373 LOG(LS_WARNING) | |
374 << num_skipped_packets_ | |
375 << " RTCP blocks were skipped due to being malformed or of " | |
376 "unrecognized/unsupported type, during the past " | |
377 << (kMaxWarningLogIntervalMs / 1000) << " second period."; | |
378 } | |
379 | |
380 return 0; | |
381 } | 376 } |
382 | 377 |
383 void | 378 void RTCPReceiver::HandleSenderReceiverReport( |
384 RTCPReceiver::HandleSenderReceiverReport(RTCPUtility::RTCPParserV2& rtcpParser, | 379 RTCPUtility::RTCPParserV2& rtcpParser, |
385 RTCPPacketInformation& rtcpPacketInform
ation) | 380 RTCPPacketInformation& rtcpPacketInformation) { |
386 { | 381 RTCPUtility::RTCPPacketTypes rtcpPacketType = rtcpParser.PacketType(); |
387 RTCPUtility::RTCPPacketTypes rtcpPacketType = rtcpParser.PacketType(); | 382 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
388 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | |
389 | 383 |
390 assert((rtcpPacketType == RTCPPacketTypes::kRr) || | 384 assert((rtcpPacketType == RTCPPacketTypes::kRr) || |
391 (rtcpPacketType == RTCPPacketTypes::kSr)); | 385 (rtcpPacketType == RTCPPacketTypes::kSr)); |
392 | 386 |
393 // SR.SenderSSRC | 387 // SR.SenderSSRC |
394 // The synchronization source identifier for the originator of this SR packe
t | 388 // The synchronization source identifier for the originator of this SR packet |
395 | 389 |
396 // rtcpPacket.RR.SenderSSRC | 390 // rtcpPacket.RR.SenderSSRC |
397 // The source of the packet sender, same as of SR? or is this a CE? | 391 // The source of the packet sender, same as of SR? or is this a CE? |
398 | 392 |
399 const uint32_t remoteSSRC = (rtcpPacketType == RTCPPacketTypes::kRr) | 393 const uint32_t remoteSSRC = (rtcpPacketType == RTCPPacketTypes::kRr) |
400 ? rtcpPacket.RR.SenderSSRC | 394 ? rtcpPacket.RR.SenderSSRC |
401 : rtcpPacket.SR.SenderSSRC; | 395 : rtcpPacket.SR.SenderSSRC; |
402 | 396 |
403 rtcpPacketInformation.remoteSSRC = remoteSSRC; | 397 rtcpPacketInformation.remoteSSRC = remoteSSRC; |
404 | 398 |
405 RTCPReceiveInformation* ptrReceiveInfo = CreateReceiveInformation(remoteSSRC
); | 399 RTCPReceiveInformation* ptrReceiveInfo = CreateReceiveInformation(remoteSSRC); |
406 if (!ptrReceiveInfo) | 400 if (!ptrReceiveInfo) { |
| 401 rtcpParser.Iterate(); |
| 402 return; |
| 403 } |
| 404 |
| 405 if (rtcpPacketType == RTCPPacketTypes::kSr) { |
| 406 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "SR", |
| 407 "remote_ssrc", remoteSSRC, "ssrc", main_ssrc_); |
| 408 |
| 409 if (_remoteSSRC == |
| 410 remoteSSRC) // have I received RTP packets from this party |
407 { | 411 { |
408 rtcpParser.Iterate(); | 412 // only signal that we have received a SR when we accept one |
409 return; | 413 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSr; |
| 414 |
| 415 rtcpPacketInformation.ntp_secs = rtcpPacket.SR.NTPMostSignificant; |
| 416 rtcpPacketInformation.ntp_frac = rtcpPacket.SR.NTPLeastSignificant; |
| 417 rtcpPacketInformation.rtp_timestamp = rtcpPacket.SR.RTPTimestamp; |
| 418 |
| 419 // We will only store the send report from one source, but |
| 420 // we will store all the receive block |
| 421 |
| 422 // Save the NTP time of this report |
| 423 _remoteSenderInfo.NTPseconds = rtcpPacket.SR.NTPMostSignificant; |
| 424 _remoteSenderInfo.NTPfraction = rtcpPacket.SR.NTPLeastSignificant; |
| 425 _remoteSenderInfo.RTPtimeStamp = rtcpPacket.SR.RTPTimestamp; |
| 426 _remoteSenderInfo.sendPacketCount = rtcpPacket.SR.SenderPacketCount; |
| 427 _remoteSenderInfo.sendOctetCount = rtcpPacket.SR.SenderOctetCount; |
| 428 |
| 429 _clock->CurrentNtp(_lastReceivedSRNTPsecs, _lastReceivedSRNTPfrac); |
| 430 } else { |
| 431 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRr; |
410 } | 432 } |
| 433 } else { |
| 434 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR", |
| 435 "remote_ssrc", remoteSSRC, "ssrc", main_ssrc_); |
411 | 436 |
412 if (rtcpPacketType == RTCPPacketTypes::kSr) { | 437 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRr; |
413 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "SR", | 438 } |
414 "remote_ssrc", remoteSSRC, "ssrc", main_ssrc_); | 439 // Update that this remote is alive. |
| 440 ptrReceiveInfo->last_time_received_ms = _clock->TimeInMilliseconds(); |
415 | 441 |
416 if (_remoteSSRC == remoteSSRC) // have I received RTP packets from this
party | 442 rtcpPacketType = rtcpParser.Iterate(); |
417 { | |
418 // only signal that we have received a SR when we accept one | |
419 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSr; | |
420 | 443 |
421 rtcpPacketInformation.ntp_secs = rtcpPacket.SR.NTPMostSignificant; | 444 while (rtcpPacketType == RTCPPacketTypes::kReportBlockItem) { |
422 rtcpPacketInformation.ntp_frac = rtcpPacket.SR.NTPLeastSignificant; | 445 HandleReportBlock(rtcpPacket, rtcpPacketInformation, remoteSSRC); |
423 rtcpPacketInformation.rtp_timestamp = rtcpPacket.SR.RTPTimestamp; | |
424 | |
425 // We will only store the send report from one source, but | |
426 // we will store all the receive block | |
427 | |
428 // Save the NTP time of this report | |
429 _remoteSenderInfo.NTPseconds = rtcpPacket.SR.NTPMostSignificant; | |
430 _remoteSenderInfo.NTPfraction = rtcpPacket.SR.NTPLeastSignificant; | |
431 _remoteSenderInfo.RTPtimeStamp = rtcpPacket.SR.RTPTimestamp; | |
432 _remoteSenderInfo.sendPacketCount = rtcpPacket.SR.SenderPacketCount; | |
433 _remoteSenderInfo.sendOctetCount = rtcpPacket.SR.SenderOctetCount; | |
434 | |
435 _clock->CurrentNtp(_lastReceivedSRNTPsecs, _lastReceivedSRNTPfrac); | |
436 } | |
437 else | |
438 { | |
439 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRr; | |
440 } | |
441 } else | |
442 { | |
443 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR", | |
444 "remote_ssrc", remoteSSRC, "ssrc", main_ssrc_); | |
445 | |
446 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRr; | |
447 } | |
448 // Update that this remote is alive. | |
449 ptrReceiveInfo->last_time_received_ms = _clock->TimeInMilliseconds(); | |
450 | |
451 rtcpPacketType = rtcpParser.Iterate(); | 446 rtcpPacketType = rtcpParser.Iterate(); |
452 | 447 } |
453 while (rtcpPacketType == RTCPPacketTypes::kReportBlockItem) { | |
454 HandleReportBlock(rtcpPacket, rtcpPacketInformation, remoteSSRC); | |
455 rtcpPacketType = rtcpParser.Iterate(); | |
456 } | |
457 } | 448 } |
458 | 449 |
459 void RTCPReceiver::HandleReportBlock( | 450 void RTCPReceiver::HandleReportBlock( |
460 const RTCPUtility::RTCPPacket& rtcpPacket, | 451 const RTCPUtility::RTCPPacket& rtcpPacket, |
461 RTCPPacketInformation& rtcpPacketInformation, | 452 RTCPPacketInformation& rtcpPacketInformation, |
462 uint32_t remoteSSRC) | 453 uint32_t remoteSSRC) |
463 EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver) { | 454 EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver) { |
464 // This will be called once per report block in the RTCP packet. | 455 // This will be called once per report block in the RTCP packet. |
465 // We filter out all report blocks that are not for us. | 456 // We filter out all report blocks that are not for us. |
466 // Each packet has max 31 RR blocks. | 457 // Each packet has max 31 RR blocks. |
467 // | 458 // |
468 // We can calc RTT if we send a send report and get a report block back. | 459 // We can calc RTT if we send a send report and get a report block back. |
469 | 460 |
470 // |rtcpPacket.ReportBlockItem.SSRC| is the SSRC identifier of the source to | 461 // |rtcpPacket.ReportBlockItem.SSRC| is the SSRC identifier of the source to |
471 // which the information in this reception report block pertains. | 462 // which the information in this reception report block pertains. |
472 | 463 |
473 // Filter out all report blocks that are not for us. | 464 // Filter out all report blocks that are not for us. |
474 if (registered_ssrcs_.find(rtcpPacket.ReportBlockItem.SSRC) == | 465 if (registered_ssrcs_.find(rtcpPacket.ReportBlockItem.SSRC) == |
475 registered_ssrcs_.end()) { | 466 registered_ssrcs_.end()) { |
476 // This block is not for us ignore it. | 467 // This block is not for us ignore it. |
477 return; | 468 return; |
478 } | 469 } |
479 | 470 |
480 RTCPReportBlockInformation* reportBlock = | 471 RTCPReportBlockInformation* reportBlock = CreateOrGetReportBlockInformation( |
481 CreateOrGetReportBlockInformation(remoteSSRC, | 472 remoteSSRC, rtcpPacket.ReportBlockItem.SSRC); |
482 rtcpPacket.ReportBlockItem.SSRC); | |
483 if (reportBlock == NULL) { | 473 if (reportBlock == NULL) { |
484 LOG(LS_WARNING) << "Failed to CreateReportBlockInformation(" | 474 LOG(LS_WARNING) << "Failed to CreateReportBlockInformation(" << remoteSSRC |
485 << remoteSSRC << ")"; | 475 << ")"; |
486 return; | 476 return; |
487 } | 477 } |
488 | 478 |
489 _lastReceivedRrMs = _clock->TimeInMilliseconds(); | 479 _lastReceivedRrMs = _clock->TimeInMilliseconds(); |
490 const RTCPPacketReportBlockItem& rb = rtcpPacket.ReportBlockItem; | 480 const RTCPPacketReportBlockItem& rb = rtcpPacket.ReportBlockItem; |
491 reportBlock->remoteReceiveBlock.remoteSSRC = remoteSSRC; | 481 reportBlock->remoteReceiveBlock.remoteSSRC = remoteSSRC; |
492 reportBlock->remoteReceiveBlock.sourceSSRC = rb.SSRC; | 482 reportBlock->remoteReceiveBlock.sourceSSRC = rb.SSRC; |
493 reportBlock->remoteReceiveBlock.fractionLost = rb.FractionLost; | 483 reportBlock->remoteReceiveBlock.fractionLost = rb.FractionLost; |
494 reportBlock->remoteReceiveBlock.cumulativeLost = | 484 reportBlock->remoteReceiveBlock.cumulativeLost = |
495 rb.CumulativeNumOfPacketsLost; | 485 rb.CumulativeNumOfPacketsLost; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
577 return NULL; | 567 return NULL; |
578 } | 568 } |
579 const ReportBlockInfoMap* info_map = &(it->second); | 569 const ReportBlockInfoMap* info_map = &(it->second); |
580 ReportBlockInfoMap::const_iterator it_info = info_map->find(remote_ssrc); | 570 ReportBlockInfoMap::const_iterator it_info = info_map->find(remote_ssrc); |
581 if (it_info == info_map->end()) { | 571 if (it_info == info_map->end()) { |
582 return NULL; | 572 return NULL; |
583 } | 573 } |
584 return it_info->second; | 574 return it_info->second; |
585 } | 575 } |
586 | 576 |
587 RTCPCnameInformation* | 577 RTCPCnameInformation* RTCPReceiver::CreateCnameInformation( |
588 RTCPReceiver::CreateCnameInformation(uint32_t remoteSSRC) { | 578 uint32_t remoteSSRC) { |
589 rtc::CritScope lock(&_criticalSectionRTCPReceiver); | 579 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
590 | 580 |
591 std::map<uint32_t, RTCPCnameInformation*>::iterator it = | 581 std::map<uint32_t, RTCPCnameInformation*>::iterator it = |
592 _receivedCnameMap.find(remoteSSRC); | 582 _receivedCnameMap.find(remoteSSRC); |
593 | 583 |
594 if (it != _receivedCnameMap.end()) { | 584 if (it != _receivedCnameMap.end()) { |
595 return it->second; | 585 return it->second; |
596 } | 586 } |
597 RTCPCnameInformation* cnameInfo = new RTCPCnameInformation; | 587 RTCPCnameInformation* cnameInfo = new RTCPCnameInformation; |
598 memset(cnameInfo->name, 0, RTCP_CNAME_SIZE); | 588 memset(cnameInfo->name, 0, RTCP_CNAME_SIZE); |
599 _receivedCnameMap[remoteSSRC] = cnameInfo; | 589 _receivedCnameMap[remoteSSRC] = cnameInfo; |
600 return cnameInfo; | 590 return cnameInfo; |
601 } | 591 } |
602 | 592 |
603 RTCPCnameInformation* | 593 RTCPCnameInformation* RTCPReceiver::GetCnameInformation( |
604 RTCPReceiver::GetCnameInformation(uint32_t remoteSSRC) const { | 594 uint32_t remoteSSRC) const { |
605 rtc::CritScope lock(&_criticalSectionRTCPReceiver); | 595 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
606 | 596 |
607 std::map<uint32_t, RTCPCnameInformation*>::const_iterator it = | 597 std::map<uint32_t, RTCPCnameInformation*>::const_iterator it = |
608 _receivedCnameMap.find(remoteSSRC); | 598 _receivedCnameMap.find(remoteSSRC); |
609 | 599 |
610 if (it == _receivedCnameMap.end()) { | 600 if (it == _receivedCnameMap.end()) { |
611 return NULL; | 601 return NULL; |
612 } | 602 } |
613 return it->second; | 603 return it->second; |
614 } | 604 } |
615 | 605 |
616 RTCPReceiveInformation* | 606 RTCPReceiveInformation* RTCPReceiver::CreateReceiveInformation( |
617 RTCPReceiver::CreateReceiveInformation(uint32_t remoteSSRC) { | 607 uint32_t remoteSSRC) { |
618 rtc::CritScope lock(&_criticalSectionRTCPReceiver); | 608 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
619 | 609 |
620 std::map<uint32_t, RTCPReceiveInformation*>::iterator it = | 610 std::map<uint32_t, RTCPReceiveInformation*>::iterator it = |
621 _receivedInfoMap.find(remoteSSRC); | 611 _receivedInfoMap.find(remoteSSRC); |
622 | 612 |
623 if (it != _receivedInfoMap.end()) { | 613 if (it != _receivedInfoMap.end()) { |
624 return it->second; | 614 return it->second; |
625 } | 615 } |
626 RTCPReceiveInformation* receiveInfo = new RTCPReceiveInformation; | 616 RTCPReceiveInformation* receiveInfo = new RTCPReceiveInformation; |
627 _receivedInfoMap[remoteSSRC] = receiveInfo; | 617 _receivedInfoMap[remoteSSRC] = receiveInfo; |
628 return receiveInfo; | 618 return receiveInfo; |
629 } | 619 } |
630 | 620 |
631 RTCPReceiveInformation* | 621 RTCPReceiveInformation* RTCPReceiver::GetReceiveInformation( |
632 RTCPReceiver::GetReceiveInformation(uint32_t remoteSSRC) { | 622 uint32_t remoteSSRC) { |
633 rtc::CritScope lock(&_criticalSectionRTCPReceiver); | 623 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
634 | 624 |
635 std::map<uint32_t, RTCPReceiveInformation*>::iterator it = | 625 std::map<uint32_t, RTCPReceiveInformation*>::iterator it = |
636 _receivedInfoMap.find(remoteSSRC); | 626 _receivedInfoMap.find(remoteSSRC); |
637 if (it == _receivedInfoMap.end()) { | 627 if (it == _receivedInfoMap.end()) { |
638 return NULL; | 628 return NULL; |
639 } | 629 } |
640 return it->second; | 630 return it->second; |
641 } | 631 } |
642 | 632 |
(...skipping 10 matching lines...) Expand all Loading... |
653 } | 643 } |
654 return false; | 644 return false; |
655 } | 645 } |
656 | 646 |
657 bool RTCPReceiver::RtcpRrSequenceNumberTimeout(int64_t rtcp_interval_ms) { | 647 bool RTCPReceiver::RtcpRrSequenceNumberTimeout(int64_t rtcp_interval_ms) { |
658 rtc::CritScope lock(&_criticalSectionRTCPReceiver); | 648 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
659 if (_lastIncreasedSequenceNumberMs == 0) | 649 if (_lastIncreasedSequenceNumberMs == 0) |
660 return false; | 650 return false; |
661 | 651 |
662 int64_t time_out_ms = kRrTimeoutIntervals * rtcp_interval_ms; | 652 int64_t time_out_ms = kRrTimeoutIntervals * rtcp_interval_ms; |
663 if (_clock->TimeInMilliseconds() > _lastIncreasedSequenceNumberMs + | 653 if (_clock->TimeInMilliseconds() > |
664 time_out_ms) { | 654 _lastIncreasedSequenceNumberMs + time_out_ms) { |
665 // Reset the timer to only trigger one log. | 655 // Reset the timer to only trigger one log. |
666 _lastIncreasedSequenceNumberMs = 0; | 656 _lastIncreasedSequenceNumberMs = 0; |
667 return true; | 657 return true; |
668 } | 658 } |
669 return false; | 659 return false; |
670 } | 660 } |
671 | 661 |
672 bool RTCPReceiver::UpdateRTCPReceiveInformationTimers() { | 662 bool RTCPReceiver::UpdateRTCPReceiveInformationTimers() { |
673 rtc::CritScope lock(&_criticalSectionRTCPReceiver); | 663 rtc::CritScope lock(&_criticalSectionRTCPReceiver); |
674 | 664 |
(...skipping 20 matching lines...) Expand all Loading... |
695 receiveInfo->ClearTmmbr(); | 685 receiveInfo->ClearTmmbr(); |
696 // prevent that we call this over and over again | 686 // prevent that we call this over and over again |
697 receiveInfo->last_time_received_ms = 0; | 687 receiveInfo->last_time_received_ms = 0; |
698 // send new TMMBN to all channels using the default codec | 688 // send new TMMBN to all channels using the default codec |
699 updateBoundingSet = true; | 689 updateBoundingSet = true; |
700 } | 690 } |
701 receiveInfoIt++; | 691 receiveInfoIt++; |
702 } else if (receiveInfo->ready_for_delete) { | 692 } else if (receiveInfo->ready_for_delete) { |
703 // store our current receiveInfoItem | 693 // store our current receiveInfoItem |
704 std::map<uint32_t, RTCPReceiveInformation*>::iterator | 694 std::map<uint32_t, RTCPReceiveInformation*>::iterator |
705 receiveInfoItemToBeErased = receiveInfoIt; | 695 receiveInfoItemToBeErased = receiveInfoIt; |
706 receiveInfoIt++; | 696 receiveInfoIt++; |
707 delete receiveInfoItemToBeErased->second; | 697 delete receiveInfoItemToBeErased->second; |
708 _receivedInfoMap.erase(receiveInfoItemToBeErased); | 698 _receivedInfoMap.erase(receiveInfoItemToBeErased); |
709 } else { | 699 } else { |
710 receiveInfoIt++; | 700 receiveInfoIt++; |
711 } | 701 } |
712 } | 702 } |
713 return updateBoundingSet; | 703 return updateBoundingSet; |
714 } | 704 } |
715 | 705 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
772 pktType = rtcpParser.Iterate(); | 762 pktType = rtcpParser.Iterate(); |
773 } | 763 } |
774 | 764 |
775 if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack) { | 765 if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack) { |
776 ++packet_type_counter_.nack_packets; | 766 ++packet_type_counter_.nack_packets; |
777 packet_type_counter_.nack_requests = nack_stats_.requests(); | 767 packet_type_counter_.nack_requests = nack_stats_.requests(); |
778 packet_type_counter_.unique_nack_requests = nack_stats_.unique_requests(); | 768 packet_type_counter_.unique_nack_requests = nack_stats_.unique_requests(); |
779 } | 769 } |
780 } | 770 } |
781 | 771 |
782 void | 772 void RTCPReceiver::HandleNACKItem( |
783 RTCPReceiver::HandleNACKItem(const RTCPUtility::RTCPPacket& rtcpPacket, | 773 const RTCPUtility::RTCPPacket& rtcpPacket, |
784 RTCPPacketInformation& rtcpPacketInformation) { | 774 RTCPPacketInformation& rtcpPacketInformation) { |
785 rtcpPacketInformation.AddNACKPacket(rtcpPacket.NACKItem.PacketID); | 775 rtcpPacketInformation.AddNACKPacket(rtcpPacket.NACKItem.PacketID); |
786 nack_stats_.ReportRequest(rtcpPacket.NACKItem.PacketID); | 776 nack_stats_.ReportRequest(rtcpPacket.NACKItem.PacketID); |
787 | 777 |
788 uint16_t bitMask = rtcpPacket.NACKItem.BitMask; | 778 uint16_t bitMask = rtcpPacket.NACKItem.BitMask; |
789 if (bitMask) { | 779 if (bitMask) { |
790 for (int i=1; i <= 16; ++i) { | 780 for (int i = 1; i <= 16; ++i) { |
791 if (bitMask & 0x01) { | 781 if (bitMask & 0x01) { |
792 rtcpPacketInformation.AddNACKPacket(rtcpPacket.NACKItem.PacketID + i); | 782 rtcpPacketInformation.AddNACKPacket(rtcpPacket.NACKItem.PacketID + i); |
793 nack_stats_.ReportRequest(rtcpPacket.NACKItem.PacketID + i); | 783 nack_stats_.ReportRequest(rtcpPacket.NACKItem.PacketID + i); |
794 } | 784 } |
795 bitMask = bitMask >>1; | 785 bitMask = bitMask >> 1; |
796 } | 786 } |
797 } | 787 } |
798 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpNack; | 788 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpNack; |
799 } | 789 } |
800 | 790 |
801 void RTCPReceiver::HandleBYE(RTCPUtility::RTCPParserV2& rtcpParser) { | 791 void RTCPReceiver::HandleBYE(RTCPUtility::RTCPParserV2& rtcpParser) { |
802 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 792 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
803 | 793 |
804 // clear our lists | 794 // clear our lists |
805 ReportBlockMap::iterator it = _receivedReportBlockMap.begin(); | 795 ReportBlockMap::iterator it = _receivedReportBlockMap.begin(); |
806 for (; it != _receivedReportBlockMap.end(); ++it) { | 796 for (; it != _receivedReportBlockMap.end(); ++it) { |
807 ReportBlockInfoMap* info_map = &(it->second); | 797 ReportBlockInfoMap* info_map = &(it->second); |
808 ReportBlockInfoMap::iterator it_info = info_map->find( | 798 ReportBlockInfoMap::iterator it_info = |
809 rtcpPacket.BYE.SenderSSRC); | 799 info_map->find(rtcpPacket.BYE.SenderSSRC); |
810 if (it_info != info_map->end()) { | 800 if (it_info != info_map->end()) { |
811 delete it_info->second; | 801 delete it_info->second; |
812 info_map->erase(it_info); | 802 info_map->erase(it_info); |
813 } | 803 } |
814 } | 804 } |
815 | 805 |
816 // we can't delete it due to TMMBR | 806 // we can't delete it due to TMMBR |
817 std::map<uint32_t, RTCPReceiveInformation*>::iterator receiveInfoIt = | 807 std::map<uint32_t, RTCPReceiveInformation*>::iterator receiveInfoIt = |
818 _receivedInfoMap.find(rtcpPacket.BYE.SenderSSRC); | 808 _receivedInfoMap.find(rtcpPacket.BYE.SenderSSRC); |
819 | 809 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
899 | 889 |
900 uint32_t delay_rr = packet.XRDLRRReportBlockItem.DelayLastRR; | 890 uint32_t delay_rr = packet.XRDLRRReportBlockItem.DelayLastRR; |
901 uint32_t now = CompactNtp(NtpTime(*_clock)); | 891 uint32_t now = CompactNtp(NtpTime(*_clock)); |
902 | 892 |
903 uint32_t rtt_ntp = now - delay_rr - send_time; | 893 uint32_t rtt_ntp = now - delay_rr - send_time; |
904 xr_rr_rtt_ms_ = CompactNtpRttToMs(rtt_ntp); | 894 xr_rr_rtt_ms_ = CompactNtpRttToMs(rtt_ntp); |
905 | 895 |
906 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrDlrrReportBlock; | 896 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrDlrrReportBlock; |
907 } | 897 } |
908 | 898 |
909 void | 899 void RTCPReceiver::HandleXRVOIPMetric( |
910 RTCPReceiver::HandleXRVOIPMetric(RTCPUtility::RTCPParserV2& rtcpParser, | 900 RTCPUtility::RTCPParserV2& rtcpParser, |
911 RTCPPacketInformation& rtcpPacketInformation) | 901 RTCPPacketInformation& rtcpPacketInformation) { |
912 { | 902 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
913 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | |
914 | 903 |
915 if(rtcpPacket.XRVOIPMetricItem.SSRC == main_ssrc_) | 904 if (rtcpPacket.XRVOIPMetricItem.SSRC == main_ssrc_) { |
916 { | 905 // Store VoIP metrics block if it's about me |
917 // Store VoIP metrics block if it's about me | 906 // from OriginatorSSRC do we filter it? |
918 // from OriginatorSSRC do we filter it? | 907 // rtcpPacket.XR.OriginatorSSRC; |
919 // rtcpPacket.XR.OriginatorSSRC; | |
920 | 908 |
921 RTCPVoIPMetric receivedVoIPMetrics; | 909 RTCPVoIPMetric receivedVoIPMetrics; |
922 receivedVoIPMetrics.burstDensity = rtcpPacket.XRVOIPMetricItem.burstDens
ity; | 910 receivedVoIPMetrics.burstDensity = rtcpPacket.XRVOIPMetricItem.burstDensity; |
923 receivedVoIPMetrics.burstDuration = rtcpPacket.XRVOIPMetricItem.burstDur
ation; | 911 receivedVoIPMetrics.burstDuration = |
924 receivedVoIPMetrics.discardRate = rtcpPacket.XRVOIPMetricItem.discardRat
e; | 912 rtcpPacket.XRVOIPMetricItem.burstDuration; |
925 receivedVoIPMetrics.endSystemDelay = rtcpPacket.XRVOIPMetricItem.endSyst
emDelay; | 913 receivedVoIPMetrics.discardRate = rtcpPacket.XRVOIPMetricItem.discardRate; |
926 receivedVoIPMetrics.extRfactor = rtcpPacket.XRVOIPMetricItem.extRfactor; | 914 receivedVoIPMetrics.endSystemDelay = |
927 receivedVoIPMetrics.gapDensity = rtcpPacket.XRVOIPMetricItem.gapDensity; | 915 rtcpPacket.XRVOIPMetricItem.endSystemDelay; |
928 receivedVoIPMetrics.gapDuration = rtcpPacket.XRVOIPMetricItem.gapDuratio
n; | 916 receivedVoIPMetrics.extRfactor = rtcpPacket.XRVOIPMetricItem.extRfactor; |
929 receivedVoIPMetrics.Gmin = rtcpPacket.XRVOIPMetricItem.Gmin; | 917 receivedVoIPMetrics.gapDensity = rtcpPacket.XRVOIPMetricItem.gapDensity; |
930 receivedVoIPMetrics.JBabsMax = rtcpPacket.XRVOIPMetricItem.JBabsMax; | 918 receivedVoIPMetrics.gapDuration = rtcpPacket.XRVOIPMetricItem.gapDuration; |
931 receivedVoIPMetrics.JBmax = rtcpPacket.XRVOIPMetricItem.JBmax; | 919 receivedVoIPMetrics.Gmin = rtcpPacket.XRVOIPMetricItem.Gmin; |
932 receivedVoIPMetrics.JBnominal = rtcpPacket.XRVOIPMetricItem.JBnominal; | 920 receivedVoIPMetrics.JBabsMax = rtcpPacket.XRVOIPMetricItem.JBabsMax; |
933 receivedVoIPMetrics.lossRate = rtcpPacket.XRVOIPMetricItem.lossRate; | 921 receivedVoIPMetrics.JBmax = rtcpPacket.XRVOIPMetricItem.JBmax; |
934 receivedVoIPMetrics.MOSCQ = rtcpPacket.XRVOIPMetricItem.MOSCQ; | 922 receivedVoIPMetrics.JBnominal = rtcpPacket.XRVOIPMetricItem.JBnominal; |
935 receivedVoIPMetrics.MOSLQ = rtcpPacket.XRVOIPMetricItem.MOSLQ; | 923 receivedVoIPMetrics.lossRate = rtcpPacket.XRVOIPMetricItem.lossRate; |
936 receivedVoIPMetrics.noiseLevel = rtcpPacket.XRVOIPMetricItem.noiseLevel; | 924 receivedVoIPMetrics.MOSCQ = rtcpPacket.XRVOIPMetricItem.MOSCQ; |
937 receivedVoIPMetrics.RERL = rtcpPacket.XRVOIPMetricItem.RERL; | 925 receivedVoIPMetrics.MOSLQ = rtcpPacket.XRVOIPMetricItem.MOSLQ; |
938 receivedVoIPMetrics.Rfactor = rtcpPacket.XRVOIPMetricItem.Rfactor; | 926 receivedVoIPMetrics.noiseLevel = rtcpPacket.XRVOIPMetricItem.noiseLevel; |
939 receivedVoIPMetrics.roundTripDelay = rtcpPacket.XRVOIPMetricItem.roundTr
ipDelay; | 927 receivedVoIPMetrics.RERL = rtcpPacket.XRVOIPMetricItem.RERL; |
940 receivedVoIPMetrics.RXconfig = rtcpPacket.XRVOIPMetricItem.RXconfig; | 928 receivedVoIPMetrics.Rfactor = rtcpPacket.XRVOIPMetricItem.Rfactor; |
941 receivedVoIPMetrics.signalLevel = rtcpPacket.XRVOIPMetricItem.signalLeve
l; | 929 receivedVoIPMetrics.roundTripDelay = |
| 930 rtcpPacket.XRVOIPMetricItem.roundTripDelay; |
| 931 receivedVoIPMetrics.RXconfig = rtcpPacket.XRVOIPMetricItem.RXconfig; |
| 932 receivedVoIPMetrics.signalLevel = rtcpPacket.XRVOIPMetricItem.signalLevel; |
942 | 933 |
943 rtcpPacketInformation.AddVoIPMetric(&receivedVoIPMetrics); | 934 rtcpPacketInformation.AddVoIPMetric(&receivedVoIPMetrics); |
944 | 935 |
945 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrVoipMetric; // recei
ved signal | 936 rtcpPacketInformation.rtcpPacketTypeFlags |= |
946 } | 937 kRtcpXrVoipMetric; // received signal |
947 rtcpParser.Iterate(); | 938 } |
| 939 rtcpParser.Iterate(); |
948 } | 940 } |
949 | 941 |
950 void RTCPReceiver::HandlePLI(RTCPUtility::RTCPParserV2& rtcpParser, | 942 void RTCPReceiver::HandlePLI(RTCPUtility::RTCPParserV2& rtcpParser, |
951 RTCPPacketInformation& rtcpPacketInformation) { | 943 RTCPPacketInformation& rtcpPacketInformation) { |
952 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 944 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
953 if (main_ssrc_ == rtcpPacket.PLI.MediaSSRC) { | 945 if (main_ssrc_ == rtcpPacket.PLI.MediaSSRC) { |
954 TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PLI"); | 946 TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PLI"); |
955 | 947 |
956 ++packet_type_counter_.pli_packets; | 948 ++packet_type_counter_.pli_packets; |
957 // Received a signal that we need to send a new key frame. | 949 // Received a signal that we need to send a new key frame. |
(...skipping 25 matching lines...) Expand all Loading... |
983 | 975 |
984 // sanity, we can't have more than what's in one packet | 976 // sanity, we can't have more than what's in one packet |
985 if (maxNumOfTMMBRBlocks > 200) { | 977 if (maxNumOfTMMBRBlocks > 200) { |
986 assert(false); | 978 assert(false); |
987 rtcpParser.Iterate(); | 979 rtcpParser.Iterate(); |
988 return; | 980 return; |
989 } | 981 } |
990 | 982 |
991 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); | 983 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); |
992 while (pktType == RTCPPacketTypes::kRtpfbTmmbrItem) { | 984 while (pktType == RTCPPacketTypes::kRtpfbTmmbrItem) { |
993 HandleTMMBRItem(*ptrReceiveInfo, rtcpPacket, rtcpPacketInformation, senderSS
RC); | 985 HandleTMMBRItem(*ptrReceiveInfo, rtcpPacket, rtcpPacketInformation, |
| 986 senderSSRC); |
994 pktType = rtcpParser.Iterate(); | 987 pktType = rtcpParser.Iterate(); |
995 } | 988 } |
996 } | 989 } |
997 | 990 |
998 void RTCPReceiver::HandleTMMBRItem(RTCPReceiveInformation& receiveInfo, | 991 void RTCPReceiver::HandleTMMBRItem(RTCPReceiveInformation& receiveInfo, |
999 const RTCPUtility::RTCPPacket& rtcpPacket, | 992 const RTCPUtility::RTCPPacket& rtcpPacket, |
1000 RTCPPacketInformation& rtcpPacketInformation, | 993 RTCPPacketInformation& rtcpPacketInformation, |
1001 uint32_t senderSSRC) { | 994 uint32_t senderSSRC) { |
1002 if (main_ssrc_ == rtcpPacket.TMMBRItem.SSRC && | 995 if (main_ssrc_ == rtcpPacket.TMMBRItem.SSRC && |
1003 rtcpPacket.TMMBRItem.MaxTotalMediaBitRate > 0) { | 996 rtcpPacket.TMMBRItem.MaxTotalMediaBitRate > 0) { |
1004 receiveInfo.InsertTmmbrItem( | 997 receiveInfo.InsertTmmbrItem( |
1005 senderSSRC, | 998 senderSSRC, |
1006 rtcp::TmmbItem(rtcpPacket.TMMBRItem.SSRC, | 999 rtcp::TmmbItem(rtcpPacket.TMMBRItem.SSRC, |
1007 rtcpPacket.TMMBRItem.MaxTotalMediaBitRate * 1000, | 1000 rtcpPacket.TMMBRItem.MaxTotalMediaBitRate * 1000, |
1008 rtcpPacket.TMMBRItem.MeasuredOverhead), | 1001 rtcpPacket.TMMBRItem.MeasuredOverhead), |
1009 _clock->TimeInMilliseconds()); | 1002 _clock->TimeInMilliseconds()); |
1010 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTmmbr; | 1003 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTmmbr; |
1011 } | 1004 } |
1012 } | 1005 } |
1013 | 1006 |
1014 void RTCPReceiver::HandleTMMBN(RTCPUtility::RTCPParserV2& rtcpParser, | 1007 void RTCPReceiver::HandleTMMBN(RTCPUtility::RTCPParserV2& rtcpParser, |
1015 RTCPPacketInformation& rtcpPacketInformation) { | 1008 RTCPPacketInformation& rtcpPacketInformation) { |
1016 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 1009 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
1017 RTCPReceiveInformation* ptrReceiveInfo = GetReceiveInformation( | 1010 RTCPReceiveInformation* ptrReceiveInfo = |
1018 rtcpPacket.TMMBN.SenderSSRC); | 1011 GetReceiveInformation(rtcpPacket.TMMBN.SenderSSRC); |
1019 if (ptrReceiveInfo == NULL) { | 1012 if (ptrReceiveInfo == NULL) { |
1020 // This remote SSRC must be saved before. | 1013 // This remote SSRC must be saved before. |
1021 rtcpParser.Iterate(); | 1014 rtcpParser.Iterate(); |
1022 return; | 1015 return; |
1023 } | 1016 } |
1024 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTmmbn; | 1017 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTmmbn; |
1025 // Use packet length to calc max number of TMMBN blocks | 1018 // Use packet length to calc max number of TMMBN blocks |
1026 // each TMMBN block is 8 bytes | 1019 // each TMMBN block is 8 bytes |
1027 ptrdiff_t maxNumOfTMMBNBlocks = rtcpParser.LengthLeft() / 8; | 1020 ptrdiff_t maxNumOfTMMBNBlocks = rtcpParser.LengthLeft() / 8; |
1028 | 1021 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1060 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); | 1053 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); |
1061 while (pktType == RTCPPacketTypes::kPsfbSliItem) { | 1054 while (pktType == RTCPPacketTypes::kPsfbSliItem) { |
1062 HandleSLIItem(rtcpPacket, rtcpPacketInformation); | 1055 HandleSLIItem(rtcpPacket, rtcpPacketInformation); |
1063 pktType = rtcpParser.Iterate(); | 1056 pktType = rtcpParser.Iterate(); |
1064 } | 1057 } |
1065 } | 1058 } |
1066 | 1059 |
1067 void RTCPReceiver::HandleSLIItem(const RTCPUtility::RTCPPacket& rtcpPacket, | 1060 void RTCPReceiver::HandleSLIItem(const RTCPUtility::RTCPPacket& rtcpPacket, |
1068 RTCPPacketInformation& rtcpPacketInformation) { | 1061 RTCPPacketInformation& rtcpPacketInformation) { |
1069 // in theory there could be multiple slices lost | 1062 // in theory there could be multiple slices lost |
1070 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSli; // received signal that
we need to refresh a slice | 1063 rtcpPacketInformation.rtcpPacketTypeFlags |= |
| 1064 kRtcpSli; // received signal that we need to refresh a slice |
1071 rtcpPacketInformation.sliPictureId = rtcpPacket.SLIItem.PictureId; | 1065 rtcpPacketInformation.sliPictureId = rtcpPacket.SLIItem.PictureId; |
1072 } | 1066 } |
1073 | 1067 |
1074 void | 1068 void RTCPReceiver::HandleRPSI( |
1075 RTCPReceiver::HandleRPSI(RTCPUtility::RTCPParserV2& rtcpParser, | 1069 RTCPUtility::RTCPParserV2& rtcpParser, |
1076 RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) | 1070 RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) { |
1077 { | 1071 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
1078 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 1072 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); |
1079 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); | 1073 if (pktType == RTCPPacketTypes::kPsfbRpsiItem) { |
1080 if (pktType == RTCPPacketTypes::kPsfbRpsiItem) { | 1074 if (rtcpPacket.RPSI.NumberOfValidBits % 8 != 0) { |
1081 if(rtcpPacket.RPSI.NumberOfValidBits%8 != 0) | 1075 // to us unknown |
1082 { | 1076 // continue |
1083 // to us unknown | 1077 rtcpParser.Iterate(); |
1084 // continue | 1078 return; |
1085 rtcpParser.Iterate(); | 1079 } |
1086 return; | 1080 // Received signal that we have a confirmed reference picture. |
1087 } | 1081 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRpsi; |
1088 // Received signal that we have a confirmed reference picture. | 1082 rtcpPacketInformation.rpsiPictureId = 0; |
1089 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRpsi; | |
1090 rtcpPacketInformation.rpsiPictureId = 0; | |
1091 | 1083 |
1092 // convert NativeBitString to rpsiPictureId | 1084 // convert NativeBitString to rpsiPictureId |
1093 uint8_t numberOfBytes = rtcpPacket.RPSI.NumberOfValidBits /8; | 1085 uint8_t numberOfBytes = rtcpPacket.RPSI.NumberOfValidBits / 8; |
1094 for(uint8_t n = 0; n < (numberOfBytes-1); n++) | 1086 for (uint8_t n = 0; n < (numberOfBytes - 1); n++) { |
1095 { | 1087 rtcpPacketInformation.rpsiPictureId += |
1096 rtcpPacketInformation.rpsiPictureId += (rtcpPacket.RPSI.NativeBitStr
ing[n] & 0x7f); | 1088 (rtcpPacket.RPSI.NativeBitString[n] & 0x7f); |
1097 rtcpPacketInformation.rpsiPictureId <<= 7; // prepare next | 1089 rtcpPacketInformation.rpsiPictureId <<= 7; // prepare next |
1098 } | |
1099 rtcpPacketInformation.rpsiPictureId += (rtcpPacket.RPSI.NativeBitString[
numberOfBytes-1] & 0x7f); | |
1100 } | 1090 } |
| 1091 rtcpPacketInformation.rpsiPictureId += |
| 1092 (rtcpPacket.RPSI.NativeBitString[numberOfBytes - 1] & 0x7f); |
| 1093 } |
1101 } | 1094 } |
1102 | 1095 |
1103 void RTCPReceiver::HandlePsfbApp(RTCPUtility::RTCPParserV2& rtcpParser, | 1096 void RTCPReceiver::HandlePsfbApp(RTCPUtility::RTCPParserV2& rtcpParser, |
1104 RTCPPacketInformation& rtcpPacketInformation) { | 1097 RTCPPacketInformation& rtcpPacketInformation) { |
1105 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); | 1098 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); |
1106 if (pktType == RTCPPacketTypes::kPsfbRemb) { | 1099 if (pktType == RTCPPacketTypes::kPsfbRemb) { |
1107 pktType = rtcpParser.Iterate(); | 1100 pktType = rtcpParser.Iterate(); |
1108 if (pktType == RTCPPacketTypes::kPsfbRembItem) { | 1101 if (pktType == RTCPPacketTypes::kPsfbRembItem) { |
1109 HandleREMBItem(rtcpParser, rtcpPacketInformation); | 1102 HandleREMBItem(rtcpParser, rtcpPacketInformation); |
1110 rtcpParser.Iterate(); | 1103 rtcpParser.Iterate(); |
1111 } | 1104 } |
1112 } | 1105 } |
1113 } | 1106 } |
1114 | 1107 |
1115 void RTCPReceiver::HandleIJ(RTCPUtility::RTCPParserV2& rtcpParser, | 1108 void RTCPReceiver::HandleIJ(RTCPUtility::RTCPParserV2& rtcpParser, |
1116 RTCPPacketInformation& rtcpPacketInformation) { | 1109 RTCPPacketInformation& rtcpPacketInformation) { |
1117 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 1110 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
1118 | 1111 |
1119 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); | 1112 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); |
1120 while (pktType == RTCPPacketTypes::kExtendedIjItem) { | 1113 while (pktType == RTCPPacketTypes::kExtendedIjItem) { |
1121 HandleIJItem(rtcpPacket, rtcpPacketInformation); | 1114 HandleIJItem(rtcpPacket, rtcpPacketInformation); |
1122 pktType = rtcpParser.Iterate(); | 1115 pktType = rtcpParser.Iterate(); |
1123 } | 1116 } |
1124 } | 1117 } |
1125 | 1118 |
1126 void RTCPReceiver::HandleIJItem(const RTCPUtility::RTCPPacket& rtcpPacket, | 1119 void RTCPReceiver::HandleIJItem(const RTCPUtility::RTCPPacket& rtcpPacket, |
1127 RTCPPacketInformation& rtcpPacketInformation) { | 1120 RTCPPacketInformation& rtcpPacketInformation) { |
1128 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTransmissionTimeOffset; | 1121 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTransmissionTimeOffset; |
1129 rtcpPacketInformation.interArrivalJitter = | 1122 rtcpPacketInformation.interArrivalJitter = |
1130 rtcpPacket.ExtendedJitterReportItem.Jitter; | 1123 rtcpPacket.ExtendedJitterReportItem.Jitter; |
1131 } | 1124 } |
1132 | 1125 |
1133 void RTCPReceiver::HandleREMBItem( | 1126 void RTCPReceiver::HandleREMBItem( |
1134 RTCPUtility::RTCPParserV2& rtcpParser, | 1127 RTCPUtility::RTCPParserV2& rtcpParser, |
1135 RTCPPacketInformation& rtcpPacketInformation) { | 1128 RTCPPacketInformation& rtcpPacketInformation) { |
1136 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 1129 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
1137 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRemb; | 1130 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRemb; |
1138 rtcpPacketInformation.receiverEstimatedMaxBitrate = | 1131 rtcpPacketInformation.receiverEstimatedMaxBitrate = |
1139 rtcpPacket.REMBItem.BitRate; | 1132 rtcpPacket.REMBItem.BitRate; |
1140 } | 1133 } |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1192 rtcpPacketInformation.applicationSubType = rtcpPacket.APP.SubType; | 1185 rtcpPacketInformation.applicationSubType = rtcpPacket.APP.SubType; |
1193 rtcpPacketInformation.applicationName = rtcpPacket.APP.Name; | 1186 rtcpPacketInformation.applicationName = rtcpPacket.APP.Name; |
1194 | 1187 |
1195 rtcpParser.Iterate(); | 1188 rtcpParser.Iterate(); |
1196 } | 1189 } |
1197 | 1190 |
1198 void RTCPReceiver::HandleAPPItem(RTCPUtility::RTCPParserV2& rtcpParser, | 1191 void RTCPReceiver::HandleAPPItem(RTCPUtility::RTCPParserV2& rtcpParser, |
1199 RTCPPacketInformation& rtcpPacketInformation) { | 1192 RTCPPacketInformation& rtcpPacketInformation) { |
1200 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 1193 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
1201 | 1194 |
1202 rtcpPacketInformation.AddApplicationData(rtcpPacket.APP.Data, rtcpPacket.APP.S
ize); | 1195 rtcpPacketInformation.AddApplicationData(rtcpPacket.APP.Data, |
| 1196 rtcpPacket.APP.Size); |
1203 | 1197 |
1204 rtcpParser.Iterate(); | 1198 rtcpParser.Iterate(); |
1205 } | 1199 } |
1206 | 1200 |
1207 void RTCPReceiver::HandleTransportFeedback( | 1201 void RTCPReceiver::HandleTransportFeedback( |
1208 RTCPUtility::RTCPParserV2* rtcp_parser, | 1202 RTCPUtility::RTCPParserV2* rtcp_parser, |
1209 RTCPHelp::RTCPPacketInformation* rtcp_packet_information) { | 1203 RTCPHelp::RTCPPacketInformation* rtcp_packet_information) { |
1210 rtcp::RtcpPacket* packet = rtcp_parser->ReleaseRtcpPacket(); | 1204 rtcp::RtcpPacket* packet = rtcp_parser->ReleaseRtcpPacket(); |
1211 RTC_DCHECK(packet != nullptr); | 1205 RTC_DCHECK(packet != nullptr); |
1212 rtcp_packet_information->rtcpPacketTypeFlags |= kRtcpTransportFeedback; | 1206 rtcp_packet_information->rtcpPacketTypeFlags |= kRtcpTransportFeedback; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1269 registered_ssrcs = registered_ssrcs_; | 1263 registered_ssrcs = registered_ssrcs_; |
1270 } | 1264 } |
1271 if (!receiver_only_ && | 1265 if (!receiver_only_ && |
1272 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq)) { | 1266 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq)) { |
1273 _rtpRtcp.OnRequestSendReport(); | 1267 _rtpRtcp.OnRequestSendReport(); |
1274 } | 1268 } |
1275 if (!receiver_only_ && | 1269 if (!receiver_only_ && |
1276 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack)) { | 1270 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack)) { |
1277 if (rtcpPacketInformation.nackSequenceNumbers.size() > 0) { | 1271 if (rtcpPacketInformation.nackSequenceNumbers.size() > 0) { |
1278 LOG(LS_VERBOSE) << "Incoming NACK length: " | 1272 LOG(LS_VERBOSE) << "Incoming NACK length: " |
1279 << rtcpPacketInformation.nackSequenceNumbers.size(); | 1273 << rtcpPacketInformation.nackSequenceNumbers.size(); |
1280 _rtpRtcp.OnReceivedNACK(rtcpPacketInformation.nackSequenceNumbers); | 1274 _rtpRtcp.OnReceivedNACK(rtcpPacketInformation.nackSequenceNumbers); |
1281 } | 1275 } |
1282 } | 1276 } |
1283 { | 1277 { |
1284 // We need feedback that we have received a report block(s) so that we | 1278 // We need feedback that we have received a report block(s) so that we |
1285 // can generate a new packet in a conference relay scenario, one received | 1279 // can generate a new packet in a conference relay scenario, one received |
1286 // report can generate several RTCP packets, based on number relayed/mixed | 1280 // report can generate several RTCP packets, based on number relayed/mixed |
1287 // a send report block should go out to all receivers. | 1281 // a send report block should go out to all receivers. |
1288 if (_cbRtcpIntraFrameObserver) { | 1282 if (_cbRtcpIntraFrameObserver) { |
1289 RTC_DCHECK(!receiver_only_); | 1283 RTC_DCHECK(!receiver_only_); |
(...skipping 22 matching lines...) Expand all Loading... |
1312 if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRemb) { | 1306 if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRemb) { |
1313 LOG(LS_VERBOSE) << "Incoming REMB: " | 1307 LOG(LS_VERBOSE) << "Incoming REMB: " |
1314 << rtcpPacketInformation.receiverEstimatedMaxBitrate; | 1308 << rtcpPacketInformation.receiverEstimatedMaxBitrate; |
1315 _cbRtcpBandwidthObserver->OnReceivedEstimatedBitrate( | 1309 _cbRtcpBandwidthObserver->OnReceivedEstimatedBitrate( |
1316 rtcpPacketInformation.receiverEstimatedMaxBitrate); | 1310 rtcpPacketInformation.receiverEstimatedMaxBitrate); |
1317 } | 1311 } |
1318 if ((rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr) || | 1312 if ((rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr) || |
1319 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRr)) { | 1313 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRr)) { |
1320 int64_t now = _clock->TimeInMilliseconds(); | 1314 int64_t now = _clock->TimeInMilliseconds(); |
1321 _cbRtcpBandwidthObserver->OnReceivedRtcpReceiverReport( | 1315 _cbRtcpBandwidthObserver->OnReceivedRtcpReceiverReport( |
1322 rtcpPacketInformation.report_blocks, | 1316 rtcpPacketInformation.report_blocks, rtcpPacketInformation.rtt, |
1323 rtcpPacketInformation.rtt, | |
1324 now); | 1317 now); |
1325 } | 1318 } |
1326 } | 1319 } |
1327 if ((rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr) || | 1320 if ((rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr) || |
1328 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRr)) { | 1321 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRr)) { |
1329 _rtpRtcp.OnReceivedRtcpReportBlocks(rtcpPacketInformation.report_blocks); | 1322 _rtpRtcp.OnReceivedRtcpReportBlocks(rtcpPacketInformation.report_blocks); |
1330 } | 1323 } |
1331 | 1324 |
1332 if (_cbTransportFeedbackObserver && | 1325 if (_cbTransportFeedbackObserver && |
1333 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpTransportFeedback)) { | 1326 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpTransportFeedback)) { |
1334 uint32_t media_source_ssrc = | 1327 uint32_t media_source_ssrc = |
1335 rtcpPacketInformation.transport_feedback_->GetMediaSourceSsrc(); | 1328 rtcpPacketInformation.transport_feedback_->GetMediaSourceSsrc(); |
1336 if (media_source_ssrc == local_ssrc || | 1329 if (media_source_ssrc == local_ssrc || |
1337 registered_ssrcs.find(media_source_ssrc) != registered_ssrcs.end()) { | 1330 registered_ssrcs.find(media_source_ssrc) != registered_ssrcs.end()) { |
1338 _cbTransportFeedbackObserver->OnTransportFeedback( | 1331 _cbTransportFeedbackObserver->OnTransportFeedback( |
1339 *rtcpPacketInformation.transport_feedback_.get()); | 1332 *rtcpPacketInformation.transport_feedback_.get()); |
1340 } | 1333 } |
1341 } | 1334 } |
1342 } | 1335 } |
1343 | 1336 |
1344 if (!receiver_only_) { | 1337 if (!receiver_only_) { |
1345 rtc::CritScope cs(&_criticalSectionFeedbacks); | 1338 rtc::CritScope cs(&_criticalSectionFeedbacks); |
1346 if (stats_callback_) { | 1339 if (stats_callback_) { |
1347 for (ReportBlockList::const_iterator it = | 1340 for (ReportBlockList::const_iterator it = |
1348 rtcpPacketInformation.report_blocks.begin(); | 1341 rtcpPacketInformation.report_blocks.begin(); |
1349 it != rtcpPacketInformation.report_blocks.end(); | 1342 it != rtcpPacketInformation.report_blocks.end(); ++it) { |
1350 ++it) { | |
1351 RtcpStatistics stats; | 1343 RtcpStatistics stats; |
1352 stats.cumulative_lost = it->cumulativeLost; | 1344 stats.cumulative_lost = it->cumulativeLost; |
1353 stats.extended_max_sequence_number = it->extendedHighSeqNum; | 1345 stats.extended_max_sequence_number = it->extendedHighSeqNum; |
1354 stats.fraction_lost = it->fractionLost; | 1346 stats.fraction_lost = it->fractionLost; |
1355 stats.jitter = it->jitter; | 1347 stats.jitter = it->jitter; |
1356 | 1348 |
1357 stats_callback_->StatisticsUpdated(stats, it->sourceSSRC); | 1349 stats_callback_->StatisticsUpdated(stats, it->sourceSSRC); |
1358 } | 1350 } |
1359 } | 1351 } |
1360 } | 1352 } |
(...skipping 21 matching lines...) Expand all Loading... |
1382 | 1374 |
1383 for (const auto& kv : _receivedInfoMap) { | 1375 for (const auto& kv : _receivedInfoMap) { |
1384 RTCPReceiveInformation* receive_info = kv.second; | 1376 RTCPReceiveInformation* receive_info = kv.second; |
1385 RTC_DCHECK(receive_info); | 1377 RTC_DCHECK(receive_info); |
1386 receive_info->GetTmmbrSet(now_ms, &candidates); | 1378 receive_info->GetTmmbrSet(now_ms, &candidates); |
1387 } | 1379 } |
1388 return candidates; | 1380 return candidates; |
1389 } | 1381 } |
1390 | 1382 |
1391 } // namespace webrtc | 1383 } // namespace webrtc |
OLD | NEW |