Index: webrtc/video/video_send_stream.cc |
diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc |
index afd9909dc0bfc37b17cc701b65054db8f6bdc98e..6af7ff63030afa2001ed9ee155294a1e6866de62 100644 |
--- a/webrtc/video/video_send_stream.cc |
+++ b/webrtc/video/video_send_stream.cc |
@@ -387,6 +387,7 @@ VideoSendStream::VideoSendStream( |
encoder_feedback_(Clock::GetRealTimeClock(), |
config.rtp.ssrcs, |
&vie_encoder_), |
+ protection_bitrate_calculator_(Clock::GetRealTimeClock(), this), |
video_sender_(vie_encoder_.video_sender()), |
bandwidth_observer_(congestion_controller_->GetBitrateController() |
->CreateRtcpBandwidthObserver()), |
@@ -422,8 +423,6 @@ VideoSendStream::VideoSendStream( |
congestion_controller_->packet_router()->AddRtpModule(rtp_rtcp); |
} |
- video_sender_->RegisterProtectionCallback(this); |
- |
for (size_t i = 0; i < config_.rtp.extensions.size(); ++i) { |
const std::string& extension = config_.rtp.extensions[i].uri; |
int id = config_.rtp.extensions[i].id; |
@@ -571,6 +570,17 @@ void VideoSendStream::EncoderProcess() { |
stats_proxy_.OnInactiveSsrc(config_.rtp.ssrcs[i]); |
} |
+ size_t number_of_temporal_layers = |
+ encoder_settings->streams.back() |
+ .temporal_layer_thresholds_bps.size() + |
+ 1; |
+ protection_bitrate_calculator_.SetEncodingData( |
+ encoder_settings->video_codec.startBitrate * 1000, |
+ encoder_settings->video_codec.width, |
+ encoder_settings->video_codec.height, |
+ encoder_settings->video_codec.maxFramerate, number_of_temporal_layers, |
+ payload_router_.MaxPayloadLength()); |
+ |
// We might've gotten new settings while configuring the encoder settings, |
// restart from the top to see if that's the case before trying to encode |
// a frame (which might correspond to the last frame size). |
@@ -627,6 +637,7 @@ int32_t VideoSendStream::Encoded(const EncodedImage& encoded_image, |
// |encoded_frame_proxy_| forwards frames to |config_.post_encode_callback|; |
encoded_frame_proxy_.Encoded(encoded_image, codec_specific_info, |
fragmentation); |
+ protection_bitrate_calculator_.UpdateWithEncodedData(encoded_image); |
int32_t return_value = payload_router_.Encoded( |
encoded_image, codec_specific_info, fragmentation); |
@@ -706,8 +717,8 @@ void VideoSendStream::ConfigureProtection() { |
} |
} |
- vie_encoder_.SetProtectionMethod(enable_protection_nack, |
- enable_protection_fec); |
+ protection_bitrate_calculator_.SetProtectionMethod(enable_protection_fec, |
+ enable_protection_nack); |
} |
void VideoSendStream::ConfigureSsrcs() { |
@@ -785,7 +796,12 @@ void VideoSendStream::OnBitrateUpdated(uint32_t bitrate_bps, |
uint8_t fraction_loss, |
int64_t rtt) { |
payload_router_.SetTargetSendBitrate(bitrate_bps); |
- vie_encoder_.OnBitrateUpdated(bitrate_bps, fraction_loss, rtt); |
+ // Get the encoder target rate. It is the estimated network rate - |
+ // protection overhead. |
+ uint32_t encoder_target_rate = protection_bitrate_calculator_.SetTargetRates( |
+ bitrate_bps, stats_proxy_.GetSendFrameRate(), fraction_loss, rtt); |
+ |
+ vie_encoder_.OnBitrateUpdated(encoder_target_rate, fraction_loss, rtt); |
} |
int VideoSendStream::ProtectionRequest(const FecProtectionParams* delta_params, |