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 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 rtcp::SenderReport sender_report; | 405 rtcp::SenderReport sender_report; |
406 if (!sender_report.Parse(rtcp_block)) { | 406 if (!sender_report.Parse(rtcp_block)) { |
407 ++num_skipped_packets_; | 407 ++num_skipped_packets_; |
408 return; | 408 return; |
409 } | 409 } |
410 | 410 |
411 const uint32_t remote_ssrc = sender_report.sender_ssrc(); | 411 const uint32_t remote_ssrc = sender_report.sender_ssrc(); |
412 | 412 |
413 packet_information->remote_ssrc = remote_ssrc; | 413 packet_information->remote_ssrc = remote_ssrc; |
414 | 414 |
415 CreateTmmbrInformation(remote_ssrc); | 415 UpdateTmmbrRemoteIsAlive(remote_ssrc); |
416 | 416 |
417 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "SR", | 417 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "SR", |
418 "remote_ssrc", remote_ssrc, "ssrc", main_ssrc_); | 418 "remote_ssrc", remote_ssrc, "ssrc", main_ssrc_); |
419 | 419 |
420 // Have I received RTP packets from this party? | 420 // Have I received RTP packets from this party? |
421 if (remote_ssrc_ == remote_ssrc) { | 421 if (remote_ssrc_ == remote_ssrc) { |
422 // Only signal that we have received a SR when we accept one. | 422 // Only signal that we have received a SR when we accept one. |
423 packet_information->packet_type_flags |= kRtcpSr; | 423 packet_information->packet_type_flags |= kRtcpSr; |
424 | 424 |
425 // Save the NTP time of this report. | 425 // Save the NTP time of this report. |
(...skipping 21 matching lines...) Expand all Loading... |
447 ++num_skipped_packets_; | 447 ++num_skipped_packets_; |
448 return; | 448 return; |
449 } | 449 } |
450 | 450 |
451 last_received_rr_ms_ = clock_->TimeInMilliseconds(); | 451 last_received_rr_ms_ = clock_->TimeInMilliseconds(); |
452 | 452 |
453 const uint32_t remote_ssrc = receiver_report.sender_ssrc(); | 453 const uint32_t remote_ssrc = receiver_report.sender_ssrc(); |
454 | 454 |
455 packet_information->remote_ssrc = remote_ssrc; | 455 packet_information->remote_ssrc = remote_ssrc; |
456 | 456 |
457 CreateTmmbrInformation(remote_ssrc); | 457 UpdateTmmbrRemoteIsAlive(remote_ssrc); |
458 | 458 |
459 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR", | 459 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR", |
460 "remote_ssrc", remote_ssrc, "ssrc", main_ssrc_); | 460 "remote_ssrc", remote_ssrc, "ssrc", main_ssrc_); |
461 | 461 |
462 packet_information->packet_type_flags |= kRtcpRr; | 462 packet_information->packet_type_flags |= kRtcpRr; |
463 | 463 |
464 for (const ReportBlock& report_block : receiver_report.report_blocks()) | 464 for (const ReportBlock& report_block : receiver_report.report_blocks()) |
465 HandleReportBlock(report_block, packet_information, remote_ssrc); | 465 HandleReportBlock(report_block, packet_information, remote_ssrc); |
466 } | 466 } |
467 | 467 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 ++report_block_info->num_rtts; | 528 ++report_block_info->num_rtts; |
529 } | 529 } |
530 | 530 |
531 TRACE_COUNTER_ID1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR_RTT", | 531 TRACE_COUNTER_ID1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR_RTT", |
532 report_block.source_ssrc(), rtt_ms); | 532 report_block.source_ssrc(), rtt_ms); |
533 | 533 |
534 packet_information->rtt_ms = rtt_ms; | 534 packet_information->rtt_ms = rtt_ms; |
535 packet_information->report_blocks.push_back(report_block_info->report_block); | 535 packet_information->report_blocks.push_back(report_block_info->report_block); |
536 } | 536 } |
537 | 537 |
538 void RTCPReceiver::CreateTmmbrInformation(uint32_t remote_ssrc) { | 538 RTCPReceiver::TmmbrInformation* RTCPReceiver::FindOrCreateTmmbrInfo( |
| 539 uint32_t remote_ssrc) { |
539 // Create or find receive information. | 540 // Create or find receive information. |
540 TmmbrInformation* tmmbr_info = &tmmbr_infos_[remote_ssrc]; | 541 TmmbrInformation* tmmbr_info = &tmmbr_infos_[remote_ssrc]; |
541 // Update that this remote is alive. | 542 // Update that this remote is alive. |
542 tmmbr_info->last_time_received_ms = clock_->TimeInMilliseconds(); | 543 tmmbr_info->last_time_received_ms = clock_->TimeInMilliseconds(); |
| 544 return tmmbr_info; |
| 545 } |
| 546 |
| 547 void RTCPReceiver::UpdateTmmbrRemoteIsAlive(uint32_t remote_ssrc) { |
| 548 auto tmmbr_it = tmmbr_infos_.find(remote_ssrc); |
| 549 if (tmmbr_it != tmmbr_infos_.end()) |
| 550 tmmbr_it->second.last_time_received_ms = clock_->TimeInMilliseconds(); |
543 } | 551 } |
544 | 552 |
545 RTCPReceiver::TmmbrInformation* RTCPReceiver::GetTmmbrInformation( | 553 RTCPReceiver::TmmbrInformation* RTCPReceiver::GetTmmbrInformation( |
546 uint32_t remote_ssrc) { | 554 uint32_t remote_ssrc) { |
547 auto it = tmmbr_infos_.find(remote_ssrc); | 555 auto it = tmmbr_infos_.find(remote_ssrc); |
548 if (it == tmmbr_infos_.end()) | 556 if (it == tmmbr_infos_.end()) |
549 return nullptr; | 557 return nullptr; |
550 return &it->second; | 558 return &it->second; |
551 } | 559 } |
552 | 560 |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 | 784 |
777 void RTCPReceiver::HandleTmmbr(const CommonHeader& rtcp_block, | 785 void RTCPReceiver::HandleTmmbr(const CommonHeader& rtcp_block, |
778 PacketInformation* packet_information) { | 786 PacketInformation* packet_information) { |
779 rtcp::Tmmbr tmmbr; | 787 rtcp::Tmmbr tmmbr; |
780 if (!tmmbr.Parse(rtcp_block)) { | 788 if (!tmmbr.Parse(rtcp_block)) { |
781 ++num_skipped_packets_; | 789 ++num_skipped_packets_; |
782 return; | 790 return; |
783 } | 791 } |
784 | 792 |
785 uint32_t sender_ssrc = tmmbr.sender_ssrc(); | 793 uint32_t sender_ssrc = tmmbr.sender_ssrc(); |
786 TmmbrInformation* receive_info = GetTmmbrInformation(sender_ssrc); | |
787 if (!receive_info) // This remote SSRC must be saved before. | |
788 return; | |
789 | |
790 if (tmmbr.media_ssrc()) { | 794 if (tmmbr.media_ssrc()) { |
791 // media_ssrc() SHOULD be 0 if same as SenderSSRC. | 795 // media_ssrc() SHOULD be 0 if same as SenderSSRC. |
792 // In relay mode this is a valid number. | 796 // In relay mode this is a valid number. |
793 sender_ssrc = tmmbr.media_ssrc(); | 797 sender_ssrc = tmmbr.media_ssrc(); |
794 } | 798 } |
795 | 799 |
796 for (const rtcp::TmmbItem& request : tmmbr.requests()) { | 800 for (const rtcp::TmmbItem& request : tmmbr.requests()) { |
797 if (main_ssrc_ == request.ssrc() && request.bitrate_bps()) { | 801 if (main_ssrc_ != request.ssrc() || request.bitrate_bps() == 0) |
798 auto* entry = &receive_info->tmmbr[sender_ssrc]; | 802 continue; |
799 entry->tmmbr_item = rtcp::TmmbItem(sender_ssrc, | |
800 request.bitrate_bps(), | |
801 request.packet_overhead()); | |
802 entry->last_updated_ms = clock_->TimeInMilliseconds(); | |
803 | 803 |
804 packet_information->packet_type_flags |= kRtcpTmmbr; | 804 TmmbrInformation* tmmbr_info = FindOrCreateTmmbrInfo(tmmbr.sender_ssrc()); |
805 } | 805 auto* entry = &tmmbr_info->tmmbr[sender_ssrc]; |
| 806 entry->tmmbr_item = rtcp::TmmbItem(sender_ssrc, |
| 807 request.bitrate_bps(), |
| 808 request.packet_overhead()); |
| 809 entry->last_updated_ms = clock_->TimeInMilliseconds(); |
| 810 |
| 811 packet_information->packet_type_flags |= kRtcpTmmbr; |
| 812 break; |
806 } | 813 } |
807 } | 814 } |
808 | 815 |
809 void RTCPReceiver::HandleTmmbn(const CommonHeader& rtcp_block, | 816 void RTCPReceiver::HandleTmmbn(const CommonHeader& rtcp_block, |
810 PacketInformation* packet_information) { | 817 PacketInformation* packet_information) { |
811 rtcp::Tmmbn tmmbn; | 818 rtcp::Tmmbn tmmbn; |
812 if (!tmmbn.Parse(rtcp_block)) { | 819 if (!tmmbn.Parse(rtcp_block)) { |
813 ++num_skipped_packets_; | 820 ++num_skipped_packets_; |
814 return; | 821 return; |
815 } | 822 } |
816 | 823 |
817 TmmbrInformation* receive_info = GetTmmbrInformation(tmmbn.sender_ssrc()); | 824 TmmbrInformation* tmmbr_info = FindOrCreateTmmbrInfo(tmmbn.sender_ssrc()); |
818 if (!receive_info) // This remote SSRC must be saved before. | |
819 return; | |
820 | 825 |
821 packet_information->packet_type_flags |= kRtcpTmmbn; | 826 packet_information->packet_type_flags |= kRtcpTmmbn; |
822 | 827 |
823 for (const auto& item : tmmbn.items()) | 828 tmmbr_info->tmmbn = tmmbn.items(); |
824 receive_info->tmmbn.push_back(item); | |
825 } | 829 } |
826 | 830 |
827 void RTCPReceiver::HandleSrReq(const CommonHeader& rtcp_block, | 831 void RTCPReceiver::HandleSrReq(const CommonHeader& rtcp_block, |
828 PacketInformation* packet_information) { | 832 PacketInformation* packet_information) { |
829 rtcp::RapidResyncRequest sr_req; | 833 rtcp::RapidResyncRequest sr_req; |
830 if (!sr_req.Parse(rtcp_block)) { | 834 if (!sr_req.Parse(rtcp_block)) { |
831 ++num_skipped_packets_; | 835 ++num_skipped_packets_; |
832 return; | 836 return; |
833 } | 837 } |
834 | 838 |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1091 } else { | 1095 } else { |
1092 candidates.push_back(it->second.tmmbr_item); | 1096 candidates.push_back(it->second.tmmbr_item); |
1093 ++it; | 1097 ++it; |
1094 } | 1098 } |
1095 } | 1099 } |
1096 } | 1100 } |
1097 return candidates; | 1101 return candidates; |
1098 } | 1102 } |
1099 | 1103 |
1100 } // namespace webrtc | 1104 } // namespace webrtc |
OLD | NEW |