| Index: webrtc/video/video_send_stream.cc
|
| diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc
|
| index 31ba5ee31c0aaa537e51f6ea5f0b13f977748361..6c58840dccd5986317c704af62666b7a6fdd6888 100644
|
| --- a/webrtc/video/video_send_stream.cc
|
| +++ b/webrtc/video/video_send_stream.cc
|
| @@ -342,6 +342,28 @@ VideoCodec VideoEncoderConfigToVideoCodec(const VideoEncoderConfig& config,
|
| return video_codec;
|
| }
|
|
|
| +int CalulcateMaxPadBitrateBps(const VideoEncoderConfig& config,
|
| + bool pad_to_min_bitrate) {
|
| + int pad_up_to_bitrate_bps = 0;
|
| + // Calulate max padding bitrate for a multi layer codec.
|
| + if (config.streams.size() > 1) {
|
| + // Pad to min bitrate of the highest layer.
|
| + pad_up_to_bitrate_bps =
|
| + config.streams[config.streams.size() - 1].min_bitrate_bps;
|
| + // + target_bitrate_bps of the lower layers.
|
| + for (size_t i = 0; i < config.streams.size() - 1; ++i) {
|
| + pad_up_to_bitrate_bps += config.streams[i].target_bitrate_bps;
|
| + }
|
| + } else if (pad_to_min_bitrate) {
|
| + pad_up_to_bitrate_bps = config.streams[0].min_bitrate_bps;
|
| + }
|
| +
|
| + pad_up_to_bitrate_bps =
|
| + std::max(pad_up_to_bitrate_bps, config.min_transmit_bitrate_bps);
|
| +
|
| + return pad_up_to_bitrate_bps;
|
| +}
|
| +
|
| } // namespace
|
|
|
| namespace internal {
|
| @@ -533,7 +555,8 @@ void VideoSendStream::EncoderProcess() {
|
| config_.encoder_settings.internal_source));
|
|
|
| while (true) {
|
| - encoder_wakeup_event_.Wait(rtc::Event::kForever);
|
| + const int kEncodeCheckForActiviyPeriodMs = 1000;
|
| + encoder_wakeup_event_.Wait(kEncodeCheckForActiviyPeriodMs);
|
| if (rtc::AtomicOps::AcquireLoad(&stop_encoder_thread_))
|
| break;
|
| rtc::Optional<EncoderSettings> encoder_settings;
|
| @@ -549,12 +572,13 @@ void VideoSendStream::EncoderProcess() {
|
| bitrate_allocator_->AddObserver(
|
| this, encoder_settings->video_codec.minBitrate * 1000,
|
| encoder_settings->video_codec.maxBitrate * 1000,
|
| + CalulcateMaxPadBitrateBps(encoder_settings->config,
|
| + config_.suspend_below_min_bitrate),
|
| !config_.suspend_below_min_bitrate) /
|
| 1000;
|
|
|
| - payload_router_.SetSendStreams(encoder_settings->streams);
|
| + payload_router_.SetSendStreams(encoder_settings->config.streams);
|
| vie_encoder_.SetEncoder(encoder_settings->video_codec,
|
| - encoder_settings->min_transmit_bitrate_bps,
|
| payload_router_.MaxPayloadLength());
|
|
|
| // vie_encoder_.SetEncoder must be called before this.
|
| @@ -562,7 +586,7 @@ void VideoSendStream::EncoderProcess() {
|
| video_sender_->SuspendBelowMinBitrate();
|
|
|
| // Clear stats for disabled layers.
|
| - for (size_t i = encoder_settings->streams.size();
|
| + for (size_t i = encoder_settings->config.streams.size();
|
| i < config_.rtp.ssrcs.size(); ++i) {
|
| stats_proxy_.OnInactiveSsrc(config_.rtp.ssrcs[i]);
|
| }
|
| @@ -583,6 +607,10 @@ void VideoSendStream::EncoderProcess() {
|
| }
|
| vie_encoder_.EncodeVideoFrame(frame);
|
| }
|
| +
|
| + // TODO(perkj): This is temporary. Activity should be notified by ViEncoder
|
| + // once it owns its own thread.
|
| + vie_encoder_.CheckForActivity();
|
| }
|
| vie_encoder_.DeRegisterExternalEncoder(config_.encoder_settings.payload_type);
|
| }
|
| @@ -597,8 +625,8 @@ void VideoSendStream::ReconfigureVideoEncoder(
|
| config_.encoder_settings.payload_type);
|
| {
|
| rtc::CritScope lock(&encoder_settings_crit_);
|
| - pending_encoder_settings_ = rtc::Optional<EncoderSettings>(
|
| - {video_codec, config.min_transmit_bitrate_bps, config.streams});
|
| + pending_encoder_settings_ =
|
| + rtc::Optional<EncoderSettings>({video_codec, config});
|
| }
|
| encoder_wakeup_event_.Set();
|
| }
|
| @@ -652,6 +680,12 @@ int32_t VideoSendStream::Encoded(const EncodedImage& encoded_image,
|
| return return_value;
|
| }
|
|
|
| +void VideoSendStream::OnEncoderActivityChanged(bool active) {
|
| + // Notify the |bitrate_allocator_| if the encoder have timed out so it can
|
| + // stop sending padding if applicable.
|
| + bitrate_allocator_->NotifyObserverInactive(this, !active);
|
| +}
|
| +
|
| void VideoSendStream::ConfigureProtection() {
|
| // Enable NACK, FEC or both.
|
| const bool enable_protection_nack = config_.rtp.nack.rtp_history_ms > 0;
|
| @@ -773,10 +807,6 @@ void VideoSendStream::SignalNetworkState(NetworkState state) {
|
| }
|
| }
|
|
|
| -int VideoSendStream::GetPaddingNeededBps() const {
|
| - return vie_encoder_.GetPaddingNeededBps();
|
| -}
|
| -
|
| void VideoSendStream::OnBitrateUpdated(uint32_t bitrate_bps,
|
| uint8_t fraction_loss,
|
| int64_t rtt) {
|
|
|