Wire up pading.
Review URL: https://webrtc-codereview.appspot.com/509002

git-svn-id: http://webrtc.googlecode.com/svn/trunk@2094 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/src/modules/rtp_rtcp/source/rtp_sender.cc b/src/modules/rtp_rtcp/source/rtp_sender.cc
index 7d12a70..3136b27 100644
--- a/src/modules/rtp_rtcp/source/rtp_sender.cc
+++ b/src/modules/rtp_rtcp/source/rtp_sender.cc
@@ -516,12 +516,34 @@
         return _audio->SendAudio(frameType, payloadType, captureTimeStamp, payloadData, payloadSize,fragmentation);
     } else
     {
-        // assert audio frameTypes
-        assert(frameType == kVideoFrameKey ||
-               frameType == kVideoFrameDelta ||
-               frameType == kVideoFrameGolden ||
-               frameType == kVideoFrameAltRef);
+        // Assert on audio frameTypes.
+        assert(frameType != kAudioFrameSpeech &&
+               frameType != kAudioFrameCN);
 
+        // If the encoder generate an empty frame send pading.
+        if (frameType == kFrameEmpty) {
+          // Current bitrate since last estimate(1 second) averaged with the
+          // estimate since then, to get the most up to date bitrate.
+          uint32_t current_bitrate = BitrateNow();
+          int bitrate_diff = _targetSendBitrate * 1000 - current_bitrate;
+          if (bitrate_diff > 0) {
+            int bytes = 0;
+            if (current_bitrate == 0) {
+              // Start up phase. Send one 33.3 ms batch to start with.
+              bytes = (bitrate_diff / 8) / 30;
+            } else {
+              bytes = (bitrate_diff / 8);
+              // Cap at 200 ms of target send data.
+              int bytes_cap = _targetSendBitrate * 25;  // 1000 / 8 / 5
+              if (bytes_cap > bytes) {
+                bytes = bytes_cap;
+              }
+            }
+            // Send pading data.
+            return SendPadData(payloadType, captureTimeStamp, bytes);
+          }
+          return 0;
+        }
         return _video->SendVideo(videoType,
                                  frameType,
                                  payloadType,
@@ -818,9 +840,8 @@
   }
 }
 
+// Function triggered by timer.
 void RTPSender::ProcessSendToNetwork() {
-
-  // triggered by timer
   WebRtc_UWord32 delta_time_ms;
   {
     CriticalSectionScoped cs(_sendCritsect);
@@ -828,12 +849,10 @@
     if (!_transmissionSmoothing) {
       return;
     }
-
     WebRtc_UWord32 now = _clock.GetTimeInMS();
     delta_time_ms = now - _timeLastSendToNetworkUpdate;
     _timeLastSendToNetworkUpdate = now;
   }
-
   _sendBucket.UpdateBytesPerInterval(delta_time_ms, _targetSendBitrate);
 
   while (!_sendBucket.Empty()) {
diff --git a/src/modules/video_coding/main/source/encoded_frame.cc b/src/modules/video_coding/main/source/encoded_frame.cc
index 8e5d745..dff9df3 100644
--- a/src/modules/video_coding/main/source/encoded_frame.cc
+++ b/src/modules/video_coding/main/source/encoded_frame.cc
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
  *
  *  Use of this source code is governed by a BSD-style license
  *  that can be found in the LICENSE file in the root of the source
@@ -216,6 +216,10 @@
         {
             return kVideoFrameAltRef;
         }
+    case kSkipFrame:
+        {
+            return kFrameEmpty;
+        }
     default:
         {
             return kVideoFrameDelta;