1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_RTP_RTCP_TEST_BWESTANDALONE_TESTLOADGENERATOR_H_ 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_RTP_RTCP_TEST_BWESTANDALONE_TESTLOADGENERATOR_H_ 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdlib.h> 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 16cbd78ae09f44b003a9969536b78f08cd1ff513e8pbos@webrtc.org#include "webrtc/modules/interface/module_common_types.h" 17cbd78ae09f44b003a9969536b78f08cd1ff513e8pbos@webrtc.org#include "webrtc/typedefs.h" 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass TestSenderReceiver; 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CriticalSectionWrapper; 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass EventWrapper; 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ThreadWrapper; 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass TestLoadGenerator 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 29b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org TestLoadGenerator (TestSenderReceiver *sender, int32_t rtpSampleRate = 90000); 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~TestLoadGenerator (); 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 32b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org int32_t SetBitrate (int32_t newBitrateKbps); 33b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual int32_t Start (const char *threadName = NULL); 34b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual int32_t Stop (); 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool GeneratorLoop () = 0; 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprotected: 38b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual int generatePayload ( uint32_t timestamp ) = 0; 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int generatePayload (); 40b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org int sendPayload (const uint32_t timeStamp, 41b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const uint8_t* payloadData, 42b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org const uint32_t payloadSize, 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const webrtc::FrameType frameType = webrtc::kVideoFrameDelta); 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::CriticalSectionWrapper* _critSect; 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::EventWrapper *_eventPtr; 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::ThreadWrapper* _genThread; 48b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org int32_t _bitrateKbps; 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TestSenderReceiver *_sender; 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _running; 51b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org int32_t _rtpSampleRate; 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CBRGenerator : public TestLoadGenerator 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 58b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org CBRGenerator (TestSenderReceiver *sender, int32_t payloadSizeBytes, int32_t bitrateKbps, int32_t rtpSampleRate = 90000); 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~CBRGenerator (); 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 61b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual int32_t Start () {return (TestLoadGenerator::Start("CBRGenerator"));}; 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool GeneratorLoop (); 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprotected: 66b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual int generatePayload ( uint32_t timestamp ); 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 68b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org int32_t _payloadSizeBytes; 69b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint8_t *_payload; 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CBRFixFRGenerator : public TestLoadGenerator // constant bitrate and fixed frame rate 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 76b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org CBRFixFRGenerator (TestSenderReceiver *sender, int32_t bitrateKbps, int32_t rtpSampleRate = 90000, 77b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org int32_t frameRateFps = 30, double spread = 0.0); 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~CBRFixFRGenerator (); 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 80b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual int32_t Start () {return (TestLoadGenerator::Start("CBRFixFRGenerator"));}; 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual bool GeneratorLoop (); 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprotected: 85b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual int32_t nextPayloadSize (); 86b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual int generatePayload ( uint32_t timestamp ); 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 88b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org int32_t _payloadSizeBytes; 89b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint8_t *_payload; 90b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org int32_t _payloadAllocLen; 91b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org int32_t _frameRateFps; 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org double _spreadFactor; 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass PeriodicKeyFixFRGenerator : public CBRFixFRGenerator // constant bitrate and fixed frame rate with periodically large frames 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 98b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org PeriodicKeyFixFRGenerator (TestSenderReceiver *sender, int32_t bitrateKbps, int32_t rtpSampleRate = 90000, 99b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org int32_t frameRateFps = 30, double spread = 0.0, double keyFactor = 4.0, uint32_t keyPeriod = 300); 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~PeriodicKeyFixFRGenerator () {} 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprotected: 103b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual int32_t nextPayloadSize (); 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org double _keyFactor; 106b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint32_t _keyPeriod; 107b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint32_t _frameCount; 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Probably better to inherit CBRFixFRGenerator from CBRVarFRGenerator, but since 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// the fix FR version already existed this was easier. 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CBRVarFRGenerator : public CBRFixFRGenerator // constant bitrate and variable frame rate 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 115b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org CBRVarFRGenerator(TestSenderReceiver *sender, int32_t bitrateKbps, const uint8_t* frameRates, 116b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint16_t numFrameRates, int32_t rtpSampleRate = 90000, double avgFrPeriodMs = 5.0, 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org double frSpreadFactor = 0.05, double spreadFactor = 0.0); 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ~CBRVarFRGenerator(); 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprotected: 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual void ChangeFrameRate(); 123b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual int32_t nextPayloadSize (); 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org double _avgFrPeriodMs; 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org double _frSpreadFactor; 127b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint8_t* _frameRates; 128b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org uint16_t _numFrameRates; 129b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org int64_t _frChangeTimeMs; 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CBRFrameDropGenerator : public CBRFixFRGenerator // constant bitrate and variable frame rate 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 135b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org CBRFrameDropGenerator(TestSenderReceiver *sender, int32_t bitrateKbps, 136b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org int32_t rtpSampleRate = 90000, double spreadFactor = 0.0); 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ~CBRFrameDropGenerator(); 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprotected: 141b57da6501f9db93536f51f7a64abf27306a7af04pbos@webrtc.org virtual int32_t nextPayloadSize(); 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org double _accBits; 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_MODULES_RTP_RTCP_TEST_BWESTANDALONE_TESTLOADGENERATOR_H_ 147