| Index: webrtc/video/vie_encoder.cc
|
| diff --git a/webrtc/video/vie_encoder.cc b/webrtc/video/vie_encoder.cc
|
| index 8240f9bfa635a32fa7cdd0b0cb0e47a6a0cdc2e0..e0240b0b35696f9da35a664c56dc452231db00c6 100644
|
| --- a/webrtc/video/vie_encoder.cc
|
| +++ b/webrtc/video/vie_encoder.cc
|
| @@ -25,6 +25,7 @@
|
| #include "webrtc/modules/video_coding/include/video_codec_interface.h"
|
| #include "webrtc/modules/video_coding/include/video_coding.h"
|
| #include "webrtc/modules/video_coding/include/video_coding_defines.h"
|
| +#include "webrtc/modules/video_coding/utility/simulcast_state.h"
|
| #include "webrtc/system_wrappers/include/clock.h"
|
| #include "webrtc/system_wrappers/include/metrics.h"
|
| #include "webrtc/system_wrappers/include/tick_util.h"
|
| @@ -38,28 +39,6 @@ namespace webrtc {
|
| static const float kStopPaddingThresholdMs = 2000;
|
| static const int kMinKeyFrameRequestIntervalMs = 300;
|
|
|
| -std::vector<uint32_t> AllocateStreamBitrates(
|
| - uint32_t total_bitrate,
|
| - const SimulcastStream* stream_configs,
|
| - size_t number_of_streams) {
|
| - if (number_of_streams == 0) {
|
| - std::vector<uint32_t> stream_bitrates(1, 0);
|
| - stream_bitrates[0] = total_bitrate;
|
| - return stream_bitrates;
|
| - }
|
| - std::vector<uint32_t> stream_bitrates(number_of_streams, 0);
|
| - uint32_t bitrate_remainder = total_bitrate;
|
| - for (size_t i = 0; i < stream_bitrates.size() && bitrate_remainder > 0; ++i) {
|
| - if (stream_configs[i].maxBitrate * 1000 > bitrate_remainder) {
|
| - stream_bitrates[i] = bitrate_remainder;
|
| - } else {
|
| - stream_bitrates[i] = stream_configs[i].maxBitrate * 1000;
|
| - }
|
| - bitrate_remainder -= stream_bitrates[i];
|
| - }
|
| - return stream_bitrates;
|
| -}
|
| -
|
| class QMVideoSettingsCallback : public VCMQMSettingsCallback {
|
| public:
|
| explicit QMVideoSettingsCallback(VideoProcessing* vpm);
|
| @@ -183,6 +162,8 @@ void ViEEncoder::SetEncoder(const webrtc::VideoCodec& video_codec,
|
| encoder_config_ = video_codec;
|
| encoder_paused_ = true;
|
| min_transmit_bitrate_bps_ = min_transmit_bitrate_bps;
|
| + if (encoder_config_.codecType == kVideoCodecVP8)
|
| + simulcast_rates_.reset(new SimulcastState(encoder_config_));
|
| }
|
|
|
| size_t max_data_payload_length = send_payload_router_->MaxPayloadLength();
|
| @@ -498,18 +479,24 @@ void ViEEncoder::OnBitrateUpdated(uint32_t bitrate_bps,
|
| bool video_is_suspended = video_sender_.VideoSuspended();
|
| bool video_suspension_changed;
|
| VideoCodec send_codec;
|
| + std::vector<uint32_t> stream_bitrates;
|
| {
|
| rtc::CritScope lock(&data_cs_);
|
| last_observed_bitrate_bps_ = bitrate_bps;
|
| video_suspension_changed = video_suspended_ != video_is_suspended;
|
| video_suspended_ = video_is_suspended;
|
| send_codec = encoder_config_;
|
| +
|
| + if (simulcast_rates_.get()) {
|
| + simulcast_rates_->AllocateBitrate(bitrate_bps);
|
| + for (auto stream : *simulcast_rates_)
|
| + stream_bitrates.push_back(stream.allocated_rate_kbps * 1000);
|
| + } else {
|
| + stream_bitrates.push_back(bitrate_bps);
|
| + }
|
| }
|
|
|
| - SimulcastStream* stream_configs = send_codec.simulcastStream;
|
| // Allocate the bandwidth between the streams.
|
| - std::vector<uint32_t> stream_bitrates = AllocateStreamBitrates(
|
| - bitrate_bps, stream_configs, send_codec.numberOfSimulcastStreams);
|
| send_payload_router_->SetTargetSendBitrates(stream_bitrates);
|
|
|
| if (!video_suspension_changed)
|
|
|