Index: webrtc/video/payload_router.cc |
diff --git a/webrtc/video/payload_router.cc b/webrtc/video/payload_router.cc |
index 3be5882cdbf2172928fe312caf2a9b3401d1ea9b..3784215bc377ee6b9e442cb26ae37fea339401ee 100644 |
--- a/webrtc/video/payload_router.cc |
+++ b/webrtc/video/payload_router.cc |
@@ -85,12 +85,19 @@ void CopyCodecSpecific(const CodecSpecificInfo* info, RTPVideoHeader* rtp) { |
} |
} |
+VideoCodec DefaultCodec() { |
+ VideoCodec codec; |
+ memset(&codec, 0, sizeof(VideoCodec)); |
+ return codec; |
+} |
+ |
} // namespace |
PayloadRouter::PayloadRouter(const std::vector<RtpRtcp*>& rtp_modules, |
int payload_type) |
: active_(false), |
num_sending_modules_(1), |
+ simulcast_state_(DefaultCodec()), |
rtp_modules_(rtp_modules), |
payload_type_(payload_type) { |
UpdateModuleSendingState(); |
@@ -170,21 +177,20 @@ void PayloadRouter::SetTargetSendBitrate(uint32_t bitrate_bps) { |
rtc::CritScope lock(&crit_); |
RTC_DCHECK_LE(streams_.size(), rtp_modules_.size()); |
- // TODO(sprang): Rebase https://codereview.webrtc.org/1913073002/ on top of |
- // this. |
- int bitrate_remainder = bitrate_bps; |
- for (size_t i = 0; i < streams_.size() && bitrate_remainder > 0; ++i) { |
- int stream_bitrate = 0; |
- if (streams_[i].max_bitrate_bps > bitrate_remainder) { |
- stream_bitrate = bitrate_remainder; |
- } else { |
- stream_bitrate = streams_[i].max_bitrate_bps; |
- } |
- bitrate_remainder -= stream_bitrate; |
- rtp_modules_[i]->SetTargetSendBitrate(stream_bitrate); |
+ if (simulcast_state_.NumStreams() > 0) { |
+ simulcast_state_.AllocateBitrate(bitrate_bps); |
+ for (auto& stream : simulcast_state_.Streams()) |
+ rtp_modules_[stream.idx]->SetTargetSendBitrate(stream.allocated_rate_bps); |
+ } else { |
+ rtp_modules_[0]->SetTargetSendBitrate(bitrate_bps); |
} |
} |
+void PayloadRouter::UpdateSimulcastState(const SimulcastState& state) { |
+ rtc::CritScope lock(&crit_); |
+ simulcast_state_ = state; |
+} |
+ |
size_t PayloadRouter::MaxPayloadLength() const { |
size_t min_payload_length = DefaultMaxPayloadLength(); |
rtc::CritScope lock(&crit_); |