Chromium Code Reviews| 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 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 27 #include "webrtc/video/call_stats.h" | 27 #include "webrtc/video/call_stats.h" |
| 28 #include "webrtc/video/video_capture_input.h" | 28 #include "webrtc/video/video_capture_input.h" |
| 29 #include "webrtc/video/vie_remb.h" | 29 #include "webrtc/video/vie_remb.h" |
| 30 #include "webrtc/video_send_stream.h" | 30 #include "webrtc/video_send_stream.h" |
| 31 | 31 |
| 32 namespace webrtc { | 32 namespace webrtc { |
| 33 | 33 |
| 34 class RtcpIntraFrameObserver; | 34 class RtcpIntraFrameObserver; |
| 35 class TransportFeedbackObserver; | 35 class TransportFeedbackObserver; |
| 36 | 36 |
| 37 static const int kMinSendSidePacketHistorySize = 600; | |
| 38 | |
| 39 namespace { | |
| 40 | |
| 41 std::vector<RtpRtcp*> CreateRtpRtcpModules( | |
| 42 Transport* outgoing_transport, | |
| 43 RtcpIntraFrameObserver* intra_frame_callback, | |
| 44 RtcpBandwidthObserver* bandwidth_callback, | |
| 45 TransportFeedbackObserver* transport_feedback_callback, | |
| 46 RtcpRttStats* rtt_stats, | |
| 47 RtcpPacketTypeCounterObserver* rtcp_packet_type_counter_observer, | |
| 48 RtpPacketSender* paced_sender, | |
| 49 TransportSequenceNumberAllocator* transport_sequence_number_allocator, | |
| 50 BitrateStatisticsObserver* send_bitrate_observer, | |
| 51 FrameCountObserver* send_frame_count_observer, | |
| 52 SendSideDelayObserver* send_side_delay_observer, | |
| 53 size_t num_modules) { | |
| 54 RTC_DCHECK_GT(num_modules, 0u); | |
| 55 RtpRtcp::Configuration configuration; | |
| 56 ReceiveStatistics* null_receive_statistics = configuration.receive_statistics; | |
| 57 configuration.audio = false; | |
| 58 configuration.receiver_only = false; | |
| 59 configuration.receive_statistics = null_receive_statistics; | |
| 60 configuration.outgoing_transport = outgoing_transport; | |
| 61 configuration.intra_frame_callback = intra_frame_callback; | |
| 62 configuration.rtt_stats = rtt_stats; | |
| 63 configuration.rtcp_packet_type_counter_observer = | |
| 64 rtcp_packet_type_counter_observer; | |
| 65 configuration.paced_sender = paced_sender; | |
| 66 configuration.transport_sequence_number_allocator = | |
| 67 transport_sequence_number_allocator; | |
| 68 configuration.send_bitrate_observer = send_bitrate_observer; | |
| 69 configuration.send_frame_count_observer = send_frame_count_observer; | |
| 70 configuration.send_side_delay_observer = send_side_delay_observer; | |
| 71 configuration.bandwidth_callback = bandwidth_callback; | |
| 72 configuration.transport_feedback_callback = transport_feedback_callback; | |
| 73 | |
| 74 std::vector<RtpRtcp*> modules; | |
| 75 for (size_t i = 0; i < num_modules; ++i) { | |
| 76 RtpRtcp* rtp_rtcp = RtpRtcp::CreateRtpRtcp(configuration); | |
| 77 rtp_rtcp->SetSendingStatus(false); | |
| 78 rtp_rtcp->SetSendingMediaStatus(false); | |
| 79 rtp_rtcp->SetRTCPStatus(RtcpMode::kCompound); | |
| 80 modules.push_back(rtp_rtcp); | |
| 81 } | |
| 82 return modules; | |
| 83 } | |
| 84 | |
| 85 } // namespace | |
| 86 | |
| 37 std::string | 87 std::string |
| 38 VideoSendStream::Config::EncoderSettings::ToString() const { | 88 VideoSendStream::Config::EncoderSettings::ToString() const { |
| 39 std::stringstream ss; | 89 std::stringstream ss; |
| 40 ss << "{payload_name: " << payload_name; | 90 ss << "{payload_name: " << payload_name; |
| 41 ss << ", payload_type: " << payload_type; | 91 ss << ", payload_type: " << payload_type; |
| 42 ss << ", encoder: " << (encoder ? "(VideoEncoder)" : "nullptr"); | 92 ss << ", encoder: " << (encoder ? "(VideoEncoder)" : "nullptr"); |
| 43 ss << '}'; | 93 ss << '}'; |
| 44 return ss.str(); | 94 return ss.str(); |
| 45 } | 95 } |
| 46 | 96 |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 176 remb_(remb), | 226 remb_(remb), |
| 177 encoder_thread_(EncoderThreadFunction, this, "EncoderThread"), | 227 encoder_thread_(EncoderThreadFunction, this, "EncoderThread"), |
| 178 encoder_wakeup_event_(false, false), | 228 encoder_wakeup_event_(false, false), |
| 179 stop_encoder_thread_(0), | 229 stop_encoder_thread_(0), |
| 180 overuse_detector_( | 230 overuse_detector_( |
| 181 Clock::GetRealTimeClock(), | 231 Clock::GetRealTimeClock(), |
| 182 GetCpuOveruseOptions(config.encoder_settings.full_overuse_time), | 232 GetCpuOveruseOptions(config.encoder_settings.full_overuse_time), |
| 183 this, | 233 this, |
| 184 config.post_encode_callback, | 234 config.post_encode_callback, |
| 185 &stats_proxy_), | 235 &stats_proxy_), |
| 186 vie_channel_(config.send_transport, | |
| 187 module_process_thread_, | |
| 188 &payload_router_, | |
| 189 nullptr, | |
| 190 &encoder_feedback_, | |
| 191 congestion_controller_->GetBitrateController() | |
| 192 ->CreateRtcpBandwidthObserver(), | |
| 193 congestion_controller_->GetTransportFeedbackObserver(), | |
| 194 nullptr, | |
| 195 call_stats_->rtcp_rtt_stats(), | |
| 196 congestion_controller_->pacer(), | |
| 197 congestion_controller_->packet_router(), | |
| 198 config_.rtp.ssrcs.size(), | |
| 199 true), | |
| 200 vie_receiver_(vie_channel_.vie_receiver()), | |
| 201 vie_encoder_(num_cpu_cores, | 236 vie_encoder_(num_cpu_cores, |
| 202 config_.rtp.ssrcs, | 237 config_.rtp.ssrcs, |
| 203 module_process_thread_, | 238 module_process_thread_, |
| 204 &stats_proxy_, | 239 &stats_proxy_, |
| 205 config.pre_encode_callback, | 240 config.pre_encode_callback, |
| 206 &overuse_detector_, | 241 &overuse_detector_, |
| 207 congestion_controller_->pacer(), | 242 congestion_controller_->pacer(), |
| 208 &payload_router_), | 243 &payload_router_), |
| 209 vcm_(vie_encoder_.vcm()), | 244 vcm_(vie_encoder_.vcm()), |
| 210 rtp_rtcp_modules_(vie_channel_.rtp_rtcp()), | 245 rtp_rtcp_modules_(CreateRtpRtcpModules( |
| 246 config.send_transport, | |
| 247 &encoder_feedback_, | |
| 248 congestion_controller_->GetBitrateController() | |
| 249 ->CreateRtcpBandwidthObserver(), | |
|
pbos-webrtc
2016/04/07 16:02:08
This one leaks, perhaps it should go into a scoped
perkj_webrtc
2016/04/08 10:59:04
Done.
| |
| 250 congestion_controller_->GetTransportFeedbackObserver(), | |
| 251 call_stats_->rtcp_rtt_stats(), | |
| 252 &stats_proxy_, | |
| 253 congestion_controller_->pacer(), | |
| 254 congestion_controller_->packet_router(), | |
| 255 &stats_proxy_, | |
|
pbos-webrtc
2016/04/07 16:02:08
Since this function is only used here can you repl
perkj_webrtc
2016/04/08 10:59:04
Done.
| |
| 256 &stats_proxy_, | |
| 257 &stats_proxy_, | |
| 258 config_.rtp.ssrcs.size())), | |
| 259 payload_router_(rtp_rtcp_modules_), | |
| 211 input_(&encoder_wakeup_event_, | 260 input_(&encoder_wakeup_event_, |
| 212 config_.local_renderer, | 261 config_.local_renderer, |
| 213 &stats_proxy_, | 262 &stats_proxy_, |
| 214 &overuse_detector_) { | 263 &overuse_detector_) { |
| 215 LOG(LS_INFO) << "VideoSendStream: " << config_.ToString(); | 264 LOG(LS_INFO) << "VideoSendStream: " << config_.ToString(); |
| 216 | 265 |
| 217 RTC_DCHECK(!config_.rtp.ssrcs.empty()); | 266 RTC_DCHECK(!config_.rtp.ssrcs.empty()); |
| 218 RTC_DCHECK(module_process_thread_); | 267 RTC_DCHECK(module_process_thread_); |
| 219 RTC_DCHECK(call_stats_); | 268 RTC_DCHECK(call_stats_); |
| 220 RTC_DCHECK(congestion_controller_); | 269 RTC_DCHECK(congestion_controller_); |
| 221 RTC_DCHECK(remb_); | 270 RTC_DCHECK(remb_); |
| 222 | 271 |
| 223 payload_router_.Init(rtp_rtcp_modules_); | |
| 224 RTC_CHECK(vie_encoder_.Init()); | 272 RTC_CHECK(vie_encoder_.Init()); |
| 225 encoder_feedback_.Init(config_.rtp.ssrcs, &vie_encoder_); | 273 encoder_feedback_.Init(config_.rtp.ssrcs, &vie_encoder_); |
| 226 RTC_CHECK(vie_channel_.Init() == 0); | |
| 227 | 274 |
| 228 vcm_->RegisterProtectionCallback(vie_channel_.vcm_protection_callback()); | 275 // RTP/RTCP initialization. |
| 276 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | |
| 277 module_process_thread_->RegisterModule(rtp_rtcp); | |
| 278 congestion_controller_->packet_router()->AddRtpModule(rtp_rtcp); | |
| 279 } | |
| 229 | 280 |
| 230 call_stats_->RegisterStatsObserver(vie_channel_.GetStatsObserver()); | 281 payload_router_.SetSendingRtpModules(1); |
|
pbos-webrtc
2016/04/07 16:02:08
Should this just default to 1 within PayloadRouter
perkj_webrtc
2016/04/08 10:59:04
Done.
| |
| 282 | |
| 283 vcm_->RegisterProtectionCallback(this); | |
| 284 | |
| 285 // NOW! This only seems to be used receive side from looking at the code?? | |
|
pbos-webrtc
2016/04/07 16:02:08
Stefan, do you know what these CallStats are?
| |
| 286 // call_stats_->RegisterStatsObserver(vie_channel_.GetStatsObserver()); | |
| 231 | 287 |
| 232 for (size_t i = 0; i < config_.rtp.extensions.size(); ++i) { | 288 for (size_t i = 0; i < config_.rtp.extensions.size(); ++i) { |
| 233 const std::string& extension = config_.rtp.extensions[i].name; | 289 const std::string& extension = config_.rtp.extensions[i].name; |
| 234 int id = config_.rtp.extensions[i].id; | 290 int id = config_.rtp.extensions[i].id; |
| 235 // One-byte-extension local identifiers are in the range 1-14 inclusive. | 291 // One-byte-extension local identifiers are in the range 1-14 inclusive. |
| 236 RTC_DCHECK_GE(id, 1); | 292 RTC_DCHECK_GE(id, 1); |
| 237 RTC_DCHECK_LE(id, 14); | 293 RTC_DCHECK_LE(id, 14); |
| 238 RTC_DCHECK(RtpExtension::IsSupportedForVideo(extension)); | 294 RTC_DCHECK(RtpExtension::IsSupportedForVideo(extension)); |
| 239 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | 295 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { |
| 240 RTC_CHECK_EQ(0, rtp_rtcp->RegisterSendRtpHeaderExtension( | 296 RTC_CHECK_EQ(0, rtp_rtcp->RegisterSendRtpHeaderExtension( |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 253 // a waste of bandwidth since FEC packets still have to be transmitted. Note | 309 // a waste of bandwidth since FEC packets still have to be transmitted. Note |
| 254 // that this is not the case with FLEXFEC. | 310 // that this is not the case with FLEXFEC. |
| 255 if (enable_protection_nack && | 311 if (enable_protection_nack && |
| 256 !PayloadTypeSupportsSkippingFecPackets( | 312 !PayloadTypeSupportsSkippingFecPackets( |
| 257 config_.encoder_settings.payload_name)) { | 313 config_.encoder_settings.payload_name)) { |
| 258 LOG(LS_WARNING) << "Transmitting payload type without picture ID using" | 314 LOG(LS_WARNING) << "Transmitting payload type without picture ID using" |
| 259 "NACK+FEC is a waste of bandwidth since FEC packets " | 315 "NACK+FEC is a waste of bandwidth since FEC packets " |
| 260 "also have to be retransmitted. Disabling FEC."; | 316 "also have to be retransmitted. Disabling FEC."; |
| 261 enable_protection_fec = false; | 317 enable_protection_fec = false; |
| 262 } | 318 } |
| 319 | |
| 320 // Set to valid uint8_ts to be castable later without signed overflows. | |
| 321 uint8_t payload_type_red = 0; | |
|
pbos-webrtc
2016/04/07 16:02:08
Can you break out this block into a separate metho
perkj_webrtc
2016/04/08 10:59:04
Done.
| |
| 322 uint8_t payload_type_fec = 0; | |
| 263 // TODO(changbin): Should set RTX for RED mapping in RTP sender in future. | 323 // TODO(changbin): Should set RTX for RED mapping in RTP sender in future. |
| 264 vie_channel_.SetProtectionMode(enable_protection_nack, enable_protection_fec, | 324 // Validate payload types. If either RED or FEC payload types are set then |
| 265 config_.rtp.fec.red_payload_type, | 325 // both should be. If FEC is enabled then they both have to be set. |
| 266 config_.rtp.fec.ulpfec_payload_type); | 326 if (enable_protection_fec || config_.rtp.fec.red_payload_type != -1 || |
| 327 config_.rtp.fec.ulpfec_payload_type != -1) { | |
| 328 RTC_DCHECK_GE(config_.rtp.fec.red_payload_type, 0); | |
| 329 RTC_DCHECK_GE(config_.rtp.fec.ulpfec_payload_type, 0); | |
| 330 RTC_DCHECK_LE(config_.rtp.fec.red_payload_type, 127); | |
| 331 RTC_DCHECK_LE(config_.rtp.fec.ulpfec_payload_type, 127); | |
| 332 payload_type_red = static_cast<uint8_t>(config_.rtp.fec.red_payload_type); | |
| 333 payload_type_fec = | |
| 334 static_cast<uint8_t>(config_.rtp.fec.ulpfec_payload_type); | |
| 335 } else { | |
| 336 // Payload types unset. | |
| 337 RTC_DCHECK_EQ(config_.rtp.fec.red_payload_type, -1); | |
| 338 RTC_DCHECK_EQ(config_.rtp.fec.ulpfec_payload_type, -1); | |
| 339 } | |
| 340 | |
| 341 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | |
| 342 // Set NACK. | |
| 343 rtp_rtcp->SetStorePacketsStatus( | |
| 344 enable_protection_nack || congestion_controller_->pacer(), | |
| 345 kMinSendSidePacketHistorySize); | |
| 346 // Set FEC. | |
| 347 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | |
| 348 rtp_rtcp->SetGenericFECStatus(enable_protection_fec, payload_type_red, | |
| 349 payload_type_fec); | |
| 350 } | |
| 351 } | |
| 352 | |
| 267 vie_encoder_.SetProtectionMethod(enable_protection_nack, | 353 vie_encoder_.SetProtectionMethod(enable_protection_nack, |
| 268 enable_protection_fec); | 354 enable_protection_fec); |
| 269 | 355 |
| 270 ConfigureSsrcs(); | 356 ConfigureSsrcs(); |
| 271 | 357 |
| 272 // TODO(pbos): Should we set CNAME on all RTP modules? | 358 // TODO(pbos): Should we set CNAME on all RTP modules? |
| 273 rtp_rtcp_modules_.front()->SetCNAME(config_.rtp.c_name.c_str()); | 359 rtp_rtcp_modules_.front()->SetCNAME(config_.rtp.c_name.c_str()); |
| 274 // 28 to match packet overhead in ModuleRtpRtcpImpl. | 360 // 28 to match packet overhead in ModuleRtpRtcpImpl. |
| 275 static const size_t kRtpPacketSizeOverhead = 28; | 361 static const size_t kRtpPacketSizeOverhead = 28; |
| 276 RTC_DCHECK_LE(config_.rtp.max_packet_size, 0xFFFFu + kRtpPacketSizeOverhead); | 362 RTC_DCHECK_LE(config_.rtp.max_packet_size, 0xFFFFu + kRtpPacketSizeOverhead); |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 288 RTC_DCHECK(config.encoder_settings.encoder); | 374 RTC_DCHECK(config.encoder_settings.encoder); |
| 289 RTC_DCHECK_GE(config.encoder_settings.payload_type, 0); | 375 RTC_DCHECK_GE(config.encoder_settings.payload_type, 0); |
| 290 RTC_DCHECK_LE(config.encoder_settings.payload_type, 127); | 376 RTC_DCHECK_LE(config.encoder_settings.payload_type, 127); |
| 291 RTC_CHECK_EQ(0, vie_encoder_.RegisterExternalEncoder( | 377 RTC_CHECK_EQ(0, vie_encoder_.RegisterExternalEncoder( |
| 292 config.encoder_settings.encoder, | 378 config.encoder_settings.encoder, |
| 293 config.encoder_settings.payload_type, | 379 config.encoder_settings.payload_type, |
| 294 config.encoder_settings.internal_source)); | 380 config.encoder_settings.internal_source)); |
| 295 | 381 |
| 296 ReconfigureVideoEncoder(encoder_config); | 382 ReconfigureVideoEncoder(encoder_config); |
| 297 | 383 |
| 298 vie_channel_.RegisterSendSideDelayObserver(&stats_proxy_); | |
| 299 | |
| 300 if (config_.post_encode_callback) | 384 if (config_.post_encode_callback) |
| 301 vie_encoder_.RegisterPostEncodeImageCallback(&encoded_frame_proxy_); | 385 vie_encoder_.RegisterPostEncodeImageCallback(&encoded_frame_proxy_); |
| 302 | 386 |
| 303 if (config_.suspend_below_min_bitrate) { | 387 if (config_.suspend_below_min_bitrate) { |
| 304 vcm_->SuspendBelowMinBitrate(); | 388 vcm_->SuspendBelowMinBitrate(); |
| 305 bitrate_allocator_->EnforceMinBitrate(false); | 389 bitrate_allocator_->EnforceMinBitrate(false); |
| 306 } | 390 } |
| 307 | 391 |
| 308 vie_channel_.RegisterRtcpPacketTypeCounterObserver(&stats_proxy_); | |
| 309 vie_channel_.RegisterSendBitrateObserver(&stats_proxy_); | |
| 310 vie_channel_.RegisterSendFrameCountObserver(&stats_proxy_); | |
| 311 | |
| 312 module_process_thread_->RegisterModule(&overuse_detector_); | 392 module_process_thread_->RegisterModule(&overuse_detector_); |
| 313 | 393 |
| 314 encoder_thread_.Start(); | 394 encoder_thread_.Start(); |
| 315 encoder_thread_.SetPriority(rtc::kHighPriority); | 395 encoder_thread_.SetPriority(rtc::kHighPriority); |
| 316 } | 396 } |
| 317 | 397 |
| 318 VideoSendStream::~VideoSendStream() { | 398 VideoSendStream::~VideoSendStream() { |
| 319 LOG(LS_INFO) << "~VideoSendStream: " << config_.ToString(); | 399 LOG(LS_INFO) << "~VideoSendStream: " << config_.ToString(); |
| 320 | 400 |
| 321 Stop(); | 401 Stop(); |
| 322 | 402 |
| 323 // Stop the encoder thread permanently. | 403 // Stop the encoder thread permanently. |
| 324 rtc::AtomicOps::ReleaseStore(&stop_encoder_thread_, 1); | 404 rtc::AtomicOps::ReleaseStore(&stop_encoder_thread_, 1); |
| 325 encoder_wakeup_event_.Set(); | 405 encoder_wakeup_event_.Set(); |
| 326 encoder_thread_.Stop(); | 406 encoder_thread_.Stop(); |
| 327 | 407 |
| 328 // This needs to happen after stopping the encoder thread, | 408 // This needs to happen after stopping the encoder thread, |
| 329 // since the encoder thread calls AddObserver. | 409 // since the encoder thread calls AddObserver. |
| 330 bitrate_allocator_->RemoveObserver(this); | 410 bitrate_allocator_->RemoveObserver(this); |
| 331 | 411 |
| 332 module_process_thread_->DeRegisterModule(&overuse_detector_); | 412 module_process_thread_->DeRegisterModule(&overuse_detector_); |
| 333 vie_channel_.RegisterSendFrameCountObserver(nullptr); | |
| 334 vie_channel_.RegisterSendBitrateObserver(nullptr); | |
| 335 vie_channel_.RegisterRtcpPacketTypeCounterObserver(nullptr); | |
| 336 | 413 |
| 337 vie_encoder_.DeRegisterExternalEncoder(config_.encoder_settings.payload_type); | 414 vie_encoder_.DeRegisterExternalEncoder(config_.encoder_settings.payload_type); |
| 338 | 415 |
| 339 call_stats_->DeregisterStatsObserver(vie_channel_.GetStatsObserver()); | 416 // call_stats_->DeregisterStatsObserver(vie_channel_.GetStatsObserver()); |
| 340 rtp_rtcp_modules_[0]->SetREMBStatus(false); | 417 rtp_rtcp_modules_[0]->SetREMBStatus(false); |
| 341 remb_->RemoveRembSender(rtp_rtcp_modules_[0]); | 418 remb_->RemoveRembSender(rtp_rtcp_modules_[0]); |
| 342 | 419 |
| 343 // ViEChannel outlives ViEEncoder so remove encoder from feedback before | 420 // What is this??????? |
| 344 // destruction. | 421 // congestion_controller_->GetRemoteBitrateEstimator(false)->RemoveStream( |
|
pbos-webrtc
2016/04/07 16:02:08
Looks removable, don't think we need to remote est
| |
| 345 encoder_feedback_.TearDown(); | 422 // vie_receiver_->GetRemoteSsrc()); |
| 346 | 423 |
| 347 congestion_controller_->GetRemoteBitrateEstimator(false)->RemoveStream( | 424 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { |
| 348 vie_receiver_->GetRemoteSsrc()); | 425 congestion_controller_->packet_router()->RemoveRtpModule(rtp_rtcp); |
| 426 module_process_thread_->DeRegisterModule(rtp_rtcp); | |
| 427 delete rtp_rtcp; | |
| 428 } | |
| 349 } | 429 } |
| 350 | 430 |
| 351 VideoCaptureInput* VideoSendStream::Input() { | 431 VideoCaptureInput* VideoSendStream::Input() { |
| 352 return &input_; | 432 return &input_; |
| 353 } | 433 } |
| 354 | 434 |
| 355 void VideoSendStream::Start() { | 435 void VideoSendStream::Start() { |
| 356 if (payload_router_.active()) | 436 if (payload_router_.active()) |
| 357 return; | 437 return; |
| 358 vie_encoder_.Pause(); | 438 vie_encoder_.Pause(); |
| 359 payload_router_.set_active(true); | 439 payload_router_.set_active(true); |
| 360 // Was not already started, trigger a keyframe. | 440 // Was not already started, trigger a keyframe. |
| 361 vie_encoder_.SendKeyFrame(); | 441 vie_encoder_.SendKeyFrame(); |
| 362 vie_encoder_.Restart(); | 442 vie_encoder_.Restart(); |
| 363 vie_receiver_->StartReceive(); | |
| 364 } | 443 } |
| 365 | 444 |
| 366 void VideoSendStream::Stop() { | 445 void VideoSendStream::Stop() { |
| 367 if (!payload_router_.active()) | 446 if (!payload_router_.active()) |
| 368 return; | 447 return; |
| 369 // TODO(pbos): Make sure the encoder stops here. | 448 // TODO(pbos): Make sure the encoder stops here. |
| 370 payload_router_.set_active(false); | 449 payload_router_.set_active(false); |
| 371 vie_receiver_->StopReceive(); | |
| 372 } | 450 } |
| 373 | 451 |
| 374 bool VideoSendStream::EncoderThreadFunction(void* obj) { | 452 bool VideoSendStream::EncoderThreadFunction(void* obj) { |
| 375 static_cast<VideoSendStream*>(obj)->EncoderProcess(); | 453 static_cast<VideoSendStream*>(obj)->EncoderProcess(); |
| 376 // We're done, return false to abort. | 454 // We're done, return false to abort. |
| 377 return false; | 455 return false; |
| 378 } | 456 } |
| 379 | 457 |
| 380 void VideoSendStream::EncoderProcess() { | 458 void VideoSendStream::EncoderProcess() { |
| 381 while (true) { | 459 while (true) { |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 526 video_codec.maxFramerate = streams[0].max_framerate; | 604 video_codec.maxFramerate = streams[0].max_framerate; |
| 527 | 605 |
| 528 video_codec.startBitrate = | 606 video_codec.startBitrate = |
| 529 bitrate_allocator_->AddObserver(this, | 607 bitrate_allocator_->AddObserver(this, |
| 530 video_codec.minBitrate * 1000, | 608 video_codec.minBitrate * 1000, |
| 531 video_codec.maxBitrate * 1000) / 1000; | 609 video_codec.maxBitrate * 1000) / 1000; |
| 532 vie_encoder_.SetEncoder(video_codec, config.min_transmit_bitrate_bps); | 610 vie_encoder_.SetEncoder(video_codec, config.min_transmit_bitrate_bps); |
| 533 } | 611 } |
| 534 | 612 |
| 535 bool VideoSendStream::DeliverRtcp(const uint8_t* packet, size_t length) { | 613 bool VideoSendStream::DeliverRtcp(const uint8_t* packet, size_t length) { |
| 536 return vie_receiver_->DeliverRtcp(packet, length); | 614 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) |
| 615 rtp_rtcp->IncomingRtcpPacket(packet, length); | |
| 616 return true; | |
| 537 } | 617 } |
| 538 | 618 |
| 539 VideoSendStream::Stats VideoSendStream::GetStats() { | 619 VideoSendStream::Stats VideoSendStream::GetStats() { |
| 540 return stats_proxy_.GetStats(); | 620 return stats_proxy_.GetStats(); |
| 541 } | 621 } |
| 542 | 622 |
| 543 void VideoSendStream::OveruseDetected() { | 623 void VideoSendStream::OveruseDetected() { |
| 544 if (config_.overuse_callback) | 624 if (config_.overuse_callback) |
| 545 config_.overuse_callback->OnLoadUpdate(LoadObserver::kOveruse); | 625 config_.overuse_callback->OnLoadUpdate(LoadObserver::kOveruse); |
| 546 } | 626 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 591 rtp_rtcp->SetRtxSendPayloadType(config_.rtp.fec.red_rtx_payload_type, | 671 rtp_rtcp->SetRtxSendPayloadType(config_.rtp.fec.red_rtx_payload_type, |
| 592 config_.rtp.fec.red_payload_type); | 672 config_.rtp.fec.red_payload_type); |
| 593 } | 673 } |
| 594 } | 674 } |
| 595 } | 675 } |
| 596 | 676 |
| 597 std::map<uint32_t, RtpState> VideoSendStream::GetRtpStates() const { | 677 std::map<uint32_t, RtpState> VideoSendStream::GetRtpStates() const { |
| 598 std::map<uint32_t, RtpState> rtp_states; | 678 std::map<uint32_t, RtpState> rtp_states; |
| 599 for (size_t i = 0; i < config_.rtp.ssrcs.size(); ++i) { | 679 for (size_t i = 0; i < config_.rtp.ssrcs.size(); ++i) { |
| 600 uint32_t ssrc = config_.rtp.ssrcs[i]; | 680 uint32_t ssrc = config_.rtp.ssrcs[i]; |
| 601 rtp_states[ssrc] = vie_channel_.GetRtpStateForSsrc(ssrc); | 681 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { |
|
pbos-webrtc
2016/04/07 16:02:08
Can't we use rtp_rtcp_modules_[i]->GetRtpStateForS
perkj_webrtc
2016/04/08 10:59:04
hum.... right...
| |
| 682 if (rtp_rtcp->GetRtpStateForSsrc(ssrc, &rtp_states[ssrc])) | |
| 683 break; | |
| 684 } | |
| 602 } | 685 } |
| 603 | 686 |
| 604 for (size_t i = 0; i < config_.rtp.rtx.ssrcs.size(); ++i) { | 687 for (size_t i = 0; i < config_.rtp.rtx.ssrcs.size(); ++i) { |
| 605 uint32_t ssrc = config_.rtp.rtx.ssrcs[i]; | 688 uint32_t ssrc = config_.rtp.rtx.ssrcs[i]; |
| 606 rtp_states[ssrc] = vie_channel_.GetRtpStateForSsrc(ssrc); | 689 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { |
| 690 if (rtp_rtcp->GetRtpStateForSsrc(ssrc, &rtp_states[ssrc])) | |
| 691 break; | |
| 692 } | |
| 607 } | 693 } |
| 608 | 694 |
| 609 return rtp_states; | 695 return rtp_states; |
| 610 } | 696 } |
| 611 | 697 |
| 612 void VideoSendStream::SignalNetworkState(NetworkState state) { | 698 void VideoSendStream::SignalNetworkState(NetworkState state) { |
| 613 // When network goes up, enable RTCP status before setting transmission state. | 699 // When network goes up, enable RTCP status before setting transmission state. |
| 614 // When it goes down, disable RTCP afterwards. This ensures that any packets | 700 // When it goes down, disable RTCP afterwards. This ensures that any packets |
| 615 // sent due to the network state changed will not be dropped. | 701 // sent due to the network state changed will not be dropped. |
| 616 if (state == kNetworkUp) { | 702 if (state == kNetworkUp) { |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 627 int VideoSendStream::GetPaddingNeededBps() const { | 713 int VideoSendStream::GetPaddingNeededBps() const { |
| 628 return vie_encoder_.GetPaddingNeededBps(); | 714 return vie_encoder_.GetPaddingNeededBps(); |
| 629 } | 715 } |
| 630 | 716 |
| 631 void VideoSendStream::OnBitrateUpdated(uint32_t bitrate_bps, | 717 void VideoSendStream::OnBitrateUpdated(uint32_t bitrate_bps, |
| 632 uint8_t fraction_loss, | 718 uint8_t fraction_loss, |
| 633 int64_t rtt) { | 719 int64_t rtt) { |
| 634 vie_encoder_.OnBitrateUpdated(bitrate_bps, fraction_loss, rtt); | 720 vie_encoder_.OnBitrateUpdated(bitrate_bps, fraction_loss, rtt); |
| 635 } | 721 } |
| 636 | 722 |
| 723 | |
| 724 int VideoSendStream::ProtectionRequest(const FecProtectionParams* delta_params, | |
| 725 const FecProtectionParams* key_params, | |
| 726 uint32_t* sent_video_rate_bps, | |
| 727 uint32_t* sent_nack_rate_bps, | |
| 728 uint32_t* sent_fec_rate_bps) { | |
| 729 *sent_video_rate_bps = 0; | |
| 730 *sent_nack_rate_bps = 0; | |
| 731 *sent_fec_rate_bps = 0; | |
| 732 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | |
| 733 uint32_t not_used = 0; | |
| 734 uint32_t module_video_rate = 0; | |
| 735 uint32_t module_fec_rate = 0; | |
| 736 uint32_t module_nack_rate = 0; | |
| 737 rtp_rtcp->SetFecParameters(delta_params, key_params); | |
| 738 rtp_rtcp->BitrateSent(¬_used, &module_video_rate, &module_fec_rate, | |
| 739 &module_nack_rate); | |
| 740 *sent_video_rate_bps += module_video_rate; | |
| 741 *sent_nack_rate_bps += module_nack_rate; | |
| 742 *sent_fec_rate_bps += module_fec_rate; | |
| 743 } | |
| 744 return 0; | |
| 745 } | |
| 746 | |
| 637 } // namespace internal | 747 } // namespace internal |
| 638 } // namespace webrtc | 748 } // namespace webrtc |
| OLD | NEW |