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