Chromium Code Reviews| Index: webrtc/video/video_send_stream.cc |
| diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc |
| index d1811d2ced341e471ec72a1c622caee1a4254a32..6eb6b3633285162f6fd3aa0639294f16b909ed93 100644 |
| --- a/webrtc/video/video_send_stream.cc |
| +++ b/webrtc/video/video_send_stream.cc |
| @@ -344,6 +344,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. |
|
stefan-webrtc
2016/06/08 09:25:13
Calculate
perkj_webrtc
2016/06/08 15:35:27
Done.
|
| + 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. |
|
stefan-webrtc
2016/06/08 09:25:13
Add instead of +.
perkj_webrtc
2016/06/08 15:35:27
Done.
|
| + for (size_t i = 0; i < config.streams.size() - 1; ++i) { |
|
stefan-webrtc
2016/06/08 09:25:13
Remove {}
perkj_webrtc
2016/06/08 15:35:27
Done.
|
| + 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 { |
| @@ -536,7 +558,8 @@ void VideoSendStream::EncoderProcess() { |
| config_.encoder_settings.internal_source)); |
| while (true) { |
| - encoder_wakeup_event_.Wait(rtc::Event::kForever); |
| + const int kEncodeCheckForActiviyPeriodMs = 1000; |
|
stefan-webrtc
2016/06/08 09:25:13
Activity
And please add a comment why we have to
perkj_webrtc
2016/06/08 15:35:27
Done.
|
| + encoder_wakeup_event_.Wait(kEncodeCheckForActiviyPeriodMs); |
| if (rtc::AtomicOps::AcquireLoad(&stop_encoder_thread_)) |
| break; |
| rtc::Optional<EncoderSettings> encoder_settings; |
| @@ -552,12 +575,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. |
| @@ -565,13 +589,13 @@ 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]); |
| } |
| size_t number_of_temporal_layers = |
| - encoder_settings->streams.back() |
| + encoder_settings->config.streams.back() |
| .temporal_layer_thresholds_bps.size() + |
| 1; |
| protection_bitrate_calculator_.SetEncodingData( |
| @@ -597,6 +621,10 @@ void VideoSendStream::EncoderProcess() { |
| } |
| vie_encoder_.EncodeVideoFrame(frame); |
| } |
| + |
| + // TODO(perkj): This is temporary. Activity should be notified by ViEncoder |
|
stefan-webrtc
2016/06/08 09:25:13
ViEEncoder
perkj_webrtc
2016/06/08 15:35:27
Acknowledged.
|
| + // once it owns its own thread. |
| + vie_encoder_.CheckForActivity(); |
|
mflodman
2016/06/08 10:18:31
If that is done, can we also update the congestion
mflodman
2016/06/08 10:18:31
Can this method return true / false instead and we
perkj_webrtc
2016/06/08 15:35:27
I don't think I can call the congestion controller
mflodman
2016/06/13 05:02:43
My intention was to let the CongestionController d
|
| } |
| vie_encoder_.DeRegisterExternalEncoder(config_.encoder_settings.payload_type); |
| } |
| @@ -611,8 +639,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(); |
| } |
| @@ -667,6 +695,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; |
| @@ -791,10 +825,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) { |