| Index: webrtc/modules/rtp_rtcp/test/BWEStandAlone/TestLoadGenerator.cc
|
| diff --git a/webrtc/modules/rtp_rtcp/test/BWEStandAlone/TestLoadGenerator.cc b/webrtc/modules/rtp_rtcp/test/BWEStandAlone/TestLoadGenerator.cc
|
| deleted file mode 100644
|
| index a48ad2e6e4dd55e703df4528814cfed2ba305a37..0000000000000000000000000000000000000000
|
| --- a/webrtc/modules/rtp_rtcp/test/BWEStandAlone/TestLoadGenerator.cc
|
| +++ /dev/null
|
| @@ -1,432 +0,0 @@
|
| -/*
|
| - * Copyright (c) 2011 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
|
| - * tree. An additional intellectual property rights grant can be found
|
| - * in the file PATENTS. All contributing project authors may
|
| - * be found in the AUTHORS file in the root of the source tree.
|
| - */
|
| -
|
| -#include "webrtc/modules/rtp_rtcp/test/BWEStandAlone/TestLoadGenerator.h"
|
| -
|
| -#include <stdio.h>
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "webrtc/modules/rtp_rtcp/test/BWEStandAlone/TestSenderReceiver.h"
|
| -#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
|
| -#include "webrtc/system_wrappers/include/event_wrapper.h"
|
| -#include "webrtc/system_wrappers/include/tick_util.h"
|
| -
|
| -
|
| -bool SenderThreadFunction(void *obj)
|
| -{
|
| - if (obj == NULL)
|
| - {
|
| - return false;
|
| - }
|
| - TestLoadGenerator *_genObj = static_cast<TestLoadGenerator *>(obj);
|
| -
|
| - return _genObj->GeneratorLoop();
|
| -}
|
| -
|
| -
|
| -TestLoadGenerator::TestLoadGenerator(TestSenderReceiver *sender, int32_t rtpSampleRate)
|
| -:
|
| -_critSect(CriticalSectionWrapper::CreateCriticalSection()),
|
| -_eventPtr(NULL),
|
| -_bitrateKbps(0),
|
| -_sender(sender),
|
| -_running(false),
|
| -_rtpSampleRate(rtpSampleRate)
|
| -{
|
| -}
|
| -
|
| -TestLoadGenerator::~TestLoadGenerator ()
|
| -{
|
| - if (_running)
|
| - {
|
| - Stop();
|
| - }
|
| -
|
| - delete _critSect;
|
| -}
|
| -
|
| -int32_t TestLoadGenerator::SetBitrate (int32_t newBitrateKbps)
|
| -{
|
| - CriticalSectionScoped cs(_critSect);
|
| -
|
| - if (newBitrateKbps < 0)
|
| - {
|
| - return -1;
|
| - }
|
| -
|
| - _bitrateKbps = newBitrateKbps;
|
| -
|
| - printf("New bitrate = %i kbps\n", _bitrateKbps);
|
| -
|
| - return _bitrateKbps;
|
| -}
|
| -
|
| -
|
| -int32_t TestLoadGenerator::Start (const char *threadName)
|
| -{
|
| - CriticalSectionScoped cs(_critSect);
|
| -
|
| - _eventPtr = EventWrapper::Create();
|
| -
|
| - _genThread.reset(
|
| - new rtc::PlatformThread(SenderThreadFunction, this, threadName));
|
| - _running = true;
|
| -
|
| - _genThread->Start();
|
| - _genThread->SetPriority(rtc::kRealtimePriority);
|
| -
|
| - return 0;
|
| -}
|
| -
|
| -
|
| -int32_t TestLoadGenerator::Stop ()
|
| -{
|
| - _critSect.Enter();
|
| -
|
| - if (_genThread)
|
| - {
|
| - _running = false;
|
| - _eventPtr->Set();
|
| -
|
| - _genThread->Stop();
|
| - _genThread.reset();
|
| -
|
| - delete _eventPtr;
|
| - _eventPtr = NULL;
|
| - }
|
| -
|
| - _critSect.Leave();
|
| - return (0);
|
| -}
|
| -
|
| -
|
| -int TestLoadGenerator::generatePayload ()
|
| -{
|
| - return(generatePayload( static_cast<uint32_t>( TickTime::MillisecondTimestamp() * _rtpSampleRate / 1000 )));
|
| -}
|
| -
|
| -
|
| -int TestLoadGenerator::sendPayload (const uint32_t timeStamp,
|
| - const uint8_t* payloadData,
|
| - const size_t payloadSize,
|
| - const webrtc::FrameType frameType /*= webrtc::kVideoFrameDelta*/)
|
| -{
|
| -
|
| - return (_sender->SendOutgoingData(timeStamp, payloadData, payloadSize, frameType));
|
| -}
|
| -
|
| -
|
| -CBRGenerator::CBRGenerator (TestSenderReceiver *sender,
|
| - size_t payloadSizeBytes,
|
| - int32_t bitrateKbps,
|
| - int32_t rtpSampleRate)
|
| -:
|
| -//_eventPtr(NULL),
|
| -_payloadSizeBytes(payloadSizeBytes),
|
| -_payload(new uint8_t[payloadSizeBytes]),
|
| -TestLoadGenerator(sender, rtpSampleRate)
|
| -{
|
| - SetBitrate (bitrateKbps);
|
| -}
|
| -
|
| -CBRGenerator::~CBRGenerator ()
|
| -{
|
| - if (_running)
|
| - {
|
| - Stop();
|
| - }
|
| -
|
| - if (_payload)
|
| - {
|
| - delete [] _payload;
|
| - }
|
| -
|
| -}
|
| -
|
| -bool CBRGenerator::GeneratorLoop ()
|
| -{
|
| - double periodMs;
|
| - int64_t nextSendTime = TickTime::MillisecondTimestamp();
|
| -
|
| -
|
| - // no critSect
|
| - while (_running)
|
| - {
|
| - // send data (critSect inside)
|
| - generatePayload( static_cast<uint32_t>(nextSendTime * _rtpSampleRate / 1000) );
|
| -
|
| - // calculate wait time
|
| - periodMs = 8.0 * _payloadSizeBytes / ( _bitrateKbps );
|
| -
|
| - nextSendTime = static_cast<int64_t>(nextSendTime + periodMs);
|
| -
|
| - int32_t waitTime = static_cast<int32_t>(nextSendTime - TickTime::MillisecondTimestamp());
|
| - if (waitTime < 0)
|
| - {
|
| - waitTime = 0;
|
| - }
|
| - // wait
|
| - _eventPtr->Wait(static_cast<int32_t>(waitTime));
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -int CBRGenerator::generatePayload ( uint32_t timestamp )
|
| -{
|
| - CriticalSectionScoped cs(_critSect);
|
| -
|
| - //uint8_t *payload = new uint8_t[_payloadSizeBytes];
|
| -
|
| - int ret = sendPayload(timestamp, _payload, _payloadSizeBytes);
|
| -
|
| - //delete [] payload;
|
| - return ret;
|
| -}
|
| -
|
| -
|
| -
|
| -
|
| -/////////////////////
|
| -
|
| -CBRFixFRGenerator::CBRFixFRGenerator (TestSenderReceiver *sender, int32_t bitrateKbps,
|
| - int32_t rtpSampleRate, int32_t frameRateFps /*= 30*/,
|
| - double spread /*= 0.0*/)
|
| -:
|
| -//_eventPtr(NULL),
|
| -_payloadSizeBytes(0),
|
| -_payload(NULL),
|
| -_payloadAllocLen(0),
|
| -_frameRateFps(frameRateFps),
|
| -_spreadFactor(spread),
|
| -TestLoadGenerator(sender, rtpSampleRate)
|
| -{
|
| - SetBitrate (bitrateKbps);
|
| -}
|
| -
|
| -CBRFixFRGenerator::~CBRFixFRGenerator ()
|
| -{
|
| - if (_running)
|
| - {
|
| - Stop();
|
| - }
|
| -
|
| - if (_payload)
|
| - {
|
| - delete [] _payload;
|
| - _payloadAllocLen = 0;
|
| - }
|
| -
|
| -}
|
| -
|
| -bool CBRFixFRGenerator::GeneratorLoop ()
|
| -{
|
| - double periodMs;
|
| - int64_t nextSendTime = TickTime::MillisecondTimestamp();
|
| -
|
| - _critSect.Enter();
|
| -
|
| - if (_frameRateFps <= 0)
|
| - {
|
| - return false;
|
| - }
|
| -
|
| - _critSect.Leave();
|
| -
|
| - // no critSect
|
| - while (_running)
|
| - {
|
| - _critSect.Enter();
|
| -
|
| - // calculate payload size
|
| - _payloadSizeBytes = nextPayloadSize();
|
| -
|
| - if (_payloadSizeBytes > 0)
|
| - {
|
| -
|
| - if (_payloadAllocLen < _payloadSizeBytes * (1 + _spreadFactor))
|
| - {
|
| - // re-allocate _payload
|
| - if (_payload)
|
| - {
|
| - delete [] _payload;
|
| - _payload = NULL;
|
| - }
|
| -
|
| - _payloadAllocLen = static_cast<int32_t>((_payloadSizeBytes * (1 + _spreadFactor) * 3) / 2 + .5); // 50% extra to avoid frequent re-alloc
|
| - _payload = new uint8_t[_payloadAllocLen];
|
| - }
|
| -
|
| -
|
| - // send data (critSect inside)
|
| - generatePayload( static_cast<uint32_t>(nextSendTime * _rtpSampleRate / 1000) );
|
| - }
|
| -
|
| - _critSect.Leave();
|
| -
|
| - // calculate wait time
|
| - periodMs = 1000.0 / _frameRateFps;
|
| - nextSendTime = static_cast<int64_t>(nextSendTime + periodMs + 0.5);
|
| -
|
| - int32_t waitTime = static_cast<int32_t>(nextSendTime - TickTime::MillisecondTimestamp());
|
| - if (waitTime < 0)
|
| - {
|
| - waitTime = 0;
|
| - }
|
| - // wait
|
| - _eventPtr->Wait(waitTime);
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -size_t CBRFixFRGenerator::nextPayloadSize()
|
| -{
|
| - const double periodMs = 1000.0 / _frameRateFps;
|
| - return static_cast<size_t>(_bitrateKbps * periodMs / 8 + 0.5);
|
| -}
|
| -
|
| -int CBRFixFRGenerator::generatePayload ( uint32_t timestamp )
|
| -{
|
| - CriticalSectionScoped cs(_critSect);
|
| -
|
| - double factor = ((double) rand() - RAND_MAX/2) / RAND_MAX; // [-0.5; 0.5]
|
| - factor = 1 + 2 * _spreadFactor * factor; // [1 - _spreadFactor ; 1 + _spreadFactor]
|
| -
|
| - size_t thisPayloadBytes = static_cast<size_t>(_payloadSizeBytes * factor);
|
| - // sanity
|
| - if (thisPayloadBytes > _payloadAllocLen)
|
| - {
|
| - thisPayloadBytes = _payloadAllocLen;
|
| - }
|
| -
|
| - int ret = sendPayload(timestamp, _payload, thisPayloadBytes);
|
| - return ret;
|
| -}
|
| -
|
| -
|
| -/////////////////////
|
| -
|
| -PeriodicKeyFixFRGenerator::PeriodicKeyFixFRGenerator (TestSenderReceiver *sender, int32_t bitrateKbps,
|
| - int32_t rtpSampleRate, int32_t frameRateFps /*= 30*/,
|
| - double spread /*= 0.0*/, double keyFactor /*= 4.0*/, uint32_t keyPeriod /*= 300*/)
|
| -:
|
| -_keyFactor(keyFactor),
|
| -_keyPeriod(keyPeriod),
|
| -_frameCount(0),
|
| -CBRFixFRGenerator(sender, bitrateKbps, rtpSampleRate, frameRateFps, spread)
|
| -{
|
| -}
|
| -
|
| -size_t PeriodicKeyFixFRGenerator::nextPayloadSize()
|
| -{
|
| - // calculate payload size for a delta frame
|
| - size_t payloadSizeBytes = static_cast<size_t>(1000 * _bitrateKbps /
|
| - (8.0 * _frameRateFps * (1.0 + (_keyFactor - 1.0) / _keyPeriod)) + 0.5);
|
| -
|
| - if (_frameCount % _keyPeriod == 0)
|
| - {
|
| - // this is a key frame, scale the payload size
|
| - payloadSizeBytes =
|
| - static_cast<size_t>(_keyFactor * _payloadSizeBytes + 0.5);
|
| - }
|
| - _frameCount++;
|
| -
|
| - return payloadSizeBytes;
|
| -}
|
| -
|
| -////////////////////
|
| -
|
| -CBRVarFRGenerator::CBRVarFRGenerator(TestSenderReceiver *sender, int32_t bitrateKbps, const uint8_t* frameRates,
|
| - uint16_t numFrameRates, int32_t rtpSampleRate, double avgFrPeriodMs,
|
| - double frSpreadFactor, double spreadFactor)
|
| -:
|
| -_avgFrPeriodMs(avgFrPeriodMs),
|
| -_frSpreadFactor(frSpreadFactor),
|
| -_frameRates(NULL),
|
| -_numFrameRates(numFrameRates),
|
| -_frChangeTimeMs(TickTime::MillisecondTimestamp() + _avgFrPeriodMs),
|
| -CBRFixFRGenerator(sender, bitrateKbps, rtpSampleRate, frameRates[0], spreadFactor)
|
| -{
|
| - _frameRates = new uint8_t[_numFrameRates];
|
| - memcpy(_frameRates, frameRates, _numFrameRates);
|
| -}
|
| -
|
| -CBRVarFRGenerator::~CBRVarFRGenerator()
|
| -{
|
| - delete [] _frameRates;
|
| -}
|
| -
|
| -void CBRVarFRGenerator::ChangeFrameRate()
|
| -{
|
| - const int64_t nowMs = TickTime::MillisecondTimestamp();
|
| - if (nowMs < _frChangeTimeMs)
|
| - {
|
| - return;
|
| - }
|
| - // Time to change frame rate
|
| - uint16_t frIndex = static_cast<uint16_t>(static_cast<double>(rand()) / RAND_MAX
|
| - * (_numFrameRates - 1) + 0.5) ;
|
| - assert(frIndex < _numFrameRates);
|
| - _frameRateFps = _frameRates[frIndex];
|
| - // Update the next frame rate change time
|
| - double factor = ((double) rand() - RAND_MAX/2) / RAND_MAX; // [-0.5; 0.5]
|
| - factor = 1 + 2 * _frSpreadFactor * factor; // [1 - _frSpreadFactor ; 1 + _frSpreadFactor]
|
| - _frChangeTimeMs = nowMs + static_cast<int64_t>(1000.0 * factor *
|
| - _avgFrPeriodMs + 0.5);
|
| -
|
| - printf("New frame rate: %d\n", _frameRateFps);
|
| -}
|
| -
|
| -size_t CBRVarFRGenerator::nextPayloadSize()
|
| -{
|
| - ChangeFrameRate();
|
| - return CBRFixFRGenerator::nextPayloadSize();
|
| -}
|
| -
|
| -////////////////////
|
| -
|
| -CBRFrameDropGenerator::CBRFrameDropGenerator(TestSenderReceiver *sender, int32_t bitrateKbps,
|
| - int32_t rtpSampleRate, double spreadFactor)
|
| -:
|
| -_accBits(0),
|
| -CBRFixFRGenerator(sender, bitrateKbps, rtpSampleRate, 30, spreadFactor)
|
| -{
|
| -}
|
| -
|
| -CBRFrameDropGenerator::~CBRFrameDropGenerator()
|
| -{
|
| -}
|
| -
|
| -size_t CBRFrameDropGenerator::nextPayloadSize()
|
| -{
|
| - _accBits -= 1000 * _bitrateKbps / _frameRateFps;
|
| - if (_accBits < 0)
|
| - {
|
| - _accBits = 0;
|
| - }
|
| - if (_accBits > 0.3 * _bitrateKbps * 1000)
|
| - {
|
| - //printf("drop\n");
|
| - return 0;
|
| - }
|
| - else
|
| - {
|
| - //printf("keep\n");
|
| - const double periodMs = 1000.0 / _frameRateFps;
|
| - size_t frameSize =
|
| - static_cast<size_t>(_bitrateKbps * periodMs / 8 + 0.5);
|
| - frameSize =
|
| - std::max(frameSize, static_cast<size_t>(300 * periodMs / 8 + 0.5));
|
| - _accBits += frameSize * 8;
|
| - return frameSize;
|
| - }
|
| -}
|
|
|