Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Side by Side Diff: webrtc/video/vie_channel.cc

Issue 1669623004: Use CallStats for RTT in Call, rather than VideoSendStream::GetRtt() (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Addressed comment, rebase Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/video/vie_channel.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 14 matching lines...) Expand all
25 #include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h" 25 #include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h"
26 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" 26 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
27 #include "webrtc/modules/utility/include/process_thread.h" 27 #include "webrtc/modules/utility/include/process_thread.h"
28 #include "webrtc/modules/video_coding/include/video_coding.h" 28 #include "webrtc/modules/video_coding/include/video_coding.h"
29 #include "webrtc/modules/video_processing/include/video_processing.h" 29 #include "webrtc/modules/video_processing/include/video_processing.h"
30 #include "webrtc/modules/video_render/video_render_defines.h" 30 #include "webrtc/modules/video_render/video_render_defines.h"
31 #include "webrtc/system_wrappers/include/metrics.h" 31 #include "webrtc/system_wrappers/include/metrics.h"
32 #include "webrtc/video/call_stats.h" 32 #include "webrtc/video/call_stats.h"
33 #include "webrtc/video/payload_router.h" 33 #include "webrtc/video/payload_router.h"
34 #include "webrtc/video/receive_statistics_proxy.h" 34 #include "webrtc/video/receive_statistics_proxy.h"
35 #include "webrtc/video/report_block_stats.h"
36 35
37 namespace webrtc { 36 namespace webrtc {
38 37
39 static const int kMaxTargetDelayMs = 10000; 38 static const int kMaxTargetDelayMs = 10000;
40 const int kMinSendSidePacketHistorySize = 600; 39 const int kMinSendSidePacketHistorySize = 600;
41 const int kMaxPacketAgeToNack = 450; 40 const int kMaxPacketAgeToNack = 450;
42 const int kMaxNackListSize = 250; 41 const int kMaxNackListSize = 250;
43 42
44 // Helper class receiving statistics callbacks. 43 // Helper class receiving statistics callbacks.
45 class ChannelStatsObserver : public CallStatsObserver { 44 class ChannelStatsObserver : public CallStatsObserver {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 incoming_video_stream_(nullptr), 99 incoming_video_stream_(nullptr),
101 intra_frame_observer_(intra_frame_observer), 100 intra_frame_observer_(intra_frame_observer),
102 rtt_stats_(rtt_stats), 101 rtt_stats_(rtt_stats),
103 paced_sender_(paced_sender), 102 paced_sender_(paced_sender),
104 packet_router_(packet_router), 103 packet_router_(packet_router),
105 bandwidth_observer_(bandwidth_observer), 104 bandwidth_observer_(bandwidth_observer),
106 transport_feedback_observer_(transport_feedback_observer), 105 transport_feedback_observer_(transport_feedback_observer),
107 nack_history_size_sender_(kMinSendSidePacketHistorySize), 106 nack_history_size_sender_(kMinSendSidePacketHistorySize),
108 max_nack_reordering_threshold_(kMaxPacketAgeToNack), 107 max_nack_reordering_threshold_(kMaxPacketAgeToNack),
109 pre_render_callback_(NULL), 108 pre_render_callback_(NULL),
110 report_block_stats_sender_(new ReportBlockStats()),
111 time_of_first_rtt_ms_(-1),
112 rtt_sum_ms_(0),
113 last_rtt_ms_(0), 109 last_rtt_ms_(0),
114 num_rtts_(0),
115 rtp_rtcp_modules_( 110 rtp_rtcp_modules_(
116 CreateRtpRtcpModules(!sender, 111 CreateRtpRtcpModules(!sender,
117 vie_receiver_.GetReceiveStatistics(), 112 vie_receiver_.GetReceiveStatistics(),
118 transport, 113 transport,
119 intra_frame_observer_, 114 intra_frame_observer_,
120 bandwidth_observer_.get(), 115 bandwidth_observer_.get(),
121 transport_feedback_observer_, 116 transport_feedback_observer_,
122 rtt_stats_, 117 rtt_stats_,
123 &rtcp_packet_type_counter_observer_, 118 &rtcp_packet_type_counter_observer_,
124 remote_bitrate_estimator, 119 remote_bitrate_estimator,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 packet_router_->RemoveRtpModule(rtp_rtcp_modules_[i], sender_); 176 packet_router_->RemoveRtpModule(rtp_rtcp_modules_[i], sender_);
182 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { 177 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
183 module_process_thread_->DeRegisterModule(rtp_rtcp); 178 module_process_thread_->DeRegisterModule(rtp_rtcp);
184 delete rtp_rtcp; 179 delete rtp_rtcp;
185 } 180 }
186 } 181 }
187 182
188 void ViEChannel::UpdateHistograms() { 183 void ViEChannel::UpdateHistograms() {
189 int64_t now = Clock::GetRealTimeClock()->TimeInMilliseconds(); 184 int64_t now = Clock::GetRealTimeClock()->TimeInMilliseconds();
190 185
191 {
192 rtc::CritScope lock(&crit_);
193 int64_t elapsed_sec = (now - time_of_first_rtt_ms_) / 1000;
194 if (time_of_first_rtt_ms_ != -1 && num_rtts_ > 0 &&
195 elapsed_sec > metrics::kMinRunTimeInSeconds) {
196 int64_t avg_rtt_ms = (rtt_sum_ms_ + num_rtts_ / 2) / num_rtts_;
197 RTC_HISTOGRAM_COUNTS_10000(
198 "WebRTC.Video.AverageRoundTripTimeInMilliseconds", avg_rtt_ms);
199 }
200 }
201
202 if (sender_) { 186 if (sender_) {
203 RtcpPacketTypeCounter rtcp_counter; 187 RtcpPacketTypeCounter rtcp_counter;
204 GetSendRtcpPacketTypeCounter(&rtcp_counter); 188 GetSendRtcpPacketTypeCounter(&rtcp_counter);
205 int64_t elapsed_sec = rtcp_counter.TimeSinceFirstPacketInMs(now) / 1000; 189 int64_t elapsed_sec = rtcp_counter.TimeSinceFirstPacketInMs(now) / 1000;
206 if (elapsed_sec > metrics::kMinRunTimeInSeconds) { 190 if (elapsed_sec > metrics::kMinRunTimeInSeconds) {
207 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.NackPacketsReceivedPerMinute", 191 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.NackPacketsReceivedPerMinute",
208 rtcp_counter.nack_packets * 60 / elapsed_sec); 192 rtcp_counter.nack_packets * 60 / elapsed_sec);
209 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.FirPacketsReceivedPerMinute", 193 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.FirPacketsReceivedPerMinute",
210 rtcp_counter.fir_packets * 60 / elapsed_sec); 194 rtcp_counter.fir_packets * 60 / elapsed_sec);
211 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.PliPacketsReceivedPerMinute", 195 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.PliPacketsReceivedPerMinute",
212 rtcp_counter.pli_packets * 60 / elapsed_sec); 196 rtcp_counter.pli_packets * 60 / elapsed_sec);
213 if (rtcp_counter.nack_requests > 0) { 197 if (rtcp_counter.nack_requests > 0) {
214 RTC_HISTOGRAM_PERCENTAGE( 198 RTC_HISTOGRAM_PERCENTAGE(
215 "WebRTC.Video.UniqueNackRequestsReceivedInPercent", 199 "WebRTC.Video.UniqueNackRequestsReceivedInPercent",
216 rtcp_counter.UniqueNackRequestsInPercent()); 200 rtcp_counter.UniqueNackRequestsInPercent());
217 } 201 }
218 int fraction_lost = report_block_stats_sender_->FractionLostInPercent();
219 if (fraction_lost != -1) {
220 RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.SentPacketsLostInPercent",
221 fraction_lost);
222 }
223 } 202 }
224 203
225 StreamDataCounters rtp; 204 StreamDataCounters rtp;
226 StreamDataCounters rtx; 205 StreamDataCounters rtx;
227 GetSendStreamDataCounters(&rtp, &rtx); 206 GetSendStreamDataCounters(&rtp, &rtx);
228 StreamDataCounters rtp_rtx = rtp; 207 StreamDataCounters rtp_rtx = rtp;
229 rtp_rtx.Add(rtx); 208 rtp_rtx.Add(rtx);
230 elapsed_sec = rtp_rtx.TimeSinceFirstPacketInMs( 209 elapsed_sec = rtp_rtx.TimeSinceFirstPacketInMs(
231 Clock::GetRealTimeClock()->TimeInMilliseconds()) / 210 Clock::GetRealTimeClock()->TimeInMilliseconds()) /
232 1000; 211 1000;
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 int32_t ViEChannel::SetRTCPCName(const char* rtcp_cname) { 617 int32_t ViEChannel::SetRTCPCName(const char* rtcp_cname) {
639 RTC_DCHECK(!rtp_rtcp_modules_[0]->Sending()); 618 RTC_DCHECK(!rtp_rtcp_modules_[0]->Sending());
640 return rtp_rtcp_modules_[0]->SetCNAME(rtcp_cname); 619 return rtp_rtcp_modules_[0]->SetCNAME(rtcp_cname);
641 } 620 }
642 621
643 int32_t ViEChannel::GetRemoteRTCPCName(char rtcp_cname[]) { 622 int32_t ViEChannel::GetRemoteRTCPCName(char rtcp_cname[]) {
644 uint32_t remoteSSRC = vie_receiver_.GetRemoteSsrc(); 623 uint32_t remoteSSRC = vie_receiver_.GetRemoteSsrc();
645 return rtp_rtcp_modules_[0]->RemoteCNAME(remoteSSRC, rtcp_cname); 624 return rtp_rtcp_modules_[0]->RemoteCNAME(remoteSSRC, rtcp_cname);
646 } 625 }
647 626
648 int32_t ViEChannel::GetSendRtcpStatistics(uint16_t* fraction_lost,
649 uint32_t* cumulative_lost,
650 uint32_t* extended_max,
651 uint32_t* jitter_samples,
652 int64_t* rtt_ms) const {
653 // Aggregate the report blocks associated with streams sent on this channel.
654 std::vector<RTCPReportBlock> report_blocks;
655 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
656 rtp_rtcp->RemoteRTCPStat(&report_blocks);
657
658 if (report_blocks.empty())
659 return -1;
660
661 uint32_t remote_ssrc = vie_receiver_.GetRemoteSsrc();
662 std::vector<RTCPReportBlock>::const_iterator it = report_blocks.begin();
663 for (; it != report_blocks.end(); ++it) {
664 if (it->remoteSSRC == remote_ssrc)
665 break;
666 }
667 if (it == report_blocks.end()) {
668 // We have not received packets with an SSRC matching the report blocks. To
669 // have a chance of calculating an RTT we will try with the SSRC of the
670 // first report block received.
671 // This is very important for send-only channels where we don't know the
672 // SSRC of the other end.
673 remote_ssrc = report_blocks[0].remoteSSRC;
674 }
675
676 // TODO(asapersson): Change report_block_stats to not rely on
677 // GetSendRtcpStatistics to be called.
678 RTCPReportBlock report =
679 report_block_stats_sender_->AggregateAndStore(report_blocks);
680 *fraction_lost = report.fractionLost;
681 *cumulative_lost = report.cumulativeLost;
682 *extended_max = report.extendedHighSeqNum;
683 *jitter_samples = report.jitter;
684
685 int64_t dummy;
686 int64_t rtt = 0;
687 if (rtp_rtcp_modules_[0]->RTT(remote_ssrc, &rtt, &dummy, &dummy, &dummy) !=
688 0) {
689 return -1;
690 }
691 *rtt_ms = rtt;
692 return 0;
693 }
694
695 void ViEChannel::RegisterSendChannelRtcpStatisticsCallback( 627 void ViEChannel::RegisterSendChannelRtcpStatisticsCallback(
696 RtcpStatisticsCallback* callback) { 628 RtcpStatisticsCallback* callback) {
697 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) 629 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
698 rtp_rtcp->RegisterRtcpStatisticsCallback(callback); 630 rtp_rtcp->RegisterRtcpStatisticsCallback(callback);
699 } 631 }
700 632
701 void ViEChannel::RegisterRtcpPacketTypeCounterObserver( 633 void ViEChannel::RegisterRtcpPacketTypeCounterObserver(
702 RtcpPacketTypeCounterObserver* observer) { 634 RtcpPacketTypeCounterObserver* observer) {
703 rtcp_packet_type_counter_observer_.Set(observer); 635 rtcp_packet_type_counter_observer_.Set(observer);
704 } 636 }
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 int32_t ViEChannel::ResendPackets(const uint16_t* sequence_numbers, 840 int32_t ViEChannel::ResendPackets(const uint16_t* sequence_numbers,
909 uint16_t length) { 841 uint16_t length) {
910 return rtp_rtcp_modules_[0]->SendNACK(sequence_numbers, length); 842 return rtp_rtcp_modules_[0]->SendNACK(sequence_numbers, length);
911 } 843 }
912 844
913 void ViEChannel::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { 845 void ViEChannel::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) {
914 if (!sender_) 846 if (!sender_)
915 vcm_->SetReceiveChannelParameters(max_rtt_ms); 847 vcm_->SetReceiveChannelParameters(max_rtt_ms);
916 848
917 rtc::CritScope lock(&crit_); 849 rtc::CritScope lock(&crit_);
918 if (time_of_first_rtt_ms_ == -1)
919 time_of_first_rtt_ms_ = Clock::GetRealTimeClock()->TimeInMilliseconds();
920 rtt_sum_ms_ += avg_rtt_ms;
921 last_rtt_ms_ = avg_rtt_ms; 850 last_rtt_ms_ = avg_rtt_ms;
922 ++num_rtts_;
923 } 851 }
924 852
925 int ViEChannel::ProtectionRequest(const FecProtectionParams* delta_fec_params, 853 int ViEChannel::ProtectionRequest(const FecProtectionParams* delta_fec_params,
926 const FecProtectionParams* key_fec_params, 854 const FecProtectionParams* key_fec_params,
927 uint32_t* video_rate_bps, 855 uint32_t* video_rate_bps,
928 uint32_t* nack_rate_bps, 856 uint32_t* nack_rate_bps,
929 uint32_t* fec_rate_bps) { 857 uint32_t* fec_rate_bps) {
930 *video_rate_bps = 0; 858 *video_rate_bps = 0;
931 *nack_rate_bps = 0; 859 *nack_rate_bps = 0;
932 *fec_rate_bps = 0; 860 *fec_rate_bps = 0;
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1031 rtc::CritScope lock(&crit_); 959 rtc::CritScope lock(&crit_);
1032 receive_stats_callback_ = receive_statistics_proxy; 960 receive_stats_callback_ = receive_statistics_proxy;
1033 } 961 }
1034 962
1035 void ViEChannel::SetIncomingVideoStream( 963 void ViEChannel::SetIncomingVideoStream(
1036 IncomingVideoStream* incoming_video_stream) { 964 IncomingVideoStream* incoming_video_stream) {
1037 rtc::CritScope lock(&crit_); 965 rtc::CritScope lock(&crit_);
1038 incoming_video_stream_ = incoming_video_stream; 966 incoming_video_stream_ = incoming_video_stream;
1039 } 967 }
1040 } // namespace webrtc 968 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/video/vie_channel.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698