OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 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 |
11 #include "webrtc/video/video_receive_stream.h" | 11 #include "webrtc/video/video_receive_stream.h" |
12 | 12 |
13 #include <stdlib.h> | 13 #include <stdlib.h> |
14 | 14 |
15 #include <set> | 15 #include <set> |
16 #include <string> | 16 #include <string> |
17 #include <utility> | 17 #include <utility> |
18 | 18 |
19 #include "webrtc/base/checks.h" | 19 #include "webrtc/base/checks.h" |
20 #include "webrtc/base/logging.h" | 20 #include "webrtc/base/logging.h" |
21 #include "webrtc/base/optional.h" | 21 #include "webrtc/base/optional.h" |
22 #include "webrtc/common_video/h264/profile_level_id.h" | 22 #include "webrtc/common_video/h264/profile_level_id.h" |
23 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" | 23 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" |
24 #include "webrtc/modules/congestion_controller/include/congestion_controller.h" | |
25 #include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h" | 24 #include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h" |
26 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" | 25 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" |
27 #include "webrtc/modules/utility/include/process_thread.h" | 26 #include "webrtc/modules/utility/include/process_thread.h" |
28 #include "webrtc/modules/video_coding/frame_object.h" | 27 #include "webrtc/modules/video_coding/frame_object.h" |
29 #include "webrtc/modules/video_coding/include/video_coding.h" | 28 #include "webrtc/modules/video_coding/include/video_coding.h" |
30 #include "webrtc/modules/video_coding/jitter_estimator.h" | 29 #include "webrtc/modules/video_coding/jitter_estimator.h" |
31 #include "webrtc/modules/video_coding/timing.h" | 30 #include "webrtc/modules/video_coding/timing.h" |
32 #include "webrtc/modules/video_coding/utility/ivf_file_writer.h" | 31 #include "webrtc/modules/video_coding/utility/ivf_file_writer.h" |
33 #include "webrtc/system_wrappers/include/clock.h" | 32 #include "webrtc/system_wrappers/include/clock.h" |
34 #include "webrtc/system_wrappers/include/field_trial.h" | 33 #include "webrtc/system_wrappers/include/field_trial.h" |
35 #include "webrtc/video/call_stats.h" | 34 #include "webrtc/video/call_stats.h" |
36 #include "webrtc/video/receive_statistics_proxy.h" | 35 #include "webrtc/video/receive_statistics_proxy.h" |
37 #include "webrtc/video_receive_stream.h" | 36 #include "webrtc/video_receive_stream.h" |
38 | 37 |
39 namespace webrtc { | 38 namespace webrtc { |
40 | 39 |
41 static bool UseSendSideBwe(const VideoReceiveStream::Config& config) { | |
42 if (!config.rtp.transport_cc) | |
43 return false; | |
44 for (const auto& extension : config.rtp.extensions) { | |
45 if (extension.uri == RtpExtension::kTransportSequenceNumberUri) | |
46 return true; | |
47 } | |
48 return false; | |
49 } | |
50 | |
51 std::string VideoReceiveStream::Decoder::ToString() const { | 40 std::string VideoReceiveStream::Decoder::ToString() const { |
52 std::stringstream ss; | 41 std::stringstream ss; |
53 ss << "{decoder: " << (decoder ? "(VideoDecoder)" : "nullptr"); | 42 ss << "{decoder: " << (decoder ? "(VideoDecoder)" : "nullptr"); |
54 ss << ", payload_type: " << payload_type; | 43 ss << ", payload_type: " << payload_type; |
55 ss << ", payload_name: " << payload_name; | 44 ss << ", payload_name: " << payload_name; |
56 ss << ", codec_params: {"; | 45 ss << ", codec_params: {"; |
57 for (const auto& it : codec_params) | 46 for (const auto& it : codec_params) |
58 ss << it.first << ": " << it.second; | 47 ss << it.first << ": " << it.second; |
59 ss << '}'; | 48 ss << '}'; |
60 ss << '}'; | 49 ss << '}'; |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 | 170 |
182 return codec; | 171 return codec; |
183 } | 172 } |
184 } // namespace | 173 } // namespace |
185 | 174 |
186 namespace internal { | 175 namespace internal { |
187 | 176 |
188 VideoReceiveStream::VideoReceiveStream( | 177 VideoReceiveStream::VideoReceiveStream( |
189 int num_cpu_cores, | 178 int num_cpu_cores, |
190 bool protected_by_flexfec, | 179 bool protected_by_flexfec, |
191 CongestionController* congestion_controller, | |
192 PacketRouter* packet_router, | 180 PacketRouter* packet_router, |
193 VideoReceiveStream::Config config, | 181 VideoReceiveStream::Config config, |
194 ProcessThread* process_thread, | 182 ProcessThread* process_thread, |
195 CallStats* call_stats, | 183 CallStats* call_stats, |
196 VieRemb* remb) | 184 VieRemb* remb) |
197 : transport_adapter_(config.rtcp_send_transport), | 185 : transport_adapter_(config.rtcp_send_transport), |
198 config_(std::move(config)), | 186 config_(std::move(config)), |
199 num_cpu_cores_(num_cpu_cores), | 187 num_cpu_cores_(num_cpu_cores), |
200 protected_by_flexfec_(protected_by_flexfec), | 188 protected_by_flexfec_(protected_by_flexfec), |
201 process_thread_(process_thread), | 189 process_thread_(process_thread), |
202 clock_(Clock::GetRealTimeClock()), | 190 clock_(Clock::GetRealTimeClock()), |
203 decode_thread_(DecodeThreadFunction, this, "DecodingThread"), | 191 decode_thread_(DecodeThreadFunction, this, "DecodingThread"), |
204 congestion_controller_(congestion_controller), | |
205 call_stats_(call_stats), | 192 call_stats_(call_stats), |
206 timing_(new VCMTiming(clock_)), | 193 timing_(new VCMTiming(clock_)), |
207 video_receiver_(clock_, nullptr, this, timing_.get(), this, this), | 194 video_receiver_(clock_, nullptr, this, timing_.get(), this, this), |
208 stats_proxy_(&config_, clock_), | 195 stats_proxy_(&config_, clock_), |
209 rtp_stream_receiver_(&video_receiver_, | 196 rtp_stream_receiver_(&video_receiver_, |
210 congestion_controller_->GetRemoteBitrateEstimator( | |
211 UseSendSideBwe(config_)), | |
212 &transport_adapter_, | 197 &transport_adapter_, |
213 call_stats_->rtcp_rtt_stats(), | 198 call_stats_->rtcp_rtt_stats(), |
214 packet_router, | 199 packet_router, |
215 remb, | 200 remb, |
216 &config_, | 201 &config_, |
217 &stats_proxy_, | 202 &stats_proxy_, |
218 process_thread_, | 203 process_thread_, |
219 this, // NackSender | 204 this, // NackSender |
220 this, // KeyFrameRequestSender | 205 this, // KeyFrameRequestSender |
221 this, // OnCompleteFrameCallback | 206 this, // OnCompleteFrameCallback |
222 timing_.get()), | 207 timing_.get()), |
223 rtp_stream_sync_(this), | 208 rtp_stream_sync_(this), |
224 jitter_buffer_experiment_( | 209 jitter_buffer_experiment_( |
225 field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == | 210 field_trial::FindFullName("WebRTC-NewVideoJitterBuffer") == |
226 "Enabled") { | 211 "Enabled") { |
227 LOG(LS_INFO) << "VideoReceiveStream: " << config_.ToString(); | 212 LOG(LS_INFO) << "VideoReceiveStream: " << config_.ToString(); |
228 | 213 |
229 RTC_DCHECK(process_thread_); | 214 RTC_DCHECK(process_thread_); |
230 RTC_DCHECK(congestion_controller_); | |
231 RTC_DCHECK(call_stats_); | 215 RTC_DCHECK(call_stats_); |
232 | 216 |
233 module_process_thread_checker_.DetachFromThread(); | 217 module_process_thread_checker_.DetachFromThread(); |
234 | 218 |
235 RTC_DCHECK(!config_.decoders.empty()); | 219 RTC_DCHECK(!config_.decoders.empty()); |
236 std::set<int> decoder_payload_types; | 220 std::set<int> decoder_payload_types; |
237 for (const Decoder& decoder : config_.decoders) { | 221 for (const Decoder& decoder : config_.decoders) { |
238 RTC_CHECK(decoder.decoder); | 222 RTC_CHECK(decoder.decoder); |
239 RTC_CHECK(decoder_payload_types.find(decoder.payload_type) == | 223 RTC_CHECK(decoder_payload_types.find(decoder.payload_type) == |
240 decoder_payload_types.end()) | 224 decoder_payload_types.end()) |
(...skipping 14 matching lines...) Expand all Loading... |
255 process_thread_->RegisterModule(&rtp_stream_sync_); | 239 process_thread_->RegisterModule(&rtp_stream_sync_); |
256 } | 240 } |
257 | 241 |
258 VideoReceiveStream::~VideoReceiveStream() { | 242 VideoReceiveStream::~VideoReceiveStream() { |
259 RTC_DCHECK_RUN_ON(&worker_thread_checker_); | 243 RTC_DCHECK_RUN_ON(&worker_thread_checker_); |
260 LOG(LS_INFO) << "~VideoReceiveStream: " << config_.ToString(); | 244 LOG(LS_INFO) << "~VideoReceiveStream: " << config_.ToString(); |
261 Stop(); | 245 Stop(); |
262 | 246 |
263 process_thread_->DeRegisterModule(&rtp_stream_sync_); | 247 process_thread_->DeRegisterModule(&rtp_stream_sync_); |
264 process_thread_->DeRegisterModule(&video_receiver_); | 248 process_thread_->DeRegisterModule(&video_receiver_); |
265 | |
266 congestion_controller_->GetRemoteBitrateEstimator(UseSendSideBwe(config_)) | |
267 ->RemoveStream(rtp_stream_receiver_.GetRemoteSsrc()); | |
268 } | 249 } |
269 | 250 |
270 void VideoReceiveStream::SignalNetworkState(NetworkState state) { | 251 void VideoReceiveStream::SignalNetworkState(NetworkState state) { |
271 RTC_DCHECK_RUN_ON(&worker_thread_checker_); | 252 RTC_DCHECK_RUN_ON(&worker_thread_checker_); |
272 rtp_stream_receiver_.SignalNetworkState(state); | 253 rtp_stream_receiver_.SignalNetworkState(state); |
273 } | 254 } |
274 | 255 |
275 | 256 |
276 bool VideoReceiveStream::DeliverRtcp(const uint8_t* packet, size_t length) { | 257 bool VideoReceiveStream::DeliverRtcp(const uint8_t* packet, size_t length) { |
277 return rtp_stream_receiver_.DeliverRtcp(packet, length); | 258 return rtp_stream_receiver_.DeliverRtcp(packet, length); |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 LOG(LS_WARNING) << "No decodable frame in " << kMaxWaitForFrameMs | 508 LOG(LS_WARNING) << "No decodable frame in " << kMaxWaitForFrameMs |
528 << " ms, requesting keyframe."; | 509 << " ms, requesting keyframe."; |
529 RequestKeyFrame(); | 510 RequestKeyFrame(); |
530 } | 511 } |
531 } else { | 512 } else { |
532 video_receiver_.Decode(kMaxDecodeWaitTimeMs); | 513 video_receiver_.Decode(kMaxDecodeWaitTimeMs); |
533 } | 514 } |
534 } | 515 } |
535 } // namespace internal | 516 } // namespace internal |
536 } // namespace webrtc | 517 } // namespace webrtc |
OLD | NEW |