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) |