Home | History | Annotate | Download | only in video
      1 /*
      2  *  Copyright (c) 2014 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_VIDEO_RAMPUP_TESTS_H_
     12 #define WEBRTC_VIDEO_RAMPUP_TESTS_H_
     13 
     14 #include <map>
     15 #include <string>
     16 #include <vector>
     17 
     18 #include "webrtc/call.h"
     19 #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
     20 #include "webrtc/system_wrappers/interface/event_wrapper.h"
     21 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
     22 #include "webrtc/test/call_test.h"
     23 #include "webrtc/video/transport_adapter.h"
     24 
     25 namespace webrtc {
     26 
     27 static const int kTransmissionTimeOffsetExtensionId = 6;
     28 static const int kAbsSendTimeExtensionId = 7;
     29 static const unsigned int kSingleStreamTargetBps = 1000000;
     30 
     31 class Clock;
     32 class CriticalSectionWrapper;
     33 class ReceiveStatistics;
     34 class RtpHeaderParser;
     35 class RTPPayloadRegistry;
     36 class RtpRtcp;
     37 
     38 class StreamObserver : public newapi::Transport, public RemoteBitrateObserver {
     39  public:
     40   typedef std::map<uint32_t, int> BytesSentMap;
     41   typedef std::map<uint32_t, uint32_t> SsrcMap;
     42   StreamObserver(const SsrcMap& rtx_media_ssrcs,
     43                  newapi::Transport* feedback_transport,
     44                  Clock* clock,
     45                  RemoteBitrateEstimatorFactory* rbe_factory,
     46                  RateControlType control_type);
     47 
     48   void set_expected_bitrate_bps(unsigned int expected_bitrate_bps);
     49 
     50   void set_start_bitrate_bps(unsigned int start_bitrate_bps);
     51 
     52   virtual void OnReceiveBitrateChanged(const std::vector<unsigned int>& ssrcs,
     53                                        unsigned int bitrate) OVERRIDE;
     54 
     55   virtual bool SendRtp(const uint8_t* packet, size_t length) OVERRIDE;
     56 
     57   virtual bool SendRtcp(const uint8_t* packet, size_t length) OVERRIDE;
     58 
     59   EventTypeWrapper Wait();
     60 
     61  private:
     62   void ReportResult(const std::string& measurement,
     63                     size_t value,
     64                     const std::string& units);
     65   void TriggerTestDone() EXCLUSIVE_LOCKS_REQUIRED(crit_);
     66 
     67   Clock* const clock_;
     68   const scoped_ptr<EventWrapper> test_done_;
     69   const scoped_ptr<RtpHeaderParser> rtp_parser_;
     70   scoped_ptr<RtpRtcp> rtp_rtcp_;
     71   internal::TransportAdapter feedback_transport_;
     72   const scoped_ptr<ReceiveStatistics> receive_stats_;
     73   const scoped_ptr<RTPPayloadRegistry> payload_registry_;
     74   scoped_ptr<RemoteBitrateEstimator> remote_bitrate_estimator_;
     75 
     76   const scoped_ptr<CriticalSectionWrapper> crit_;
     77   unsigned int expected_bitrate_bps_ GUARDED_BY(crit_);
     78   unsigned int start_bitrate_bps_ GUARDED_BY(crit_);
     79   SsrcMap rtx_media_ssrcs_ GUARDED_BY(crit_);
     80   size_t total_sent_ GUARDED_BY(crit_);
     81   size_t padding_sent_ GUARDED_BY(crit_);
     82   size_t rtx_media_sent_ GUARDED_BY(crit_);
     83   int total_packets_sent_ GUARDED_BY(crit_);
     84   int padding_packets_sent_ GUARDED_BY(crit_);
     85   int rtx_media_packets_sent_ GUARDED_BY(crit_);
     86   int64_t test_start_ms_ GUARDED_BY(crit_);
     87   int64_t ramp_up_finished_ms_ GUARDED_BY(crit_);
     88 };
     89 
     90 class LowRateStreamObserver : public test::DirectTransport,
     91                               public RemoteBitrateObserver,
     92                               public PacketReceiver {
     93  public:
     94   LowRateStreamObserver(newapi::Transport* feedback_transport,
     95                         Clock* clock,
     96                         size_t number_of_streams,
     97                         bool rtx_used);
     98 
     99   virtual void SetSendStream(const VideoSendStream* send_stream);
    100 
    101   virtual void OnReceiveBitrateChanged(const std::vector<unsigned int>& ssrcs,
    102                                        unsigned int bitrate);
    103 
    104   virtual bool SendRtp(const uint8_t* data, size_t length) OVERRIDE;
    105 
    106   virtual DeliveryStatus DeliverPacket(const uint8_t* packet,
    107                                        size_t length) OVERRIDE;
    108 
    109   virtual bool SendRtcp(const uint8_t* packet, size_t length) OVERRIDE;
    110 
    111   // Produces a string similar to "1stream_nortx", depending on the values of
    112   // number_of_streams_ and rtx_used_;
    113   std::string GetModifierString();
    114 
    115   // This method defines the state machine for the ramp up-down-up test.
    116   void EvolveTestState(unsigned int bitrate_bps);
    117 
    118   EventTypeWrapper Wait();
    119 
    120  private:
    121   static const unsigned int kHighBandwidthLimitBps = 80000;
    122   static const unsigned int kExpectedHighBitrateBps = 60000;
    123   static const unsigned int kLowBandwidthLimitBps = 20000;
    124   static const unsigned int kExpectedLowBitrateBps = 20000;
    125   enum TestStates { kFirstRampup, kLowRate, kSecondRampup };
    126 
    127   Clock* const clock_;
    128   const size_t number_of_streams_;
    129   const bool rtx_used_;
    130   const scoped_ptr<EventWrapper> test_done_;
    131   const scoped_ptr<RtpHeaderParser> rtp_parser_;
    132   scoped_ptr<RtpRtcp> rtp_rtcp_;
    133   internal::TransportAdapter feedback_transport_;
    134   const scoped_ptr<ReceiveStatistics> receive_stats_;
    135   scoped_ptr<RemoteBitrateEstimator> remote_bitrate_estimator_;
    136 
    137   scoped_ptr<CriticalSectionWrapper> crit_;
    138   const VideoSendStream* send_stream_ GUARDED_BY(crit_);
    139   FakeNetworkPipe::Config forward_transport_config_ GUARDED_BY(crit_);
    140   TestStates test_state_ GUARDED_BY(crit_);
    141   int64_t state_start_ms_ GUARDED_BY(crit_);
    142   int64_t interval_start_ms_ GUARDED_BY(crit_);
    143   unsigned int last_remb_bps_ GUARDED_BY(crit_);
    144   size_t sent_bytes_ GUARDED_BY(crit_);
    145   size_t total_overuse_bytes_ GUARDED_BY(crit_);
    146   bool suspended_in_stats_ GUARDED_BY(crit_);
    147 };
    148 
    149 class RampUpTest : public test::CallTest {
    150  protected:
    151   void RunRampUpTest(bool rtx,
    152                      size_t num_streams,
    153                      unsigned int start_bitrate_bps,
    154                      const std::string& extension_type);
    155 
    156   void RunRampUpDownUpTest(size_t number_of_streams, bool rtx);
    157 };
    158 }  // namespace webrtc
    159 #endif  // WEBRTC_VIDEO_RAMPUP_TESTS_H_
    160