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