| 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 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 LOG(LS_WARNING) | 380 LOG(LS_WARNING) |
| 381 << num_skipped_packets_ | 381 << num_skipped_packets_ |
| 382 << " RTCP blocks were skipped due to being malformed or of " | 382 << " RTCP blocks were skipped due to being malformed or of " |
| 383 "unrecognized/unsupported type, during the past " | 383 "unrecognized/unsupported type, during the past " |
| 384 << (kMaxWarningLogIntervalMs / 1000) << " second period."; | 384 << (kMaxWarningLogIntervalMs / 1000) << " second period."; |
| 385 } | 385 } |
| 386 | 386 |
| 387 return 0; | 387 return 0; |
| 388 } | 388 } |
| 389 | 389 |
| 390 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 391 void | 390 void |
| 392 RTCPReceiver::HandleSenderReceiverReport(RTCPUtility::RTCPParserV2& rtcpParser, | 391 RTCPReceiver::HandleSenderReceiverReport(RTCPUtility::RTCPParserV2& rtcpParser, |
| 393 RTCPPacketInformation& rtcpPacketInform
ation) | 392 RTCPPacketInformation& rtcpPacketInform
ation) |
| 394 { | 393 { |
| 395 RTCPUtility::RTCPPacketTypes rtcpPacketType = rtcpParser.PacketType(); | 394 RTCPUtility::RTCPPacketTypes rtcpPacketType = rtcpParser.PacketType(); |
| 396 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 395 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
| 397 | 396 |
| 398 assert((rtcpPacketType == RTCPPacketTypes::kRr) || | 397 assert((rtcpPacketType == RTCPPacketTypes::kRr) || |
| 399 (rtcpPacketType == RTCPPacketTypes::kSr)); | 398 (rtcpPacketType == RTCPPacketTypes::kSr)); |
| 400 | 399 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 UpdateReceiveInformation(*ptrReceiveInfo); | 455 UpdateReceiveInformation(*ptrReceiveInfo); |
| 457 | 456 |
| 458 rtcpPacketType = rtcpParser.Iterate(); | 457 rtcpPacketType = rtcpParser.Iterate(); |
| 459 | 458 |
| 460 while (rtcpPacketType == RTCPPacketTypes::kReportBlockItem) { | 459 while (rtcpPacketType == RTCPPacketTypes::kReportBlockItem) { |
| 461 HandleReportBlock(rtcpPacket, rtcpPacketInformation, remoteSSRC); | 460 HandleReportBlock(rtcpPacket, rtcpPacketInformation, remoteSSRC); |
| 462 rtcpPacketType = rtcpParser.Iterate(); | 461 rtcpPacketType = rtcpParser.Iterate(); |
| 463 } | 462 } |
| 464 } | 463 } |
| 465 | 464 |
| 466 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 467 void RTCPReceiver::HandleReportBlock( | 465 void RTCPReceiver::HandleReportBlock( |
| 468 const RTCPUtility::RTCPPacket& rtcpPacket, | 466 const RTCPUtility::RTCPPacket& rtcpPacket, |
| 469 RTCPPacketInformation& rtcpPacketInformation, | 467 RTCPPacketInformation& rtcpPacketInformation, |
| 470 uint32_t remoteSSRC) | 468 uint32_t remoteSSRC) |
| 471 EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver) { | 469 EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver) { |
| 472 // This will be called once per report block in the RTCP packet. | 470 // This will be called once per report block in the RTCP packet. |
| 473 // We filter out all report blocks that are not for us. | 471 // We filter out all report blocks that are not for us. |
| 474 // Each packet has max 31 RR blocks. | 472 // Each packet has max 31 RR blocks. |
| 475 // | 473 // |
| 476 // We can calc RTT if we send a send report and get a report block back. | 474 // We can calc RTT if we send a send report and get a report block back. |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 768 } | 766 } |
| 769 boundingSetRec->SetEntry(i, | 767 boundingSetRec->SetEntry(i, |
| 770 receiveInfo->TmmbnBoundingSet.Tmmbr(i), | 768 receiveInfo->TmmbnBoundingSet.Tmmbr(i), |
| 771 receiveInfo->TmmbnBoundingSet.PacketOH(i), | 769 receiveInfo->TmmbnBoundingSet.PacketOH(i), |
| 772 receiveInfo->TmmbnBoundingSet.Ssrc(i)); | 770 receiveInfo->TmmbnBoundingSet.Ssrc(i)); |
| 773 } | 771 } |
| 774 } | 772 } |
| 775 return receiveInfo->TmmbnBoundingSet.lengthOfSet(); | 773 return receiveInfo->TmmbnBoundingSet.lengthOfSet(); |
| 776 } | 774 } |
| 777 | 775 |
| 778 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 779 void RTCPReceiver::HandleSDES(RTCPUtility::RTCPParserV2& rtcpParser, | 776 void RTCPReceiver::HandleSDES(RTCPUtility::RTCPParserV2& rtcpParser, |
| 780 RTCPPacketInformation& rtcpPacketInformation) { | 777 RTCPPacketInformation& rtcpPacketInformation) { |
| 781 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); | 778 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); |
| 782 while (pktType == RTCPPacketTypes::kSdesChunk) { | 779 while (pktType == RTCPPacketTypes::kSdesChunk) { |
| 783 HandleSDESChunk(rtcpParser); | 780 HandleSDESChunk(rtcpParser); |
| 784 pktType = rtcpParser.Iterate(); | 781 pktType = rtcpParser.Iterate(); |
| 785 } | 782 } |
| 786 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSdes; | 783 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSdes; |
| 787 } | 784 } |
| 788 | 785 |
| 789 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 790 void RTCPReceiver::HandleSDESChunk(RTCPUtility::RTCPParserV2& rtcpParser) { | 786 void RTCPReceiver::HandleSDESChunk(RTCPUtility::RTCPParserV2& rtcpParser) { |
| 791 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 787 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
| 792 RTCPCnameInformation* cnameInfo = | 788 RTCPCnameInformation* cnameInfo = |
| 793 CreateCnameInformation(rtcpPacket.CName.SenderSSRC); | 789 CreateCnameInformation(rtcpPacket.CName.SenderSSRC); |
| 794 assert(cnameInfo); | 790 assert(cnameInfo); |
| 795 | 791 |
| 796 cnameInfo->name[RTCP_CNAME_SIZE - 1] = 0; | 792 cnameInfo->name[RTCP_CNAME_SIZE - 1] = 0; |
| 797 strncpy(cnameInfo->name, rtcpPacket.CName.CName, RTCP_CNAME_SIZE - 1); | 793 strncpy(cnameInfo->name, rtcpPacket.CName.CName, RTCP_CNAME_SIZE - 1); |
| 798 { | 794 { |
| 799 CriticalSectionScoped lock(_criticalSectionFeedbacks); | 795 CriticalSectionScoped lock(_criticalSectionFeedbacks); |
| 800 if (stats_callback_ != NULL) { | 796 if (stats_callback_ != NULL) { |
| 801 stats_callback_->CNameChanged(rtcpPacket.CName.CName, | 797 stats_callback_->CNameChanged(rtcpPacket.CName.CName, |
| 802 rtcpPacket.CName.SenderSSRC); | 798 rtcpPacket.CName.SenderSSRC); |
| 803 } | 799 } |
| 804 } | 800 } |
| 805 } | 801 } |
| 806 | 802 |
| 807 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 808 void RTCPReceiver::HandleNACK(RTCPUtility::RTCPParserV2& rtcpParser, | 803 void RTCPReceiver::HandleNACK(RTCPUtility::RTCPParserV2& rtcpParser, |
| 809 RTCPPacketInformation& rtcpPacketInformation) { | 804 RTCPPacketInformation& rtcpPacketInformation) { |
| 810 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 805 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
| 811 if (receiver_only_ || main_ssrc_ != rtcpPacket.NACK.MediaSSRC) { | 806 if (receiver_only_ || main_ssrc_ != rtcpPacket.NACK.MediaSSRC) { |
| 812 // Not to us. | 807 // Not to us. |
| 813 rtcpParser.Iterate(); | 808 rtcpParser.Iterate(); |
| 814 return; | 809 return; |
| 815 } | 810 } |
| 816 rtcpPacketInformation.ResetNACKPacketIdArray(); | 811 rtcpPacketInformation.ResetNACKPacketIdArray(); |
| 817 | 812 |
| 818 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); | 813 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); |
| 819 while (pktType == RTCPPacketTypes::kRtpfbNackItem) { | 814 while (pktType == RTCPPacketTypes::kRtpfbNackItem) { |
| 820 HandleNACKItem(rtcpPacket, rtcpPacketInformation); | 815 HandleNACKItem(rtcpPacket, rtcpPacketInformation); |
| 821 pktType = rtcpParser.Iterate(); | 816 pktType = rtcpParser.Iterate(); |
| 822 } | 817 } |
| 823 | 818 |
| 824 if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack) { | 819 if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack) { |
| 825 ++packet_type_counter_.nack_packets; | 820 ++packet_type_counter_.nack_packets; |
| 826 packet_type_counter_.nack_requests = nack_stats_.requests(); | 821 packet_type_counter_.nack_requests = nack_stats_.requests(); |
| 827 packet_type_counter_.unique_nack_requests = nack_stats_.unique_requests(); | 822 packet_type_counter_.unique_nack_requests = nack_stats_.unique_requests(); |
| 828 } | 823 } |
| 829 } | 824 } |
| 830 | 825 |
| 831 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 832 void | 826 void |
| 833 RTCPReceiver::HandleNACKItem(const RTCPUtility::RTCPPacket& rtcpPacket, | 827 RTCPReceiver::HandleNACKItem(const RTCPUtility::RTCPPacket& rtcpPacket, |
| 834 RTCPPacketInformation& rtcpPacketInformation) { | 828 RTCPPacketInformation& rtcpPacketInformation) { |
| 835 rtcpPacketInformation.AddNACKPacket(rtcpPacket.NACKItem.PacketID); | 829 rtcpPacketInformation.AddNACKPacket(rtcpPacket.NACKItem.PacketID); |
| 836 nack_stats_.ReportRequest(rtcpPacket.NACKItem.PacketID); | 830 nack_stats_.ReportRequest(rtcpPacket.NACKItem.PacketID); |
| 837 | 831 |
| 838 uint16_t bitMask = rtcpPacket.NACKItem.BitMask; | 832 uint16_t bitMask = rtcpPacket.NACKItem.BitMask; |
| 839 if (bitMask) { | 833 if (bitMask) { |
| 840 for (int i=1; i <= 16; ++i) { | 834 for (int i=1; i <= 16; ++i) { |
| 841 if (bitMask & 0x01) { | 835 if (bitMask & 0x01) { |
| 842 rtcpPacketInformation.AddNACKPacket(rtcpPacket.NACKItem.PacketID + i); | 836 rtcpPacketInformation.AddNACKPacket(rtcpPacket.NACKItem.PacketID + i); |
| 843 nack_stats_.ReportRequest(rtcpPacket.NACKItem.PacketID + i); | 837 nack_stats_.ReportRequest(rtcpPacket.NACKItem.PacketID + i); |
| 844 } | 838 } |
| 845 bitMask = bitMask >>1; | 839 bitMask = bitMask >>1; |
| 846 } | 840 } |
| 847 } | 841 } |
| 848 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpNack; | 842 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpNack; |
| 849 } | 843 } |
| 850 | 844 |
| 851 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 852 void RTCPReceiver::HandleBYE(RTCPUtility::RTCPParserV2& rtcpParser) { | 845 void RTCPReceiver::HandleBYE(RTCPUtility::RTCPParserV2& rtcpParser) { |
| 853 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 846 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
| 854 | 847 |
| 855 // clear our lists | 848 // clear our lists |
| 856 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | |
| 857 ReportBlockMap::iterator it = _receivedReportBlockMap.begin(); | 849 ReportBlockMap::iterator it = _receivedReportBlockMap.begin(); |
| 858 for (; it != _receivedReportBlockMap.end(); ++it) { | 850 for (; it != _receivedReportBlockMap.end(); ++it) { |
| 859 ReportBlockInfoMap* info_map = &(it->second); | 851 ReportBlockInfoMap* info_map = &(it->second); |
| 860 ReportBlockInfoMap::iterator it_info = info_map->find( | 852 ReportBlockInfoMap::iterator it_info = info_map->find( |
| 861 rtcpPacket.BYE.SenderSSRC); | 853 rtcpPacket.BYE.SenderSSRC); |
| 862 if (it_info != info_map->end()) { | 854 if (it_info != info_map->end()) { |
| 863 delete it_info->second; | 855 delete it_info->second; |
| 864 info_map->erase(it_info); | 856 info_map->erase(it_info); |
| 865 } | 857 } |
| 866 } | 858 } |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 957 (((packet.XRDLRRReportBlockItem.DelayLastRR & 0x0000ffff) * 1000) >> 16) + | 949 (((packet.XRDLRRReportBlockItem.DelayLastRR & 0x0000ffff) * 1000) >> 16) + |
| 958 (((packet.XRDLRRReportBlockItem.DelayLastRR & 0xffff0000) >> 16) * 1000); | 950 (((packet.XRDLRRReportBlockItem.DelayLastRR & 0xffff0000) >> 16) * 1000); |
| 959 | 951 |
| 960 int64_t rtt = _clock->CurrentNtpInMilliseconds() - delay_rr_ms - send_time_ms; | 952 int64_t rtt = _clock->CurrentNtpInMilliseconds() - delay_rr_ms - send_time_ms; |
| 961 | 953 |
| 962 xr_rr_rtt_ms_ = std::max<int64_t>(rtt, 1); | 954 xr_rr_rtt_ms_ = std::max<int64_t>(rtt, 1); |
| 963 | 955 |
| 964 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrDlrrReportBlock; | 956 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrDlrrReportBlock; |
| 965 } | 957 } |
| 966 | 958 |
| 967 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 968 void | 959 void |
| 969 RTCPReceiver::HandleXRVOIPMetric(RTCPUtility::RTCPParserV2& rtcpParser, | 960 RTCPReceiver::HandleXRVOIPMetric(RTCPUtility::RTCPParserV2& rtcpParser, |
| 970 RTCPPacketInformation& rtcpPacketInformation) | 961 RTCPPacketInformation& rtcpPacketInformation) |
| 971 { | 962 { |
| 972 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 963 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
| 973 | 964 |
| 974 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | |
| 975 | |
| 976 if(rtcpPacket.XRVOIPMetricItem.SSRC == main_ssrc_) | 965 if(rtcpPacket.XRVOIPMetricItem.SSRC == main_ssrc_) |
| 977 { | 966 { |
| 978 // Store VoIP metrics block if it's about me | 967 // Store VoIP metrics block if it's about me |
| 979 // from OriginatorSSRC do we filter it? | 968 // from OriginatorSSRC do we filter it? |
| 980 // rtcpPacket.XR.OriginatorSSRC; | 969 // rtcpPacket.XR.OriginatorSSRC; |
| 981 | 970 |
| 982 RTCPVoIPMetric receivedVoIPMetrics; | 971 RTCPVoIPMetric receivedVoIPMetrics; |
| 983 receivedVoIPMetrics.burstDensity = rtcpPacket.XRVOIPMetricItem.burstDens
ity; | 972 receivedVoIPMetrics.burstDensity = rtcpPacket.XRVOIPMetricItem.burstDens
ity; |
| 984 receivedVoIPMetrics.burstDuration = rtcpPacket.XRVOIPMetricItem.burstDur
ation; | 973 receivedVoIPMetrics.burstDuration = rtcpPacket.XRVOIPMetricItem.burstDur
ation; |
| 985 receivedVoIPMetrics.discardRate = rtcpPacket.XRVOIPMetricItem.discardRat
e; | 974 receivedVoIPMetrics.discardRate = rtcpPacket.XRVOIPMetricItem.discardRat
e; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1001 receivedVoIPMetrics.RXconfig = rtcpPacket.XRVOIPMetricItem.RXconfig; | 990 receivedVoIPMetrics.RXconfig = rtcpPacket.XRVOIPMetricItem.RXconfig; |
| 1002 receivedVoIPMetrics.signalLevel = rtcpPacket.XRVOIPMetricItem.signalLeve
l; | 991 receivedVoIPMetrics.signalLevel = rtcpPacket.XRVOIPMetricItem.signalLeve
l; |
| 1003 | 992 |
| 1004 rtcpPacketInformation.AddVoIPMetric(&receivedVoIPMetrics); | 993 rtcpPacketInformation.AddVoIPMetric(&receivedVoIPMetrics); |
| 1005 | 994 |
| 1006 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrVoipMetric; // recei
ved signal | 995 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrVoipMetric; // recei
ved signal |
| 1007 } | 996 } |
| 1008 rtcpParser.Iterate(); | 997 rtcpParser.Iterate(); |
| 1009 } | 998 } |
| 1010 | 999 |
| 1011 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 1012 void RTCPReceiver::HandlePLI(RTCPUtility::RTCPParserV2& rtcpParser, | 1000 void RTCPReceiver::HandlePLI(RTCPUtility::RTCPParserV2& rtcpParser, |
| 1013 RTCPPacketInformation& rtcpPacketInformation) { | 1001 RTCPPacketInformation& rtcpPacketInformation) { |
| 1014 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 1002 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
| 1015 if (main_ssrc_ == rtcpPacket.PLI.MediaSSRC) { | 1003 if (main_ssrc_ == rtcpPacket.PLI.MediaSSRC) { |
| 1016 TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PLI"); | 1004 TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PLI"); |
| 1017 | 1005 |
| 1018 ++packet_type_counter_.pli_packets; | 1006 ++packet_type_counter_.pli_packets; |
| 1019 // Received a signal that we need to send a new key frame. | 1007 // Received a signal that we need to send a new key frame. |
| 1020 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpPli; | 1008 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpPli; |
| 1021 } | 1009 } |
| 1022 rtcpParser.Iterate(); | 1010 rtcpParser.Iterate(); |
| 1023 } | 1011 } |
| 1024 | 1012 |
| 1025 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 1026 void RTCPReceiver::HandleTMMBR(RTCPUtility::RTCPParserV2& rtcpParser, | 1013 void RTCPReceiver::HandleTMMBR(RTCPUtility::RTCPParserV2& rtcpParser, |
| 1027 RTCPPacketInformation& rtcpPacketInformation) { | 1014 RTCPPacketInformation& rtcpPacketInformation) { |
| 1028 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 1015 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
| 1029 | 1016 |
| 1030 uint32_t senderSSRC = rtcpPacket.TMMBR.SenderSSRC; | 1017 uint32_t senderSSRC = rtcpPacket.TMMBR.SenderSSRC; |
| 1031 RTCPReceiveInformation* ptrReceiveInfo = GetReceiveInformation(senderSSRC); | 1018 RTCPReceiveInformation* ptrReceiveInfo = GetReceiveInformation(senderSSRC); |
| 1032 if (ptrReceiveInfo == NULL) { | 1019 if (ptrReceiveInfo == NULL) { |
| 1033 // This remote SSRC must be saved before. | 1020 // This remote SSRC must be saved before. |
| 1034 rtcpParser.Iterate(); | 1021 rtcpParser.Iterate(); |
| 1035 return; | 1022 return; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1052 } | 1039 } |
| 1053 ptrReceiveInfo->VerifyAndAllocateTMMBRSet((uint32_t)maxNumOfTMMBRBlocks); | 1040 ptrReceiveInfo->VerifyAndAllocateTMMBRSet((uint32_t)maxNumOfTMMBRBlocks); |
| 1054 | 1041 |
| 1055 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); | 1042 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); |
| 1056 while (pktType == RTCPPacketTypes::kRtpfbTmmbrItem) { | 1043 while (pktType == RTCPPacketTypes::kRtpfbTmmbrItem) { |
| 1057 HandleTMMBRItem(*ptrReceiveInfo, rtcpPacket, rtcpPacketInformation, senderSS
RC); | 1044 HandleTMMBRItem(*ptrReceiveInfo, rtcpPacket, rtcpPacketInformation, senderSS
RC); |
| 1058 pktType = rtcpParser.Iterate(); | 1045 pktType = rtcpParser.Iterate(); |
| 1059 } | 1046 } |
| 1060 } | 1047 } |
| 1061 | 1048 |
| 1062 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 1063 void RTCPReceiver::HandleTMMBRItem(RTCPReceiveInformation& receiveInfo, | 1049 void RTCPReceiver::HandleTMMBRItem(RTCPReceiveInformation& receiveInfo, |
| 1064 const RTCPUtility::RTCPPacket& rtcpPacket, | 1050 const RTCPUtility::RTCPPacket& rtcpPacket, |
| 1065 RTCPPacketInformation& rtcpPacketInformation, | 1051 RTCPPacketInformation& rtcpPacketInformation, |
| 1066 uint32_t senderSSRC) { | 1052 uint32_t senderSSRC) { |
| 1067 if (main_ssrc_ == rtcpPacket.TMMBRItem.SSRC && | 1053 if (main_ssrc_ == rtcpPacket.TMMBRItem.SSRC && |
| 1068 rtcpPacket.TMMBRItem.MaxTotalMediaBitRate > 0) { | 1054 rtcpPacket.TMMBRItem.MaxTotalMediaBitRate > 0) { |
| 1069 receiveInfo.InsertTMMBRItem(senderSSRC, rtcpPacket.TMMBRItem, | 1055 receiveInfo.InsertTMMBRItem(senderSSRC, rtcpPacket.TMMBRItem, |
| 1070 _clock->TimeInMilliseconds()); | 1056 _clock->TimeInMilliseconds()); |
| 1071 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTmmbr; | 1057 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTmmbr; |
| 1072 } | 1058 } |
| 1073 } | 1059 } |
| 1074 | 1060 |
| 1075 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 1076 void RTCPReceiver::HandleTMMBN(RTCPUtility::RTCPParserV2& rtcpParser, | 1061 void RTCPReceiver::HandleTMMBN(RTCPUtility::RTCPParserV2& rtcpParser, |
| 1077 RTCPPacketInformation& rtcpPacketInformation) { | 1062 RTCPPacketInformation& rtcpPacketInformation) { |
| 1078 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 1063 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
| 1079 RTCPReceiveInformation* ptrReceiveInfo = GetReceiveInformation( | 1064 RTCPReceiveInformation* ptrReceiveInfo = GetReceiveInformation( |
| 1080 rtcpPacket.TMMBN.SenderSSRC); | 1065 rtcpPacket.TMMBN.SenderSSRC); |
| 1081 if (ptrReceiveInfo == NULL) { | 1066 if (ptrReceiveInfo == NULL) { |
| 1082 // This remote SSRC must be saved before. | 1067 // This remote SSRC must be saved before. |
| 1083 rtcpParser.Iterate(); | 1068 rtcpParser.Iterate(); |
| 1084 return; | 1069 return; |
| 1085 } | 1070 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1097 | 1082 |
| 1098 ptrReceiveInfo->VerifyAndAllocateBoundingSet((uint32_t)maxNumOfTMMBNBlocks); | 1083 ptrReceiveInfo->VerifyAndAllocateBoundingSet((uint32_t)maxNumOfTMMBNBlocks); |
| 1099 | 1084 |
| 1100 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); | 1085 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); |
| 1101 while (pktType == RTCPPacketTypes::kRtpfbTmmbnItem) { | 1086 while (pktType == RTCPPacketTypes::kRtpfbTmmbnItem) { |
| 1102 HandleTMMBNItem(*ptrReceiveInfo, rtcpPacket); | 1087 HandleTMMBNItem(*ptrReceiveInfo, rtcpPacket); |
| 1103 pktType = rtcpParser.Iterate(); | 1088 pktType = rtcpParser.Iterate(); |
| 1104 } | 1089 } |
| 1105 } | 1090 } |
| 1106 | 1091 |
| 1107 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 1108 void RTCPReceiver::HandleSR_REQ(RTCPUtility::RTCPParserV2& rtcpParser, | 1092 void RTCPReceiver::HandleSR_REQ(RTCPUtility::RTCPParserV2& rtcpParser, |
| 1109 RTCPPacketInformation& rtcpPacketInformation) { | 1093 RTCPPacketInformation& rtcpPacketInformation) { |
| 1110 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSrReq; | 1094 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSrReq; |
| 1111 rtcpParser.Iterate(); | 1095 rtcpParser.Iterate(); |
| 1112 } | 1096 } |
| 1113 | 1097 |
| 1114 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 1115 void RTCPReceiver::HandleTMMBNItem(RTCPReceiveInformation& receiveInfo, | 1098 void RTCPReceiver::HandleTMMBNItem(RTCPReceiveInformation& receiveInfo, |
| 1116 const RTCPUtility::RTCPPacket& rtcpPacket) { | 1099 const RTCPUtility::RTCPPacket& rtcpPacket) { |
| 1117 receiveInfo.TmmbnBoundingSet.AddEntry( | 1100 receiveInfo.TmmbnBoundingSet.AddEntry( |
| 1118 rtcpPacket.TMMBNItem.MaxTotalMediaBitRate, | 1101 rtcpPacket.TMMBNItem.MaxTotalMediaBitRate, |
| 1119 rtcpPacket.TMMBNItem.MeasuredOverhead, | 1102 rtcpPacket.TMMBNItem.MeasuredOverhead, |
| 1120 rtcpPacket.TMMBNItem.SSRC); | 1103 rtcpPacket.TMMBNItem.SSRC); |
| 1121 } | 1104 } |
| 1122 | 1105 |
| 1123 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 1124 void RTCPReceiver::HandleSLI(RTCPUtility::RTCPParserV2& rtcpParser, | 1106 void RTCPReceiver::HandleSLI(RTCPUtility::RTCPParserV2& rtcpParser, |
| 1125 RTCPPacketInformation& rtcpPacketInformation) { | 1107 RTCPPacketInformation& rtcpPacketInformation) { |
| 1126 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 1108 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
| 1127 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); | 1109 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); |
| 1128 while (pktType == RTCPPacketTypes::kPsfbSliItem) { | 1110 while (pktType == RTCPPacketTypes::kPsfbSliItem) { |
| 1129 HandleSLIItem(rtcpPacket, rtcpPacketInformation); | 1111 HandleSLIItem(rtcpPacket, rtcpPacketInformation); |
| 1130 pktType = rtcpParser.Iterate(); | 1112 pktType = rtcpParser.Iterate(); |
| 1131 } | 1113 } |
| 1132 } | 1114 } |
| 1133 | 1115 |
| 1134 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 1135 void RTCPReceiver::HandleSLIItem(const RTCPUtility::RTCPPacket& rtcpPacket, | 1116 void RTCPReceiver::HandleSLIItem(const RTCPUtility::RTCPPacket& rtcpPacket, |
| 1136 RTCPPacketInformation& rtcpPacketInformation) { | 1117 RTCPPacketInformation& rtcpPacketInformation) { |
| 1137 // in theory there could be multiple slices lost | 1118 // in theory there could be multiple slices lost |
| 1138 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSli; // received signal that
we need to refresh a slice | 1119 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSli; // received signal that
we need to refresh a slice |
| 1139 rtcpPacketInformation.sliPictureId = rtcpPacket.SLIItem.PictureId; | 1120 rtcpPacketInformation.sliPictureId = rtcpPacket.SLIItem.PictureId; |
| 1140 } | 1121 } |
| 1141 | 1122 |
| 1142 void | 1123 void |
| 1143 RTCPReceiver::HandleRPSI(RTCPUtility::RTCPParserV2& rtcpParser, | 1124 RTCPReceiver::HandleRPSI(RTCPUtility::RTCPParserV2& rtcpParser, |
| 1144 RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) | 1125 RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1160 uint8_t numberOfBytes = rtcpPacket.RPSI.NumberOfValidBits /8; | 1141 uint8_t numberOfBytes = rtcpPacket.RPSI.NumberOfValidBits /8; |
| 1161 for(uint8_t n = 0; n < (numberOfBytes-1); n++) | 1142 for(uint8_t n = 0; n < (numberOfBytes-1); n++) |
| 1162 { | 1143 { |
| 1163 rtcpPacketInformation.rpsiPictureId += (rtcpPacket.RPSI.NativeBitStr
ing[n] & 0x7f); | 1144 rtcpPacketInformation.rpsiPictureId += (rtcpPacket.RPSI.NativeBitStr
ing[n] & 0x7f); |
| 1164 rtcpPacketInformation.rpsiPictureId <<= 7; // prepare next | 1145 rtcpPacketInformation.rpsiPictureId <<= 7; // prepare next |
| 1165 } | 1146 } |
| 1166 rtcpPacketInformation.rpsiPictureId += (rtcpPacket.RPSI.NativeBitString[
numberOfBytes-1] & 0x7f); | 1147 rtcpPacketInformation.rpsiPictureId += (rtcpPacket.RPSI.NativeBitString[
numberOfBytes-1] & 0x7f); |
| 1167 } | 1148 } |
| 1168 } | 1149 } |
| 1169 | 1150 |
| 1170 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 1171 void RTCPReceiver::HandlePsfbApp(RTCPUtility::RTCPParserV2& rtcpParser, | 1151 void RTCPReceiver::HandlePsfbApp(RTCPUtility::RTCPParserV2& rtcpParser, |
| 1172 RTCPPacketInformation& rtcpPacketInformation) { | 1152 RTCPPacketInformation& rtcpPacketInformation) { |
| 1173 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); | 1153 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); |
| 1174 if (pktType == RTCPPacketTypes::kPsfbRemb) { | 1154 if (pktType == RTCPPacketTypes::kPsfbRemb) { |
| 1175 pktType = rtcpParser.Iterate(); | 1155 pktType = rtcpParser.Iterate(); |
| 1176 if (pktType == RTCPPacketTypes::kPsfbRembItem) { | 1156 if (pktType == RTCPPacketTypes::kPsfbRembItem) { |
| 1177 HandleREMBItem(rtcpParser, rtcpPacketInformation); | 1157 HandleREMBItem(rtcpParser, rtcpPacketInformation); |
| 1178 rtcpParser.Iterate(); | 1158 rtcpParser.Iterate(); |
| 1179 } | 1159 } |
| 1180 } | 1160 } |
| 1181 } | 1161 } |
| 1182 | 1162 |
| 1183 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 1184 void RTCPReceiver::HandleIJ(RTCPUtility::RTCPParserV2& rtcpParser, | 1163 void RTCPReceiver::HandleIJ(RTCPUtility::RTCPParserV2& rtcpParser, |
| 1185 RTCPPacketInformation& rtcpPacketInformation) { | 1164 RTCPPacketInformation& rtcpPacketInformation) { |
| 1186 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 1165 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
| 1187 | 1166 |
| 1188 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); | 1167 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); |
| 1189 while (pktType == RTCPPacketTypes::kExtendedIjItem) { | 1168 while (pktType == RTCPPacketTypes::kExtendedIjItem) { |
| 1190 HandleIJItem(rtcpPacket, rtcpPacketInformation); | 1169 HandleIJItem(rtcpPacket, rtcpPacketInformation); |
| 1191 pktType = rtcpParser.Iterate(); | 1170 pktType = rtcpParser.Iterate(); |
| 1192 } | 1171 } |
| 1193 } | 1172 } |
| 1194 | 1173 |
| 1195 void RTCPReceiver::HandleIJItem(const RTCPUtility::RTCPPacket& rtcpPacket, | 1174 void RTCPReceiver::HandleIJItem(const RTCPUtility::RTCPPacket& rtcpPacket, |
| 1196 RTCPPacketInformation& rtcpPacketInformation) { | 1175 RTCPPacketInformation& rtcpPacketInformation) { |
| 1197 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTransmissionTimeOffset; | 1176 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTransmissionTimeOffset; |
| 1198 rtcpPacketInformation.interArrivalJitter = | 1177 rtcpPacketInformation.interArrivalJitter = |
| 1199 rtcpPacket.ExtendedJitterReportItem.Jitter; | 1178 rtcpPacket.ExtendedJitterReportItem.Jitter; |
| 1200 } | 1179 } |
| 1201 | 1180 |
| 1202 void RTCPReceiver::HandleREMBItem( | 1181 void RTCPReceiver::HandleREMBItem( |
| 1203 RTCPUtility::RTCPParserV2& rtcpParser, | 1182 RTCPUtility::RTCPParserV2& rtcpParser, |
| 1204 RTCPPacketInformation& rtcpPacketInformation) { | 1183 RTCPPacketInformation& rtcpPacketInformation) { |
| 1205 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 1184 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
| 1206 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRemb; | 1185 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRemb; |
| 1207 rtcpPacketInformation.receiverEstimatedMaxBitrate = | 1186 rtcpPacketInformation.receiverEstimatedMaxBitrate = |
| 1208 rtcpPacket.REMBItem.BitRate; | 1187 rtcpPacket.REMBItem.BitRate; |
| 1209 } | 1188 } |
| 1210 | 1189 |
| 1211 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 1212 void RTCPReceiver::HandleFIR(RTCPUtility::RTCPParserV2& rtcpParser, | 1190 void RTCPReceiver::HandleFIR(RTCPUtility::RTCPParserV2& rtcpParser, |
| 1213 RTCPPacketInformation& rtcpPacketInformation) { | 1191 RTCPPacketInformation& rtcpPacketInformation) { |
| 1214 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); | 1192 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); |
| 1215 RTCPReceiveInformation* ptrReceiveInfo = | 1193 RTCPReceiveInformation* ptrReceiveInfo = |
| 1216 GetReceiveInformation(rtcpPacket.FIR.SenderSSRC); | 1194 GetReceiveInformation(rtcpPacket.FIR.SenderSSRC); |
| 1217 | 1195 |
| 1218 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); | 1196 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); |
| 1219 while (pktType == RTCPPacketTypes::kPsfbFirItem) { | 1197 while (pktType == RTCPPacketTypes::kPsfbFirItem) { |
| 1220 HandleFIRItem(ptrReceiveInfo, rtcpPacket, rtcpPacketInformation); | 1198 HandleFIRItem(ptrReceiveInfo, rtcpPacket, rtcpPacketInformation); |
| 1221 pktType = rtcpParser.Iterate(); | 1199 pktType = rtcpParser.Iterate(); |
| 1222 } | 1200 } |
| 1223 } | 1201 } |
| 1224 | 1202 |
| 1225 // no need for critsect we have _criticalSectionRTCPReceiver | |
| 1226 void RTCPReceiver::HandleFIRItem(RTCPReceiveInformation* receiveInfo, | 1203 void RTCPReceiver::HandleFIRItem(RTCPReceiveInformation* receiveInfo, |
| 1227 const RTCPUtility::RTCPPacket& rtcpPacket, | 1204 const RTCPUtility::RTCPPacket& rtcpPacket, |
| 1228 RTCPPacketInformation& rtcpPacketInformation) { | 1205 RTCPPacketInformation& rtcpPacketInformation) { |
| 1229 // Is it our sender that is requested to generate a new keyframe | 1206 // Is it our sender that is requested to generate a new keyframe |
| 1230 if (main_ssrc_ != rtcpPacket.FIRItem.SSRC) { | 1207 if (main_ssrc_ != rtcpPacket.FIRItem.SSRC) { |
| 1231 return; | 1208 return; |
| 1232 } | 1209 } |
| 1233 | 1210 |
| 1234 ++packet_type_counter_.fir_packets; | 1211 ++packet_type_counter_.fir_packets; |
| 1235 | 1212 |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1341 | 1318 |
| 1342 // Holding no Critical section | 1319 // Holding no Critical section |
| 1343 void RTCPReceiver::TriggerCallbacksFromRTCPPacket( | 1320 void RTCPReceiver::TriggerCallbacksFromRTCPPacket( |
| 1344 RTCPPacketInformation& rtcpPacketInformation) { | 1321 RTCPPacketInformation& rtcpPacketInformation) { |
| 1345 // Process TMMBR and REMB first to avoid multiple callbacks | 1322 // Process TMMBR and REMB first to avoid multiple callbacks |
| 1346 // to OnNetworkChanged. | 1323 // to OnNetworkChanged. |
| 1347 if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpTmmbr) { | 1324 if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpTmmbr) { |
| 1348 // Might trigger a OnReceivedBandwidthEstimateUpdate. | 1325 // Might trigger a OnReceivedBandwidthEstimateUpdate. |
| 1349 UpdateTMMBR(); | 1326 UpdateTMMBR(); |
| 1350 } | 1327 } |
| 1351 unsigned int local_ssrc; | 1328 uint32_t local_ssrc; |
| 1329 std::set<uint32_t> registered_ssrcs; |
| 1352 { | 1330 { |
| 1353 // We don't want to hold this critsect when triggering the callbacks below. | 1331 // We don't want to hold this critsect when triggering the callbacks below. |
| 1354 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); | 1332 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); |
| 1355 local_ssrc = main_ssrc_; | 1333 local_ssrc = main_ssrc_; |
| 1334 registered_ssrcs = registered_ssrcs_; |
| 1356 } | 1335 } |
| 1357 if (!receiver_only_ && | 1336 if (!receiver_only_ && |
| 1358 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq)) { | 1337 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq)) { |
| 1359 _rtpRtcp.OnRequestSendReport(); | 1338 _rtpRtcp.OnRequestSendReport(); |
| 1360 } | 1339 } |
| 1361 if (!receiver_only_ && | 1340 if (!receiver_only_ && |
| 1362 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack)) { | 1341 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack)) { |
| 1363 if (rtcpPacketInformation.nackSequenceNumbers.size() > 0) { | 1342 if (rtcpPacketInformation.nackSequenceNumbers.size() > 0) { |
| 1364 LOG(LS_VERBOSE) << "Incoming NACK length: " | 1343 LOG(LS_VERBOSE) << "Incoming NACK length: " |
| 1365 << rtcpPacketInformation.nackSequenceNumbers.size(); | 1344 << rtcpPacketInformation.nackSequenceNumbers.size(); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1407 _cbRtcpBandwidthObserver->OnReceivedRtcpReceiverReport( | 1386 _cbRtcpBandwidthObserver->OnReceivedRtcpReceiverReport( |
| 1408 rtcpPacketInformation.report_blocks, | 1387 rtcpPacketInformation.report_blocks, |
| 1409 rtcpPacketInformation.rtt, | 1388 rtcpPacketInformation.rtt, |
| 1410 now); | 1389 now); |
| 1411 } | 1390 } |
| 1412 } | 1391 } |
| 1413 if (_cbTransportFeedbackObserver && | 1392 if (_cbTransportFeedbackObserver && |
| 1414 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpTransportFeedback)) { | 1393 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpTransportFeedback)) { |
| 1415 uint32_t media_source_ssrc = | 1394 uint32_t media_source_ssrc = |
| 1416 rtcpPacketInformation.transport_feedback_->GetMediaSourceSsrc(); | 1395 rtcpPacketInformation.transport_feedback_->GetMediaSourceSsrc(); |
| 1417 if (media_source_ssrc == main_ssrc_ || | 1396 if (media_source_ssrc == local_ssrc || |
| 1418 registered_ssrcs_.find(media_source_ssrc) != | 1397 registered_ssrcs.find(media_source_ssrc) != registered_ssrcs.end()) { |
| 1419 registered_ssrcs_.end()) { | |
| 1420 _cbTransportFeedbackObserver->OnTransportFeedback( | 1398 _cbTransportFeedbackObserver->OnTransportFeedback( |
| 1421 *rtcpPacketInformation.transport_feedback_.get()); | 1399 *rtcpPacketInformation.transport_feedback_.get()); |
| 1422 } | 1400 } |
| 1423 } | 1401 } |
| 1424 } | 1402 } |
| 1425 | 1403 |
| 1426 if (!receiver_only_) { | 1404 if (!receiver_only_) { |
| 1427 CriticalSectionScoped cs(_criticalSectionFeedbacks); | 1405 CriticalSectionScoped cs(_criticalSectionFeedbacks); |
| 1428 if (stats_callback_) { | 1406 if (stats_callback_) { |
| 1429 for (ReportBlockList::const_iterator it = | 1407 for (ReportBlockList::const_iterator it = |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1490 return -1; | 1468 return -1; |
| 1491 } | 1469 } |
| 1492 num += receiveInfo->TmmbrSet.lengthOfSet(); | 1470 num += receiveInfo->TmmbrSet.lengthOfSet(); |
| 1493 receiveInfoIt++; | 1471 receiveInfoIt++; |
| 1494 } | 1472 } |
| 1495 } | 1473 } |
| 1496 return num; | 1474 return num; |
| 1497 } | 1475 } |
| 1498 | 1476 |
| 1499 } // namespace webrtc | 1477 } // namespace webrtc |
| OLD | NEW |