Base start bitrate on last observed bitrate.

Instead of setting bitrates based on codec target settings (which may
have previously been capped by a codec max bitrate), fetch the last
bandwidth allocated for this channel. This fixes broken low start bitrates
due to QCIF being set as default codec in WebRtcVideoEngine2 which caps
the max bitrate to 200kbps.

BUG=1788
R=mflodman@webrtc.org, stefan@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/43789004

Cr-Original-Commit-Position: refs/heads/master@{#8780}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: 143451d2590ef951f6e66a983a38a18fcd4c66a5
diff --git a/video_engine/include/vie_codec.h b/video_engine/include/vie_codec.h
index c6354d3..4190d6b 100644
--- a/video_engine/include/vie_codec.h
+++ b/video_engine/include/vie_codec.h
@@ -144,6 +144,8 @@
   virtual int GetReceiveSideDelay(const int video_channel,
                                   int* delay_ms) const = 0;
 
+  // Current target bitrate for this channel.
+  virtual uint32_t GetLastObservedBitrateBps(int video_channel) const = 0;
   // Gets the bitrate targeted by the video codec rate control in kbit/s.
   virtual int GetCodecTargetBitrate(const int video_channel,
                                     unsigned int* bitrate) const = 0;
diff --git a/video_engine/vie_codec_impl.cc b/video_engine/vie_codec_impl.cc
index c442f59..74d4f68 100644
--- a/video_engine/vie_codec_impl.cc
+++ b/video_engine/vie_codec_impl.cc
@@ -402,6 +402,12 @@
   return 0;
 }
 
+uint32_t ViECodecImpl::GetLastObservedBitrateBps(int video_channel) const {
+  ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
+  ViEEncoder* vie_encoder = cs.Encoder(video_channel);
+  assert(vie_encoder != nullptr);
+  return vie_encoder->LastObservedBitrateBps();
+}
 
 int ViECodecImpl::GetCodecTargetBitrate(const int video_channel,
                                         unsigned int* bitrate) const {
diff --git a/video_engine/vie_codec_impl.h b/video_engine/vie_codec_impl.h
index ed8bf8a..8460fec 100644
--- a/video_engine/vie_codec_impl.h
+++ b/video_engine/vie_codec_impl.h
@@ -51,6 +51,7 @@
                                          unsigned int& delta_frames) const;
   virtual int GetReceiveSideDelay(const int video_channel,
                                   int* delay_ms) const;
+  uint32_t GetLastObservedBitrateBps(int video_channel) const override;
   virtual int GetCodecTargetBitrate(const int video_channel,
                                     unsigned int* bitrate) const;
   virtual int GetNumDiscardedPackets(int video_channel) const;
diff --git a/video_engine/vie_encoder.cc b/video_engine/vie_encoder.cc
index e5f6b96..c388e39 100644
--- a/video_engine/vie_encoder.cc
+++ b/video_engine/vie_encoder.cc
@@ -148,6 +148,7 @@
       time_of_last_incoming_frame_ms_(0),
       send_padding_(false),
       min_transmit_bitrate_kbps_(0),
+      last_observed_bitrate_bps_(0),
       target_delay_ms_(0),
       network_is_transmitting_(true),
       encoder_paused_(false),
@@ -690,6 +691,11 @@
   return paced_sender_->QueueInMs();
 }
 
+uint32_t ViEEncoder::LastObservedBitrateBps() const {
+  CriticalSectionScoped cs(data_cs_.get());
+  return last_observed_bitrate_bps_;
+}
+
 int ViEEncoder::CodecTargetBitrate(uint32_t* bitrate) const {
   if (vcm_.Bitrate(bitrate) != 0)
     return -1;
@@ -924,6 +930,7 @@
 
   {
     CriticalSectionScoped cs(data_cs_.get());
+    last_observed_bitrate_bps_ = bitrate_bps;
     if (video_suspended_ == video_is_suspended)
       return;
     video_suspended_ = video_is_suspended;
diff --git a/video_engine/vie_encoder.h b/video_engine/vie_encoder.h
index a8be526..784a242 100644
--- a/video_engine/vie_encoder.h
+++ b/video_engine/vie_encoder.h
@@ -123,6 +123,7 @@
 
   int64_t PacerQueuingDelayMs() const;
 
+  uint32_t LastObservedBitrateBps() const;
   int CodecTargetBitrate(uint32_t* bitrate) const;
   // Loss protection.
   int32_t UpdateProtectionMethod(bool nack, bool fec);
@@ -221,6 +222,7 @@
   int64_t time_of_last_incoming_frame_ms_ GUARDED_BY(data_cs_);
   bool send_padding_ GUARDED_BY(data_cs_);
   int min_transmit_bitrate_kbps_ GUARDED_BY(data_cs_);
+  uint32_t last_observed_bitrate_bps_ GUARDED_BY(data_cs_);
   int target_delay_ms_ GUARDED_BY(data_cs_);
   bool network_is_transmitting_ GUARDED_BY(data_cs_);
   bool encoder_paused_ GUARDED_BY(data_cs_);