From ddab60be56dad3860e4e4c75be14bf505c2259df Mon Sep 17 00:00:00 2001 From: "pwestin@webrtc.org" Date: Mon, 23 Apr 2012 14:52:15 +0000 Subject: [PATCH] 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 --- src/modules/rtp_rtcp/source/rtp_sender.cc | 37 ++++++++++++++----- .../video_coding/main/source/encoded_frame.cc | 6 ++- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/modules/rtp_rtcp/source/rtp_sender.cc b/src/modules/rtp_rtcp/source/rtp_sender.cc index 7d12a70689..3136b27d11 100644 --- a/src/modules/rtp_rtcp/source/rtp_sender.cc +++ b/src/modules/rtp_rtcp/source/rtp_sender.cc @@ -516,12 +516,34 @@ RTPSender::SendOutgoingData(const FrameType frameType, 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 @@ void RTPSender::UpdateNACKBitRate(const WebRtc_UWord32 bytes, } } +// Function triggered by timer. void RTPSender::ProcessSendToNetwork() { - - // triggered by timer WebRtc_UWord32 delta_time_ms; { CriticalSectionScoped cs(_sendCritsect); @@ -828,12 +849,10 @@ void RTPSender::ProcessSendToNetwork() { 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 8e5d745488..dff9df3ee7 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 @@ webrtc::FrameType VCMEncodedFrame::ConvertFrameType(VideoFrameType frameType) { return kVideoFrameAltRef; } + case kSkipFrame: + { + return kFrameEmpty; + } default: { return kVideoFrameDelta;