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

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

Issue 1693553002: Move simple RtpRtcp calls to VideoSendStream. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: feedback 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/video_send_stream.h ('k') | webrtc/video/vie_channel.h » ('j') | 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) 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 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 vie_encoder_(num_cpu_cores, 190 vie_encoder_(num_cpu_cores,
191 config_.rtp.ssrcs, 191 config_.rtp.ssrcs,
192 module_process_thread_, 192 module_process_thread_,
193 &stats_proxy_, 193 &stats_proxy_,
194 config.pre_encode_callback, 194 config.pre_encode_callback,
195 &overuse_detector_, 195 &overuse_detector_,
196 congestion_controller_->pacer(), 196 congestion_controller_->pacer(),
197 &payload_router_, 197 &payload_router_,
198 bitrate_allocator), 198 bitrate_allocator),
199 vcm_(vie_encoder_.vcm()), 199 vcm_(vie_encoder_.vcm()),
200 rtp_rtcp_modules_(vie_channel_.rtp_rtcp()),
200 input_(&vie_encoder_, 201 input_(&vie_encoder_,
201 config_.local_renderer, 202 config_.local_renderer,
202 &stats_proxy_, 203 &stats_proxy_,
203 &overuse_detector_) { 204 &overuse_detector_) {
204 LOG(LS_INFO) << "VideoSendStream: " << config_.ToString(); 205 LOG(LS_INFO) << "VideoSendStream: " << config_.ToString();
205 206
206 RTC_DCHECK(!config_.rtp.ssrcs.empty()); 207 RTC_DCHECK(!config_.rtp.ssrcs.empty());
207 RTC_DCHECK(module_process_thread_); 208 RTC_DCHECK(module_process_thread_);
208 RTC_DCHECK(call_stats_); 209 RTC_DCHECK(call_stats_);
209 RTC_DCHECK(congestion_controller_); 210 RTC_DCHECK(congestion_controller_);
(...skipping 19 matching lines...) Expand all
229 RTC_CHECK_EQ(0, vie_channel_.SetSendAbsoluteSendTimeStatus(true, id)); 230 RTC_CHECK_EQ(0, vie_channel_.SetSendAbsoluteSendTimeStatus(true, id));
230 } else if (extension == RtpExtension::kVideoRotation) { 231 } else if (extension == RtpExtension::kVideoRotation) {
231 RTC_CHECK_EQ(0, vie_channel_.SetSendVideoRotationStatus(true, id)); 232 RTC_CHECK_EQ(0, vie_channel_.SetSendVideoRotationStatus(true, id));
232 } else if (extension == RtpExtension::kTransportSequenceNumber) { 233 } else if (extension == RtpExtension::kTransportSequenceNumber) {
233 RTC_CHECK_EQ(0, vie_channel_.SetSendTransportSequenceNumber(true, id)); 234 RTC_CHECK_EQ(0, vie_channel_.SetSendTransportSequenceNumber(true, id));
234 } else { 235 } else {
235 RTC_NOTREACHED() << "Registering unsupported RTP extension."; 236 RTC_NOTREACHED() << "Registering unsupported RTP extension.";
236 } 237 }
237 } 238 }
238 239
239 RtpRtcp* rtp_module = vie_channel_.rtp_rtcp(); 240 remb_->AddRembSender(rtp_rtcp_modules_[0]);
240 remb_->AddRembSender(rtp_module); 241 rtp_rtcp_modules_[0]->SetREMBStatus(true);
241 rtp_module->SetREMBStatus(true);
242 242
243 // Enable NACK, FEC or both. 243 // Enable NACK, FEC or both.
244 const bool enable_protection_nack = config_.rtp.nack.rtp_history_ms > 0; 244 const bool enable_protection_nack = config_.rtp.nack.rtp_history_ms > 0;
245 bool enable_protection_fec = config_.rtp.fec.red_payload_type != -1; 245 bool enable_protection_fec = config_.rtp.fec.red_payload_type != -1;
246 // Payload types without picture ID cannot determine that a stream is complete 246 // Payload types without picture ID cannot determine that a stream is complete
247 // without retransmitting FEC, so using FEC + NACK for H.264 (for instance) is 247 // without retransmitting FEC, so using FEC + NACK for H.264 (for instance) is
248 // a waste of bandwidth since FEC packets still have to be transmitted. Note 248 // a waste of bandwidth since FEC packets still have to be transmitted. Note
249 // that this is not the case with FLEXFEC. 249 // that this is not the case with FLEXFEC.
250 if (enable_protection_nack && 250 if (enable_protection_nack &&
251 !PayloadTypeSupportsSkippingFecPackets( 251 !PayloadTypeSupportsSkippingFecPackets(
252 config_.encoder_settings.payload_name)) { 252 config_.encoder_settings.payload_name)) {
253 LOG(LS_WARNING) << "Transmitting payload type without picture ID using" 253 LOG(LS_WARNING) << "Transmitting payload type without picture ID using"
254 "NACK+FEC is a waste of bandwidth since FEC packets " 254 "NACK+FEC is a waste of bandwidth since FEC packets "
255 "also have to be retransmitted. Disabling FEC."; 255 "also have to be retransmitted. Disabling FEC.";
256 enable_protection_fec = false; 256 enable_protection_fec = false;
257 } 257 }
258 // TODO(changbin): Should set RTX for RED mapping in RTP sender in future. 258 // TODO(changbin): Should set RTX for RED mapping in RTP sender in future.
259 vie_channel_.SetProtectionMode(enable_protection_nack, enable_protection_fec, 259 vie_channel_.SetProtectionMode(enable_protection_nack, enable_protection_fec,
260 config_.rtp.fec.red_payload_type, 260 config_.rtp.fec.red_payload_type,
261 config_.rtp.fec.ulpfec_payload_type); 261 config_.rtp.fec.ulpfec_payload_type);
262 vie_encoder_.SetProtectionMethod(enable_protection_nack, 262 vie_encoder_.SetProtectionMethod(enable_protection_nack,
263 enable_protection_fec); 263 enable_protection_fec);
264 264
265 ConfigureSsrcs(); 265 ConfigureSsrcs();
266 266
267 vie_channel_.SetRTCPCName(config_.rtp.c_name.c_str()); 267 // TODO(pbos): Should we set CNAME on all RTP modules?
268 268 rtp_rtcp_modules_.front()->SetCNAME(config_.rtp.c_name.c_str());
269 // 28 to match packet overhead in ModuleRtpRtcpImpl. 269 // 28 to match packet overhead in ModuleRtpRtcpImpl.
270 RTC_DCHECK_LE(config_.rtp.max_packet_size, static_cast<size_t>(0xFFFF - 28)); 270 static const size_t kRtpPacketSizeOverhead = 28;
271 vie_channel_.SetMTU(static_cast<uint16_t>(config_.rtp.max_packet_size + 28)); 271 RTC_DCHECK_LE(config_.rtp.max_packet_size, 0xFFFFu + kRtpPacketSizeOverhead);
272 const uint16_t mtu = static_cast<uint16_t>(config_.rtp.max_packet_size +
273 kRtpPacketSizeOverhead);
274 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
275 rtp_rtcp->RegisterRtcpStatisticsCallback(&stats_proxy_);
276 rtp_rtcp->RegisterSendChannelRtpStatisticsCallback(&stats_proxy_);
277 rtp_rtcp->SetMaxTransferUnit(mtu);
278 }
272 279
273 RTC_DCHECK(config.encoder_settings.encoder != nullptr); 280 RTC_DCHECK(config.encoder_settings.encoder != nullptr);
274 RTC_DCHECK_GE(config.encoder_settings.payload_type, 0); 281 RTC_DCHECK_GE(config.encoder_settings.payload_type, 0);
275 RTC_DCHECK_LE(config.encoder_settings.payload_type, 127); 282 RTC_DCHECK_LE(config.encoder_settings.payload_type, 127);
276 RTC_CHECK_EQ(0, vie_encoder_.RegisterExternalEncoder( 283 RTC_CHECK_EQ(0, vie_encoder_.RegisterExternalEncoder(
277 config.encoder_settings.encoder, 284 config.encoder_settings.encoder,
278 config.encoder_settings.payload_type, 285 config.encoder_settings.payload_type,
279 config.encoder_settings.internal_source)); 286 config.encoder_settings.internal_source));
280 287
281 RTC_CHECK(ReconfigureVideoEncoder(encoder_config)); 288 RTC_CHECK(ReconfigureVideoEncoder(encoder_config));
282 289
283 vie_channel_.RegisterSendSideDelayObserver(&stats_proxy_); 290 vie_channel_.RegisterSendSideDelayObserver(&stats_proxy_);
284 291
285 if (config_.post_encode_callback) 292 if (config_.post_encode_callback)
286 vie_encoder_.RegisterPostEncodeImageCallback(&encoded_frame_proxy_); 293 vie_encoder_.RegisterPostEncodeImageCallback(&encoded_frame_proxy_);
287 294
288 if (config_.suspend_below_min_bitrate) 295 if (config_.suspend_below_min_bitrate)
289 vie_encoder_.SuspendBelowMinBitrate(); 296 vie_encoder_.SuspendBelowMinBitrate();
290 297
291 vie_channel_.RegisterSendChannelRtcpStatisticsCallback(&stats_proxy_);
292 vie_channel_.RegisterSendChannelRtpStatisticsCallback(&stats_proxy_);
293 vie_channel_.RegisterRtcpPacketTypeCounterObserver(&stats_proxy_); 298 vie_channel_.RegisterRtcpPacketTypeCounterObserver(&stats_proxy_);
294 vie_channel_.RegisterSendBitrateObserver(&stats_proxy_); 299 vie_channel_.RegisterSendBitrateObserver(&stats_proxy_);
295 vie_channel_.RegisterSendFrameCountObserver(&stats_proxy_); 300 vie_channel_.RegisterSendFrameCountObserver(&stats_proxy_);
296 301
297 module_process_thread_->RegisterModule(&overuse_detector_); 302 module_process_thread_->RegisterModule(&overuse_detector_);
298 } 303 }
299 304
300 VideoSendStream::~VideoSendStream() { 305 VideoSendStream::~VideoSendStream() {
301 LOG(LS_INFO) << "~VideoSendStream: " << config_.ToString(); 306 LOG(LS_INFO) << "~VideoSendStream: " << config_.ToString();
302 Stop(); 307 Stop();
303 308
304 module_process_thread_->DeRegisterModule(&overuse_detector_); 309 module_process_thread_->DeRegisterModule(&overuse_detector_);
305 vie_channel_.RegisterSendFrameCountObserver(nullptr); 310 vie_channel_.RegisterSendFrameCountObserver(nullptr);
306 vie_channel_.RegisterSendBitrateObserver(nullptr); 311 vie_channel_.RegisterSendBitrateObserver(nullptr);
307 vie_channel_.RegisterRtcpPacketTypeCounterObserver(nullptr); 312 vie_channel_.RegisterRtcpPacketTypeCounterObserver(nullptr);
308 vie_channel_.RegisterSendChannelRtpStatisticsCallback(nullptr);
309 vie_channel_.RegisterSendChannelRtcpStatisticsCallback(nullptr);
310 313
311 vie_encoder_.DeRegisterExternalEncoder( 314 vie_encoder_.DeRegisterExternalEncoder(config_.encoder_settings.payload_type);
312 config_.encoder_settings.payload_type);
313 315
314 call_stats_->DeregisterStatsObserver(vie_channel_.GetStatsObserver()); 316 call_stats_->DeregisterStatsObserver(vie_channel_.GetStatsObserver());
315 317 rtp_rtcp_modules_[0]->SetREMBStatus(false);
316 RtpRtcp* rtp_module = vie_channel_.rtp_rtcp(); 318 remb_->RemoveRembSender(rtp_rtcp_modules_[0]);
317 rtp_module->SetREMBStatus(false);
318 remb_->RemoveRembSender(rtp_module);
319 319
320 // ViEChannel outlives ViEEncoder so remove encoder from feedback before 320 // ViEChannel outlives ViEEncoder so remove encoder from feedback before
321 // destruction. 321 // destruction.
322 encoder_feedback_.TearDown(); 322 encoder_feedback_.TearDown();
323 323
324 congestion_controller_->GetRemoteBitrateEstimator(false)->RemoveStream( 324 congestion_controller_->GetRemoteBitrateEstimator(false)->RemoveStream(
325 vie_receiver_->GetRemoteSsrc()); 325 vie_receiver_->GetRemoteSsrc());
326 } 326 }
327 327
328 VideoCaptureInput* VideoSendStream::Input() { 328 VideoCaptureInput* VideoSendStream::Input() {
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 if (config_.overuse_callback) 502 if (config_.overuse_callback)
503 config_.overuse_callback->OnLoadUpdate(LoadObserver::kOveruse); 503 config_.overuse_callback->OnLoadUpdate(LoadObserver::kOveruse);
504 } 504 }
505 505
506 void VideoSendStream::NormalUsage() { 506 void VideoSendStream::NormalUsage() {
507 if (config_.overuse_callback) 507 if (config_.overuse_callback)
508 config_.overuse_callback->OnLoadUpdate(LoadObserver::kUnderuse); 508 config_.overuse_callback->OnLoadUpdate(LoadObserver::kUnderuse);
509 } 509 }
510 510
511 void VideoSendStream::ConfigureSsrcs() { 511 void VideoSendStream::ConfigureSsrcs() {
512 vie_channel_.SetSSRC(config_.rtp.ssrcs.front(), kViEStreamTypeNormal, 0); 512 // Configure regular SSRCs.
513 for (size_t i = 0; i < config_.rtp.ssrcs.size(); ++i) { 513 for (size_t i = 0; i < config_.rtp.ssrcs.size(); ++i) {
514 uint32_t ssrc = config_.rtp.ssrcs[i]; 514 uint32_t ssrc = config_.rtp.ssrcs[i];
515 vie_channel_.SetSSRC(ssrc, kViEStreamTypeNormal, 515 RtpRtcp* const rtp_rtcp = rtp_rtcp_modules_[i];
516 static_cast<unsigned char>(i)); 516 rtp_rtcp->SetSSRC(ssrc);
517
518 // Restore RTP state if previous existed.
517 RtpStateMap::iterator it = suspended_ssrcs_.find(ssrc); 519 RtpStateMap::iterator it = suspended_ssrcs_.find(ssrc);
518 if (it != suspended_ssrcs_.end()) 520 if (it != suspended_ssrcs_.end())
519 vie_channel_.SetRtpStateForSsrc(ssrc, it->second); 521 rtp_rtcp->SetRtpStateForSsrc(ssrc, it->second);
520 } 522 }
521 523
522 if (config_.rtp.rtx.ssrcs.empty()) { 524 // Set up RTX if available.
525 if (config_.rtp.rtx.ssrcs.empty())
523 return; 526 return;
524 }
525 527
526 // Set up RTX. 528 // Configure RTX SSRCs.
527 RTC_DCHECK_EQ(config_.rtp.rtx.ssrcs.size(), config_.rtp.ssrcs.size()); 529 RTC_DCHECK_EQ(config_.rtp.rtx.ssrcs.size(), config_.rtp.ssrcs.size());
528 for (size_t i = 0; i < config_.rtp.rtx.ssrcs.size(); ++i) { 530 for (size_t i = 0; i < config_.rtp.rtx.ssrcs.size(); ++i) {
529 uint32_t ssrc = config_.rtp.rtx.ssrcs[i]; 531 uint32_t ssrc = config_.rtp.rtx.ssrcs[i];
530 vie_channel_.SetSSRC(config_.rtp.rtx.ssrcs[i], kViEStreamTypeRtx, 532 RtpRtcp* const rtp_rtcp = rtp_rtcp_modules_[i];
531 static_cast<unsigned char>(i)); 533 rtp_rtcp->SetRtxSsrc(ssrc);
532 RtpStateMap::iterator it = suspended_ssrcs_.find(ssrc); 534 RtpStateMap::iterator it = suspended_ssrcs_.find(ssrc);
533 if (it != suspended_ssrcs_.end()) 535 if (it != suspended_ssrcs_.end())
534 vie_channel_.SetRtpStateForSsrc(ssrc, it->second); 536 rtp_rtcp->SetRtpStateForSsrc(ssrc, it->second);
535 } 537 }
536 538
539 // Configure RTX payload types.
537 RTC_DCHECK_GE(config_.rtp.rtx.payload_type, 0); 540 RTC_DCHECK_GE(config_.rtp.rtx.payload_type, 0);
538 vie_channel_.SetRtxSendPayloadType(config_.rtp.rtx.payload_type, 541 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
539 config_.encoder_settings.payload_type); 542 rtp_rtcp->SetRtxSendPayloadType(config_.rtp.rtx.payload_type,
543 config_.encoder_settings.payload_type);
544 rtp_rtcp->SetRtxSendStatus(kRtxRetransmitted | kRtxRedundantPayloads);
545 }
540 if (config_.rtp.fec.red_payload_type != -1 && 546 if (config_.rtp.fec.red_payload_type != -1 &&
541 config_.rtp.fec.red_rtx_payload_type != -1) { 547 config_.rtp.fec.red_rtx_payload_type != -1) {
542 vie_channel_.SetRtxSendPayloadType(config_.rtp.fec.red_rtx_payload_type, 548 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
543 config_.rtp.fec.red_payload_type); 549 rtp_rtcp->SetRtxSendPayloadType(config_.rtp.fec.red_rtx_payload_type,
550 config_.rtp.fec.red_payload_type);
551 }
544 } 552 }
545 } 553 }
546 554
547 std::map<uint32_t, RtpState> VideoSendStream::GetRtpStates() const { 555 std::map<uint32_t, RtpState> VideoSendStream::GetRtpStates() const {
548 std::map<uint32_t, RtpState> rtp_states; 556 std::map<uint32_t, RtpState> rtp_states;
549 for (size_t i = 0; i < config_.rtp.ssrcs.size(); ++i) { 557 for (size_t i = 0; i < config_.rtp.ssrcs.size(); ++i) {
550 uint32_t ssrc = config_.rtp.ssrcs[i]; 558 uint32_t ssrc = config_.rtp.ssrcs[i];
551 rtp_states[ssrc] = vie_channel_.GetRtpStateForSsrc(ssrc); 559 rtp_states[ssrc] = vie_channel_.GetRtpStateForSsrc(ssrc);
552 } 560 }
553 561
554 for (size_t i = 0; i < config_.rtp.rtx.ssrcs.size(); ++i) { 562 for (size_t i = 0; i < config_.rtp.rtx.ssrcs.size(); ++i) {
555 uint32_t ssrc = config_.rtp.rtx.ssrcs[i]; 563 uint32_t ssrc = config_.rtp.rtx.ssrcs[i];
556 rtp_states[ssrc] = vie_channel_.GetRtpStateForSsrc(ssrc); 564 rtp_states[ssrc] = vie_channel_.GetRtpStateForSsrc(ssrc);
557 } 565 }
558 566
559 return rtp_states; 567 return rtp_states;
560 } 568 }
561 569
562 void VideoSendStream::SignalNetworkState(NetworkState state) { 570 void VideoSendStream::SignalNetworkState(NetworkState state) {
563 // When network goes up, enable RTCP status before setting transmission state. 571 // When network goes up, enable RTCP status before setting transmission state.
564 // When it goes down, disable RTCP afterwards. This ensures that any packets 572 // When it goes down, disable RTCP afterwards. This ensures that any packets
565 // sent due to the network state changed will not be dropped. 573 // sent due to the network state changed will not be dropped.
566 if (state == kNetworkUp) 574 if (state == kNetworkUp) {
567 vie_channel_.SetRTCPMode(config_.rtp.rtcp_mode); 575 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
576 rtp_rtcp->SetRTCPStatus(config_.rtp.rtcp_mode);
577 }
568 vie_encoder_.SetNetworkTransmissionState(state == kNetworkUp); 578 vie_encoder_.SetNetworkTransmissionState(state == kNetworkUp);
569 if (state == kNetworkDown) 579 if (state == kNetworkDown) {
570 vie_channel_.SetRTCPMode(RtcpMode::kOff); 580 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
581 rtp_rtcp->SetRTCPStatus(RtcpMode::kOff);
582 }
571 } 583 }
572 584
573 int VideoSendStream::GetPaddingNeededBps() const { 585 int VideoSendStream::GetPaddingNeededBps() const {
574 return vie_encoder_.GetPaddingNeededBps(); 586 return vie_encoder_.GetPaddingNeededBps();
575 } 587 }
576 588
577 bool VideoSendStream::SetSendCodec(VideoCodec video_codec) { 589 bool VideoSendStream::SetSendCodec(VideoCodec video_codec) {
578 static const int kEncoderMinBitrate = 30; 590 static const int kEncoderMinBitrate = 30;
579 if (video_codec.maxBitrate == 0) { 591 if (video_codec.maxBitrate == 0) {
580 // Unset max bitrate -> cap to one bit per pixel. 592 // Unset max bitrate -> cap to one bit per pixel.
(...skipping 20 matching lines...) Expand all
601 return false; 613 return false;
602 } 614 }
603 615
604 // Restart the media flow 616 // Restart the media flow
605 vie_encoder_.Restart(); 617 vie_encoder_.Restart();
606 618
607 return true; 619 return true;
608 } 620 }
609 } // namespace internal 621 } // namespace internal
610 } // namespace webrtc 622 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/video/video_send_stream.h ('k') | webrtc/video/vie_channel.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698