Home | History | Annotate | Download | only in BWEStandAlone
      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 
     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 
     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);
    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