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

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

Issue 1993113003: Refactor how padding is calculated. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Self review Created 4 years, 7 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
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 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 } 335 }
336 if (video_codec.maxBitrate < kEncoderMinBitrateKbps) 336 if (video_codec.maxBitrate < kEncoderMinBitrateKbps)
337 video_codec.maxBitrate = kEncoderMinBitrateKbps; 337 video_codec.maxBitrate = kEncoderMinBitrateKbps;
338 338
339 RTC_DCHECK_GT(streams[0].max_framerate, 0); 339 RTC_DCHECK_GT(streams[0].max_framerate, 0);
340 video_codec.maxFramerate = streams[0].max_framerate; 340 video_codec.maxFramerate = streams[0].max_framerate;
341 341
342 return video_codec; 342 return video_codec;
343 } 343 }
344 344
345 int CalulcateMaxPadBitrateBps(const VideoEncoderConfig& config,
346 bool pad_to_min_bitrate) {
347 int pad_up_to_bitrate_bps = 0;
348 // Calulate max padding bitrate for a multi layer codec.
349 if (config.streams.size() > 1) {
350 // Pad to min bitrate of the highest layer.
351 pad_up_to_bitrate_bps =
352 config.streams[config.streams.size() - 1].min_bitrate_bps;
353 // + target_bitrate_bps of the lower layers.
354 for (size_t i = 0; i < config.streams.size() - 1; ++i) {
355 pad_up_to_bitrate_bps += config.streams[i].target_bitrate_bps;
356 }
357 } else if (pad_to_min_bitrate) {
358 pad_up_to_bitrate_bps = config.streams[0].min_bitrate_bps;
359 }
360
361 pad_up_to_bitrate_bps =
362 std::max(pad_up_to_bitrate_bps, config.min_transmit_bitrate_bps);
363
364 return pad_up_to_bitrate_bps;
365 }
366
345 } // namespace 367 } // namespace
346 368
347 namespace internal { 369 namespace internal {
348 VideoSendStream::VideoSendStream( 370 VideoSendStream::VideoSendStream(
349 int num_cpu_cores, 371 int num_cpu_cores,
350 ProcessThread* module_process_thread, 372 ProcessThread* module_process_thread,
351 CallStats* call_stats, 373 CallStats* call_stats,
352 CongestionController* congestion_controller, 374 CongestionController* congestion_controller,
353 BitrateAllocator* bitrate_allocator, 375 BitrateAllocator* bitrate_allocator,
354 SendDelayStats* send_delay_stats, 376 SendDelayStats* send_delay_stats,
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 return false; 548 return false;
527 } 549 }
528 550
529 void VideoSendStream::EncoderProcess() { 551 void VideoSendStream::EncoderProcess() {
530 RTC_CHECK_EQ(0, vie_encoder_.RegisterExternalEncoder( 552 RTC_CHECK_EQ(0, vie_encoder_.RegisterExternalEncoder(
531 config_.encoder_settings.encoder, 553 config_.encoder_settings.encoder,
532 config_.encoder_settings.payload_type, 554 config_.encoder_settings.payload_type,
533 config_.encoder_settings.internal_source)); 555 config_.encoder_settings.internal_source));
534 556
535 while (true) { 557 while (true) {
536 encoder_wakeup_event_.Wait(rtc::Event::kForever); 558 const int kEncodeCheckForActiviyPeriodMs = 1000;
559 encoder_wakeup_event_.Wait(kEncodeCheckForActiviyPeriodMs);
537 if (rtc::AtomicOps::AcquireLoad(&stop_encoder_thread_)) 560 if (rtc::AtomicOps::AcquireLoad(&stop_encoder_thread_))
538 break; 561 break;
539 rtc::Optional<EncoderSettings> encoder_settings; 562 rtc::Optional<EncoderSettings> encoder_settings;
540 { 563 {
541 rtc::CritScope lock(&encoder_settings_crit_); 564 rtc::CritScope lock(&encoder_settings_crit_);
542 if (pending_encoder_settings_) { 565 if (pending_encoder_settings_) {
543 encoder_settings = pending_encoder_settings_; 566 encoder_settings = pending_encoder_settings_;
544 pending_encoder_settings_ = rtc::Optional<EncoderSettings>(); 567 pending_encoder_settings_ = rtc::Optional<EncoderSettings>();
545 } 568 }
546 } 569 }
547 if (encoder_settings) { 570 if (encoder_settings) {
548 encoder_settings->video_codec.startBitrate = 571 encoder_settings->video_codec.startBitrate =
549 bitrate_allocator_->AddObserver( 572 bitrate_allocator_->AddObserver(
550 this, encoder_settings->video_codec.minBitrate * 1000, 573 this, encoder_settings->video_codec.minBitrate * 1000,
551 encoder_settings->video_codec.maxBitrate * 1000, 574 encoder_settings->video_codec.maxBitrate * 1000,
575 CalulcateMaxPadBitrateBps(encoder_settings->config,
576 config_.suspend_below_min_bitrate),
552 !config_.suspend_below_min_bitrate) / 577 !config_.suspend_below_min_bitrate) /
553 1000; 578 1000;
554 579
555 payload_router_.SetSendStreams(encoder_settings->streams); 580 payload_router_.SetSendStreams(encoder_settings->config.streams);
556 vie_encoder_.SetEncoder(encoder_settings->video_codec, 581 vie_encoder_.SetEncoder(encoder_settings->video_codec,
557 encoder_settings->min_transmit_bitrate_bps,
558 payload_router_.MaxPayloadLength()); 582 payload_router_.MaxPayloadLength());
559 583
560 // vie_encoder_.SetEncoder must be called before this. 584 // vie_encoder_.SetEncoder must be called before this.
561 if (config_.suspend_below_min_bitrate) 585 if (config_.suspend_below_min_bitrate)
562 video_sender_->SuspendBelowMinBitrate(); 586 video_sender_->SuspendBelowMinBitrate();
563 587
564 // Clear stats for disabled layers. 588 // Clear stats for disabled layers.
565 for (size_t i = encoder_settings->streams.size(); 589 for (size_t i = encoder_settings->config.streams.size();
566 i < config_.rtp.ssrcs.size(); ++i) { 590 i < config_.rtp.ssrcs.size(); ++i) {
567 stats_proxy_.OnInactiveSsrc(config_.rtp.ssrcs[i]); 591 stats_proxy_.OnInactiveSsrc(config_.rtp.ssrcs[i]);
568 } 592 }
569 593
570 // We might've gotten new settings while configuring the encoder settings, 594 // We might've gotten new settings while configuring the encoder settings,
571 // restart from the top to see if that's the case before trying to encode 595 // restart from the top to see if that's the case before trying to encode
572 // a frame (which might correspond to the last frame size). 596 // a frame (which might correspond to the last frame size).
573 encoder_wakeup_event_.Set(); 597 encoder_wakeup_event_.Set();
574 continue; 598 continue;
575 } 599 }
576 600
577 VideoFrame frame; 601 VideoFrame frame;
578 if (input_.GetVideoFrame(&frame)) { 602 if (input_.GetVideoFrame(&frame)) {
579 // TODO(perkj): |pre_encode_callback| is only used by tests. Tests should 603 // TODO(perkj): |pre_encode_callback| is only used by tests. Tests should
580 // register as a sink to the VideoSource instead. 604 // register as a sink to the VideoSource instead.
581 if (config_.pre_encode_callback) { 605 if (config_.pre_encode_callback) {
582 config_.pre_encode_callback->OnFrame(frame); 606 config_.pre_encode_callback->OnFrame(frame);
583 } 607 }
584 vie_encoder_.EncodeVideoFrame(frame); 608 vie_encoder_.EncodeVideoFrame(frame);
585 } 609 }
610
611 // TODO(perkj): This is temporary. Activity should be notified by ViEncoder
612 // once it owns its own thread.
613 vie_encoder_.CheckForActivity();
586 } 614 }
587 vie_encoder_.DeRegisterExternalEncoder(config_.encoder_settings.payload_type); 615 vie_encoder_.DeRegisterExternalEncoder(config_.encoder_settings.payload_type);
588 } 616 }
589 617
590 void VideoSendStream::ReconfigureVideoEncoder( 618 void VideoSendStream::ReconfigureVideoEncoder(
591 const VideoEncoderConfig& config) { 619 const VideoEncoderConfig& config) {
592 TRACE_EVENT0("webrtc", "VideoSendStream::(Re)configureVideoEncoder"); 620 TRACE_EVENT0("webrtc", "VideoSendStream::(Re)configureVideoEncoder");
593 LOG(LS_INFO) << "(Re)configureVideoEncoder: " << config.ToString(); 621 LOG(LS_INFO) << "(Re)configureVideoEncoder: " << config.ToString();
594 RTC_DCHECK_GE(config_.rtp.ssrcs.size(), config.streams.size()); 622 RTC_DCHECK_GE(config_.rtp.ssrcs.size(), config.streams.size());
595 VideoCodec video_codec = VideoEncoderConfigToVideoCodec( 623 VideoCodec video_codec = VideoEncoderConfigToVideoCodec(
596 config, config_.encoder_settings.payload_name, 624 config, config_.encoder_settings.payload_name,
597 config_.encoder_settings.payload_type); 625 config_.encoder_settings.payload_type);
598 { 626 {
599 rtc::CritScope lock(&encoder_settings_crit_); 627 rtc::CritScope lock(&encoder_settings_crit_);
600 pending_encoder_settings_ = rtc::Optional<EncoderSettings>( 628 pending_encoder_settings_ =
601 {video_codec, config.min_transmit_bitrate_bps, config.streams}); 629 rtc::Optional<EncoderSettings>({video_codec, config});
602 } 630 }
603 encoder_wakeup_event_.Set(); 631 encoder_wakeup_event_.Set();
604 } 632 }
605 633
606 VideoSendStream::Stats VideoSendStream::GetStats() { 634 VideoSendStream::Stats VideoSendStream::GetStats() {
607 return stats_proxy_.GetStats(); 635 return stats_proxy_.GetStats();
608 } 636 }
609 637
610 void VideoSendStream::OveruseDetected() { 638 void VideoSendStream::OveruseDetected() {
611 if (config_.overuse_callback) 639 if (config_.overuse_callback)
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 } 673 }
646 if (file_writer) { 674 if (file_writer) {
647 bool ok = file_writer->WriteFrame(encoded_image); 675 bool ok = file_writer->WriteFrame(encoded_image);
648 RTC_DCHECK(ok); 676 RTC_DCHECK(ok);
649 } 677 }
650 } 678 }
651 679
652 return return_value; 680 return return_value;
653 } 681 }
654 682
683 void VideoSendStream::OnEncoderActivityChanged(bool active) {
684 // Notify the |bitrate_allocator_| if the encoder have timed out so it can
685 // stop sending padding if applicable.
686 bitrate_allocator_->NotifyObserverInactive(this, !active);
687 }
688
655 void VideoSendStream::ConfigureProtection() { 689 void VideoSendStream::ConfigureProtection() {
656 // Enable NACK, FEC or both. 690 // Enable NACK, FEC or both.
657 const bool enable_protection_nack = config_.rtp.nack.rtp_history_ms > 0; 691 const bool enable_protection_nack = config_.rtp.nack.rtp_history_ms > 0;
658 bool enable_protection_fec = config_.rtp.fec.red_payload_type != -1; 692 bool enable_protection_fec = config_.rtp.fec.red_payload_type != -1;
659 // Payload types without picture ID cannot determine that a stream is complete 693 // Payload types without picture ID cannot determine that a stream is complete
660 // without retransmitting FEC, so using FEC + NACK for H.264 (for instance) is 694 // without retransmitting FEC, so using FEC + NACK for H.264 (for instance) is
661 // a waste of bandwidth since FEC packets still have to be transmitted. Note 695 // a waste of bandwidth since FEC packets still have to be transmitted. Note
662 // that this is not the case with FLEXFEC. 696 // that this is not the case with FLEXFEC.
663 if (enable_protection_nack && 697 if (enable_protection_nack &&
664 !PayloadTypeSupportsSkippingFecPackets( 698 !PayloadTypeSupportsSkippingFecPackets(
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 return rtp_states; 800 return rtp_states;
767 } 801 }
768 802
769 void VideoSendStream::SignalNetworkState(NetworkState state) { 803 void VideoSendStream::SignalNetworkState(NetworkState state) {
770 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { 804 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
771 rtp_rtcp->SetRTCPStatus(state == kNetworkUp ? config_.rtp.rtcp_mode 805 rtp_rtcp->SetRTCPStatus(state == kNetworkUp ? config_.rtp.rtcp_mode
772 : RtcpMode::kOff); 806 : RtcpMode::kOff);
773 } 807 }
774 } 808 }
775 809
776 int VideoSendStream::GetPaddingNeededBps() const {
777 return vie_encoder_.GetPaddingNeededBps();
778 }
779
780 void VideoSendStream::OnBitrateUpdated(uint32_t bitrate_bps, 810 void VideoSendStream::OnBitrateUpdated(uint32_t bitrate_bps,
781 uint8_t fraction_loss, 811 uint8_t fraction_loss,
782 int64_t rtt) { 812 int64_t rtt) {
783 payload_router_.SetTargetSendBitrate(bitrate_bps); 813 payload_router_.SetTargetSendBitrate(bitrate_bps);
784 vie_encoder_.OnBitrateUpdated(bitrate_bps, fraction_loss, rtt); 814 vie_encoder_.OnBitrateUpdated(bitrate_bps, fraction_loss, rtt);
785 } 815 }
786 816
787 int VideoSendStream::ProtectionRequest(const FecProtectionParams* delta_params, 817 int VideoSendStream::ProtectionRequest(const FecProtectionParams* delta_params,
788 const FecProtectionParams* key_params, 818 const FecProtectionParams* key_params,
789 uint32_t* sent_video_rate_bps, 819 uint32_t* sent_video_rate_bps,
(...skipping 12 matching lines...) Expand all
802 &module_nack_rate); 832 &module_nack_rate);
803 *sent_video_rate_bps += module_video_rate; 833 *sent_video_rate_bps += module_video_rate;
804 *sent_nack_rate_bps += module_nack_rate; 834 *sent_nack_rate_bps += module_nack_rate;
805 *sent_fec_rate_bps += module_fec_rate; 835 *sent_fec_rate_bps += module_fec_rate;
806 } 836 }
807 return 0; 837 return 0;
808 } 838 }
809 839
810 } // namespace internal 840 } // namespace internal
811 } // namespace webrtc 841 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698