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 16 matching lines...) Expand all Loading... |
27 #include "webrtc/modules/video_coding/main/interface/video_coding.h" | 27 #include "webrtc/modules/video_coding/main/interface/video_coding.h" |
28 #include "webrtc/modules/video_processing/main/interface/video_processing.h" | 28 #include "webrtc/modules/video_processing/main/interface/video_processing.h" |
29 #include "webrtc/modules/video_render/include/video_render_defines.h" | 29 #include "webrtc/modules/video_render/include/video_render_defines.h" |
30 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 30 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
31 #include "webrtc/system_wrappers/include/metrics.h" | 31 #include "webrtc/system_wrappers/include/metrics.h" |
32 #include "webrtc/system_wrappers/include/thread_wrapper.h" | 32 #include "webrtc/system_wrappers/include/thread_wrapper.h" |
33 #include "webrtc/video/receive_statistics_proxy.h" | 33 #include "webrtc/video/receive_statistics_proxy.h" |
34 #include "webrtc/video_engine/call_stats.h" | 34 #include "webrtc/video_engine/call_stats.h" |
35 #include "webrtc/video_engine/payload_router.h" | 35 #include "webrtc/video_engine/payload_router.h" |
36 #include "webrtc/video_engine/report_block_stats.h" | 36 #include "webrtc/video_engine/report_block_stats.h" |
37 #include "webrtc/video_engine/vie_defines.h" | |
38 | 37 |
39 namespace webrtc { | 38 namespace webrtc { |
40 | 39 |
41 const int kMaxDecodeWaitTimeMs = 50; | 40 const int kMaxDecodeWaitTimeMs = 50; |
42 static const int kMaxTargetDelayMs = 10000; | 41 static const int kMaxTargetDelayMs = 10000; |
| 42 const int kMinSendSidePacketHistorySize = 600; |
| 43 const int kMaxPacketAgeToNack = 450; |
| 44 const int kMaxNackListSize = 250; |
43 | 45 |
44 // Helper class receiving statistics callbacks. | 46 // Helper class receiving statistics callbacks. |
45 class ChannelStatsObserver : public CallStatsObserver { | 47 class ChannelStatsObserver : public CallStatsObserver { |
46 public: | 48 public: |
47 explicit ChannelStatsObserver(ViEChannel* owner) : owner_(owner) {} | 49 explicit ChannelStatsObserver(ViEChannel* owner) : owner_(owner) {} |
48 virtual ~ChannelStatsObserver() {} | 50 virtual ~ChannelStatsObserver() {} |
49 | 51 |
50 // Implements StatsObserver. | 52 // Implements StatsObserver. |
51 virtual void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { | 53 virtual void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { |
52 owner_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); | 54 owner_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 vie_sync_(vcm_), | 103 vie_sync_(vcm_), |
102 stats_observer_(new ChannelStatsObserver(this)), | 104 stats_observer_(new ChannelStatsObserver(this)), |
103 receive_stats_callback_(nullptr), | 105 receive_stats_callback_(nullptr), |
104 incoming_video_stream_(nullptr), | 106 incoming_video_stream_(nullptr), |
105 intra_frame_observer_(intra_frame_observer), | 107 intra_frame_observer_(intra_frame_observer), |
106 rtt_stats_(rtt_stats), | 108 rtt_stats_(rtt_stats), |
107 paced_sender_(paced_sender), | 109 paced_sender_(paced_sender), |
108 packet_router_(packet_router), | 110 packet_router_(packet_router), |
109 bandwidth_observer_(bandwidth_observer), | 111 bandwidth_observer_(bandwidth_observer), |
110 transport_feedback_observer_(transport_feedback_observer), | 112 transport_feedback_observer_(transport_feedback_observer), |
111 nack_history_size_sender_(kSendSidePacketHistorySize), | 113 nack_history_size_sender_(kMinSendSidePacketHistorySize), |
112 max_nack_reordering_threshold_(kMaxPacketAgeToNack), | 114 max_nack_reordering_threshold_(kMaxPacketAgeToNack), |
113 pre_render_callback_(NULL), | 115 pre_render_callback_(NULL), |
114 report_block_stats_sender_(new ReportBlockStats()), | 116 report_block_stats_sender_(new ReportBlockStats()), |
115 time_of_first_rtt_ms_(-1), | 117 time_of_first_rtt_ms_(-1), |
116 rtt_sum_ms_(0), | 118 rtt_sum_ms_(0), |
117 last_rtt_ms_(0), | 119 last_rtt_ms_(0), |
118 num_rtts_(0), | 120 num_rtts_(0), |
119 rtp_rtcp_modules_( | 121 rtp_rtcp_modules_( |
120 CreateRtpRtcpModules(!sender, | 122 CreateRtpRtcpModules(!sender, |
121 vie_receiver_.GetReceiveStatistics(), | 123 vie_receiver_.GetReceiveStatistics(), |
122 transport, | 124 transport, |
123 sender ? intra_frame_observer_ : nullptr, | 125 sender ? intra_frame_observer_ : nullptr, |
124 sender ? bandwidth_observer_.get() : nullptr, | 126 sender ? bandwidth_observer_.get() : nullptr, |
125 transport_feedback_observer_, | 127 transport_feedback_observer_, |
126 rtt_stats_, | 128 rtt_stats_, |
127 &rtcp_packet_type_counter_observer_, | 129 &rtcp_packet_type_counter_observer_, |
128 remote_bitrate_estimator, | 130 remote_bitrate_estimator, |
129 paced_sender_, | 131 paced_sender_, |
130 packet_router_, | 132 packet_router_, |
131 &send_bitrate_observer_, | 133 &send_bitrate_observer_, |
132 &send_frame_count_observer_, | 134 &send_frame_count_observer_, |
133 &send_side_delay_observer_, | 135 &send_side_delay_observer_, |
134 max_rtp_streams)), | 136 max_rtp_streams)), |
135 num_active_rtp_rtcp_modules_(1) { | 137 num_active_rtp_rtcp_modules_(1) { |
136 vie_receiver_.SetRtpRtcpModule(rtp_rtcp_modules_[0]); | 138 vie_receiver_.SetRtpRtcpModule(rtp_rtcp_modules_[0]); |
137 vcm_->SetNackSettings(kMaxNackListSize, max_nack_reordering_threshold_, 0); | 139 vcm_->SetNackSettings(kMaxNackListSize, max_nack_reordering_threshold_, 0); |
138 } | 140 } |
139 | 141 |
140 int32_t ViEChannel::Init() { | 142 int32_t ViEChannel::Init() { |
| 143 static const int kDefaultRenderDelayMs = 10; |
141 module_process_thread_->RegisterModule(vie_receiver_.GetReceiveStatistics()); | 144 module_process_thread_->RegisterModule(vie_receiver_.GetReceiveStatistics()); |
142 | 145 |
143 // RTP/RTCP initialization. | 146 // RTP/RTCP initialization. |
144 module_process_thread_->RegisterModule(rtp_rtcp_modules_[0]); | 147 module_process_thread_->RegisterModule(rtp_rtcp_modules_[0]); |
145 | 148 |
146 rtp_rtcp_modules_[0]->SetKeyFrameRequestMethod(kKeyFrameReqPliRtcp); | 149 rtp_rtcp_modules_[0]->SetKeyFrameRequestMethod(kKeyFrameReqPliRtcp); |
147 if (paced_sender_) { | 150 if (paced_sender_) { |
148 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) | 151 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) |
149 rtp_rtcp->SetStorePacketsStatus(true, nack_history_size_sender_); | 152 rtp_rtcp->SetStorePacketsStatus(true, nack_history_size_sender_); |
150 } | 153 } |
151 packet_router_->AddRtpModule(rtp_rtcp_modules_[0]); | 154 packet_router_->AddRtpModule(rtp_rtcp_modules_[0]); |
152 if (sender_) { | 155 if (sender_) { |
153 std::list<RtpRtcp*> send_rtp_modules(1, rtp_rtcp_modules_[0]); | 156 std::list<RtpRtcp*> send_rtp_modules(1, rtp_rtcp_modules_[0]); |
154 send_payload_router_->SetSendingRtpModules(send_rtp_modules); | 157 send_payload_router_->SetSendingRtpModules(send_rtp_modules); |
155 RTC_DCHECK(!send_payload_router_->active()); | 158 RTC_DCHECK(!send_payload_router_->active()); |
156 } | 159 } |
157 if (vcm_->RegisterReceiveCallback(this) != 0) { | 160 if (vcm_->RegisterReceiveCallback(this) != 0) { |
158 return -1; | 161 return -1; |
159 } | 162 } |
160 vcm_->RegisterFrameTypeCallback(this); | 163 vcm_->RegisterFrameTypeCallback(this); |
161 vcm_->RegisterReceiveStatisticsCallback(this); | 164 vcm_->RegisterReceiveStatisticsCallback(this); |
162 vcm_->RegisterDecoderTimingCallback(this); | 165 vcm_->RegisterDecoderTimingCallback(this); |
163 vcm_->SetRenderDelay(kViEDefaultRenderDelayMs); | 166 vcm_->SetRenderDelay(kDefaultRenderDelayMs); |
164 | 167 |
165 module_process_thread_->RegisterModule(vcm_); | 168 module_process_thread_->RegisterModule(vcm_); |
166 module_process_thread_->RegisterModule(&vie_sync_); | 169 module_process_thread_->RegisterModule(&vie_sync_); |
167 | 170 |
168 return 0; | 171 return 0; |
169 } | 172 } |
170 | 173 |
171 ViEChannel::~ViEChannel() { | 174 ViEChannel::~ViEChannel() { |
172 UpdateHistograms(); | 175 UpdateHistograms(); |
173 // Make sure we don't get more callbacks from the RTP module. | 176 // Make sure we don't get more callbacks from the RTP module. |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 return false; | 557 return false; |
555 } | 558 } |
556 | 559 |
557 int ViEChannel::SetSenderBufferingMode(int target_delay_ms) { | 560 int ViEChannel::SetSenderBufferingMode(int target_delay_ms) { |
558 if ((target_delay_ms < 0) || (target_delay_ms > kMaxTargetDelayMs)) { | 561 if ((target_delay_ms < 0) || (target_delay_ms > kMaxTargetDelayMs)) { |
559 LOG(LS_ERROR) << "Invalid send buffer value."; | 562 LOG(LS_ERROR) << "Invalid send buffer value."; |
560 return -1; | 563 return -1; |
561 } | 564 } |
562 if (target_delay_ms == 0) { | 565 if (target_delay_ms == 0) { |
563 // Real-time mode. | 566 // Real-time mode. |
564 nack_history_size_sender_ = kSendSidePacketHistorySize; | 567 nack_history_size_sender_ = kMinSendSidePacketHistorySize; |
565 } else { | 568 } else { |
566 nack_history_size_sender_ = GetRequiredNackListSize(target_delay_ms); | 569 nack_history_size_sender_ = GetRequiredNackListSize(target_delay_ms); |
567 // Don't allow a number lower than the default value. | 570 // Don't allow a number lower than the default value. |
568 if (nack_history_size_sender_ < kSendSidePacketHistorySize) { | 571 if (nack_history_size_sender_ < kMinSendSidePacketHistorySize) { |
569 nack_history_size_sender_ = kSendSidePacketHistorySize; | 572 nack_history_size_sender_ = kMinSendSidePacketHistorySize; |
570 } | 573 } |
571 } | 574 } |
572 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) | 575 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) |
573 rtp_rtcp->SetStorePacketsStatus(true, nack_history_size_sender_); | 576 rtp_rtcp->SetStorePacketsStatus(true, nack_history_size_sender_); |
574 return 0; | 577 return 0; |
575 } | 578 } |
576 | 579 |
577 int ViEChannel::GetRequiredNackListSize(int target_delay_ms) { | 580 int ViEChannel::GetRequiredNackListSize(int target_delay_ms) { |
578 // The max size of the nack list should be large enough to accommodate the | 581 // The max size of the nack list should be large enough to accommodate the |
579 // the number of packets (frames) resulting from the increased delay. | 582 // the number of packets (frames) resulting from the increased delay. |
(...skipping 636 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1216 CriticalSectionScoped cs(crit_.get()); | 1219 CriticalSectionScoped cs(crit_.get()); |
1217 receive_stats_callback_ = receive_statistics_proxy; | 1220 receive_stats_callback_ = receive_statistics_proxy; |
1218 } | 1221 } |
1219 | 1222 |
1220 void ViEChannel::SetIncomingVideoStream( | 1223 void ViEChannel::SetIncomingVideoStream( |
1221 IncomingVideoStream* incoming_video_stream) { | 1224 IncomingVideoStream* incoming_video_stream) { |
1222 CriticalSectionScoped cs(crit_.get()); | 1225 CriticalSectionScoped cs(crit_.get()); |
1223 incoming_video_stream_ = incoming_video_stream; | 1226 incoming_video_stream_ = incoming_video_stream; |
1224 } | 1227 } |
1225 } // namespace webrtc | 1228 } // namespace webrtc |
OLD | NEW |