149927ede24f34de9d095573004028673b121a680stefan@webrtc.org/*
249927ede24f34de9d095573004028673b121a680stefan@webrtc.org *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
349927ede24f34de9d095573004028673b121a680stefan@webrtc.org *
449927ede24f34de9d095573004028673b121a680stefan@webrtc.org *  Use of this source code is governed by a BSD-style license
549927ede24f34de9d095573004028673b121a680stefan@webrtc.org *  that can be found in the LICENSE file in the root of the source
649927ede24f34de9d095573004028673b121a680stefan@webrtc.org *  tree. An additional intellectual property rights grant can be found
749927ede24f34de9d095573004028673b121a680stefan@webrtc.org *  in the file PATENTS.  All contributing project authors may
849927ede24f34de9d095573004028673b121a680stefan@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
949927ede24f34de9d095573004028673b121a680stefan@webrtc.org */
1049927ede24f34de9d095573004028673b121a680stefan@webrtc.org
1149927ede24f34de9d095573004028673b121a680stefan@webrtc.org#ifndef WEBRTC_VIDEO_RAMPUP_TESTS_H_
1249927ede24f34de9d095573004028673b121a680stefan@webrtc.org#define WEBRTC_VIDEO_RAMPUP_TESTS_H_
1349927ede24f34de9d095573004028673b121a680stefan@webrtc.org
1449927ede24f34de9d095573004028673b121a680stefan@webrtc.org#include <map>
1549927ede24f34de9d095573004028673b121a680stefan@webrtc.org#include <string>
1649927ede24f34de9d095573004028673b121a680stefan@webrtc.org#include <vector>
1749927ede24f34de9d095573004028673b121a680stefan@webrtc.org
1849927ede24f34de9d095573004028673b121a680stefan@webrtc.org#include "webrtc/call.h"
1949927ede24f34de9d095573004028673b121a680stefan@webrtc.org#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
2049927ede24f34de9d095573004028673b121a680stefan@webrtc.org#include "webrtc/system_wrappers/interface/event_wrapper.h"
2149927ede24f34de9d095573004028673b121a680stefan@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
2249927ede24f34de9d095573004028673b121a680stefan@webrtc.org#include "webrtc/test/call_test.h"
2349927ede24f34de9d095573004028673b121a680stefan@webrtc.org#include "webrtc/video/transport_adapter.h"
2449927ede24f34de9d095573004028673b121a680stefan@webrtc.org
2549927ede24f34de9d095573004028673b121a680stefan@webrtc.orgnamespace webrtc {
2649927ede24f34de9d095573004028673b121a680stefan@webrtc.org
2749927ede24f34de9d095573004028673b121a680stefan@webrtc.orgstatic const int kTransmissionTimeOffsetExtensionId = 6;
2849927ede24f34de9d095573004028673b121a680stefan@webrtc.orgstatic const int kAbsSendTimeExtensionId = 7;
2949927ede24f34de9d095573004028673b121a680stefan@webrtc.orgstatic const unsigned int kSingleStreamTargetBps = 1000000;
3049927ede24f34de9d095573004028673b121a680stefan@webrtc.org
3149927ede24f34de9d095573004028673b121a680stefan@webrtc.orgclass Clock;
3249927ede24f34de9d095573004028673b121a680stefan@webrtc.orgclass CriticalSectionWrapper;
3349927ede24f34de9d095573004028673b121a680stefan@webrtc.orgclass ReceiveStatistics;
3449927ede24f34de9d095573004028673b121a680stefan@webrtc.orgclass RtpHeaderParser;
3549927ede24f34de9d095573004028673b121a680stefan@webrtc.orgclass RTPPayloadRegistry;
3649927ede24f34de9d095573004028673b121a680stefan@webrtc.orgclass RtpRtcp;
3749927ede24f34de9d095573004028673b121a680stefan@webrtc.org
3849927ede24f34de9d095573004028673b121a680stefan@webrtc.orgclass StreamObserver : public newapi::Transport, public RemoteBitrateObserver {
3949927ede24f34de9d095573004028673b121a680stefan@webrtc.org public:
4049927ede24f34de9d095573004028673b121a680stefan@webrtc.org  typedef std::map<uint32_t, int> BytesSentMap;
4149927ede24f34de9d095573004028673b121a680stefan@webrtc.org  typedef std::map<uint32_t, uint32_t> SsrcMap;
4249927ede24f34de9d095573004028673b121a680stefan@webrtc.org  StreamObserver(const SsrcMap& rtx_media_ssrcs,
4349927ede24f34de9d095573004028673b121a680stefan@webrtc.org                 newapi::Transport* feedback_transport,
4449927ede24f34de9d095573004028673b121a680stefan@webrtc.org                 Clock* clock,
4549927ede24f34de9d095573004028673b121a680stefan@webrtc.org                 RemoteBitrateEstimatorFactory* rbe_factory,
4649927ede24f34de9d095573004028673b121a680stefan@webrtc.org                 RateControlType control_type);
4749927ede24f34de9d095573004028673b121a680stefan@webrtc.org
4849927ede24f34de9d095573004028673b121a680stefan@webrtc.org  void set_expected_bitrate_bps(unsigned int expected_bitrate_bps);
4949927ede24f34de9d095573004028673b121a680stefan@webrtc.org
5049927ede24f34de9d095573004028673b121a680stefan@webrtc.org  void set_start_bitrate_bps(unsigned int start_bitrate_bps);
5149927ede24f34de9d095573004028673b121a680stefan@webrtc.org
5249927ede24f34de9d095573004028673b121a680stefan@webrtc.org  virtual void OnReceiveBitrateChanged(const std::vector<unsigned int>& ssrcs,
5349927ede24f34de9d095573004028673b121a680stefan@webrtc.org                                       unsigned int bitrate) OVERRIDE;
5449927ede24f34de9d095573004028673b121a680stefan@webrtc.org
5549927ede24f34de9d095573004028673b121a680stefan@webrtc.org  virtual bool SendRtp(const uint8_t* packet, size_t length) OVERRIDE;
5649927ede24f34de9d095573004028673b121a680stefan@webrtc.org
5749927ede24f34de9d095573004028673b121a680stefan@webrtc.org  virtual bool SendRtcp(const uint8_t* packet, size_t length) OVERRIDE;
5849927ede24f34de9d095573004028673b121a680stefan@webrtc.org
5949927ede24f34de9d095573004028673b121a680stefan@webrtc.org  EventTypeWrapper Wait();
6049927ede24f34de9d095573004028673b121a680stefan@webrtc.org
6149927ede24f34de9d095573004028673b121a680stefan@webrtc.org private:
6249927ede24f34de9d095573004028673b121a680stefan@webrtc.org  void ReportResult(const std::string& measurement,
6349927ede24f34de9d095573004028673b121a680stefan@webrtc.org                    size_t value,
6449927ede24f34de9d095573004028673b121a680stefan@webrtc.org                    const std::string& units);
6549927ede24f34de9d095573004028673b121a680stefan@webrtc.org  void TriggerTestDone() EXCLUSIVE_LOCKS_REQUIRED(crit_);
6649927ede24f34de9d095573004028673b121a680stefan@webrtc.org
6749927ede24f34de9d095573004028673b121a680stefan@webrtc.org  Clock* const clock_;
6849927ede24f34de9d095573004028673b121a680stefan@webrtc.org  const scoped_ptr<EventWrapper> test_done_;
6949927ede24f34de9d095573004028673b121a680stefan@webrtc.org  const scoped_ptr<RtpHeaderParser> rtp_parser_;
7049927ede24f34de9d095573004028673b121a680stefan@webrtc.org  scoped_ptr<RtpRtcp> rtp_rtcp_;
7149927ede24f34de9d095573004028673b121a680stefan@webrtc.org  internal::TransportAdapter feedback_transport_;
7249927ede24f34de9d095573004028673b121a680stefan@webrtc.org  const scoped_ptr<ReceiveStatistics> receive_stats_;
7349927ede24f34de9d095573004028673b121a680stefan@webrtc.org  const scoped_ptr<RTPPayloadRegistry> payload_registry_;
7449927ede24f34de9d095573004028673b121a680stefan@webrtc.org  scoped_ptr<RemoteBitrateEstimator> remote_bitrate_estimator_;
7549927ede24f34de9d095573004028673b121a680stefan@webrtc.org
7649927ede24f34de9d095573004028673b121a680stefan@webrtc.org  const scoped_ptr<CriticalSectionWrapper> crit_;
7749927ede24f34de9d095573004028673b121a680stefan@webrtc.org  unsigned int expected_bitrate_bps_ GUARDED_BY(crit_);
7849927ede24f34de9d095573004028673b121a680stefan@webrtc.org  unsigned int start_bitrate_bps_ GUARDED_BY(crit_);
7949927ede24f34de9d095573004028673b121a680stefan@webrtc.org  SsrcMap rtx_media_ssrcs_ GUARDED_BY(crit_);
8049927ede24f34de9d095573004028673b121a680stefan@webrtc.org  size_t total_sent_ GUARDED_BY(crit_);
8149927ede24f34de9d095573004028673b121a680stefan@webrtc.org  size_t padding_sent_ GUARDED_BY(crit_);
8249927ede24f34de9d095573004028673b121a680stefan@webrtc.org  size_t rtx_media_sent_ GUARDED_BY(crit_);
8349927ede24f34de9d095573004028673b121a680stefan@webrtc.org  int total_packets_sent_ GUARDED_BY(crit_);
8449927ede24f34de9d095573004028673b121a680stefan@webrtc.org  int padding_packets_sent_ GUARDED_BY(crit_);
8549927ede24f34de9d095573004028673b121a680stefan@webrtc.org  int rtx_media_packets_sent_ GUARDED_BY(crit_);
8649927ede24f34de9d095573004028673b121a680stefan@webrtc.org  int64_t test_start_ms_ GUARDED_BY(crit_);
8749927ede24f34de9d095573004028673b121a680stefan@webrtc.org  int64_t ramp_up_finished_ms_ GUARDED_BY(crit_);
8849927ede24f34de9d095573004028673b121a680stefan@webrtc.org};
8949927ede24f34de9d095573004028673b121a680stefan@webrtc.org
9049927ede24f34de9d095573004028673b121a680stefan@webrtc.orgclass LowRateStreamObserver : public test::DirectTransport,
9149927ede24f34de9d095573004028673b121a680stefan@webrtc.org                              public RemoteBitrateObserver,
9249927ede24f34de9d095573004028673b121a680stefan@webrtc.org                              public PacketReceiver {
9349927ede24f34de9d095573004028673b121a680stefan@webrtc.org public:
9449927ede24f34de9d095573004028673b121a680stefan@webrtc.org  LowRateStreamObserver(newapi::Transport* feedback_transport,
9549927ede24f34de9d095573004028673b121a680stefan@webrtc.org                        Clock* clock,
9649927ede24f34de9d095573004028673b121a680stefan@webrtc.org                        size_t number_of_streams,
9749927ede24f34de9d095573004028673b121a680stefan@webrtc.org                        bool rtx_used);
9849927ede24f34de9d095573004028673b121a680stefan@webrtc.org
9949927ede24f34de9d095573004028673b121a680stefan@webrtc.org  virtual void SetSendStream(const VideoSendStream* send_stream);
10049927ede24f34de9d095573004028673b121a680stefan@webrtc.org
10149927ede24f34de9d095573004028673b121a680stefan@webrtc.org  virtual void OnReceiveBitrateChanged(const std::vector<unsigned int>& ssrcs,
10249927ede24f34de9d095573004028673b121a680stefan@webrtc.org                                       unsigned int bitrate);
10349927ede24f34de9d095573004028673b121a680stefan@webrtc.org
10449927ede24f34de9d095573004028673b121a680stefan@webrtc.org  virtual bool SendRtp(const uint8_t* data, size_t length) OVERRIDE;
10549927ede24f34de9d095573004028673b121a680stefan@webrtc.org
10649927ede24f34de9d095573004028673b121a680stefan@webrtc.org  virtual DeliveryStatus DeliverPacket(const uint8_t* packet,
10749927ede24f34de9d095573004028673b121a680stefan@webrtc.org                                       size_t length) OVERRIDE;
10849927ede24f34de9d095573004028673b121a680stefan@webrtc.org
10949927ede24f34de9d095573004028673b121a680stefan@webrtc.org  virtual bool SendRtcp(const uint8_t* packet, size_t length) OVERRIDE;
11049927ede24f34de9d095573004028673b121a680stefan@webrtc.org
11149927ede24f34de9d095573004028673b121a680stefan@webrtc.org  // Produces a string similar to "1stream_nortx", depending on the values of
11249927ede24f34de9d095573004028673b121a680stefan@webrtc.org  // number_of_streams_ and rtx_used_;
11349927ede24f34de9d095573004028673b121a680stefan@webrtc.org  std::string GetModifierString();
11449927ede24f34de9d095573004028673b121a680stefan@webrtc.org
11549927ede24f34de9d095573004028673b121a680stefan@webrtc.org  // This method defines the state machine for the ramp up-down-up test.
11649927ede24f34de9d095573004028673b121a680stefan@webrtc.org  void EvolveTestState(unsigned int bitrate_bps);
11749927ede24f34de9d095573004028673b121a680stefan@webrtc.org
11849927ede24f34de9d095573004028673b121a680stefan@webrtc.org  EventTypeWrapper Wait();
11949927ede24f34de9d095573004028673b121a680stefan@webrtc.org
12049927ede24f34de9d095573004028673b121a680stefan@webrtc.org private:
12149927ede24f34de9d095573004028673b121a680stefan@webrtc.org  static const unsigned int kHighBandwidthLimitBps = 80000;
12249927ede24f34de9d095573004028673b121a680stefan@webrtc.org  static const unsigned int kExpectedHighBitrateBps = 60000;
12349927ede24f34de9d095573004028673b121a680stefan@webrtc.org  static const unsigned int kLowBandwidthLimitBps = 20000;
12449927ede24f34de9d095573004028673b121a680stefan@webrtc.org  static const unsigned int kExpectedLowBitrateBps = 20000;
12549927ede24f34de9d095573004028673b121a680stefan@webrtc.org  enum TestStates { kFirstRampup, kLowRate, kSecondRampup };
12649927ede24f34de9d095573004028673b121a680stefan@webrtc.org
12749927ede24f34de9d095573004028673b121a680stefan@webrtc.org  Clock* const clock_;
12849927ede24f34de9d095573004028673b121a680stefan@webrtc.org  const size_t number_of_streams_;
12949927ede24f34de9d095573004028673b121a680stefan@webrtc.org  const bool rtx_used_;
13049927ede24f34de9d095573004028673b121a680stefan@webrtc.org  const scoped_ptr<EventWrapper> test_done_;
13149927ede24f34de9d095573004028673b121a680stefan@webrtc.org  const scoped_ptr<RtpHeaderParser> rtp_parser_;
13249927ede24f34de9d095573004028673b121a680stefan@webrtc.org  scoped_ptr<RtpRtcp> rtp_rtcp_;
13349927ede24f34de9d095573004028673b121a680stefan@webrtc.org  internal::TransportAdapter feedback_transport_;
13449927ede24f34de9d095573004028673b121a680stefan@webrtc.org  const scoped_ptr<ReceiveStatistics> receive_stats_;
13549927ede24f34de9d095573004028673b121a680stefan@webrtc.org  scoped_ptr<RemoteBitrateEstimator> remote_bitrate_estimator_;
13649927ede24f34de9d095573004028673b121a680stefan@webrtc.org
13749927ede24f34de9d095573004028673b121a680stefan@webrtc.org  scoped_ptr<CriticalSectionWrapper> crit_;
13849927ede24f34de9d095573004028673b121a680stefan@webrtc.org  const VideoSendStream* send_stream_ GUARDED_BY(crit_);
13949927ede24f34de9d095573004028673b121a680stefan@webrtc.org  FakeNetworkPipe::Config forward_transport_config_ GUARDED_BY(crit_);
14049927ede24f34de9d095573004028673b121a680stefan@webrtc.org  TestStates test_state_ GUARDED_BY(crit_);
14149927ede24f34de9d095573004028673b121a680stefan@webrtc.org  int64_t state_start_ms_ GUARDED_BY(crit_);
14249927ede24f34de9d095573004028673b121a680stefan@webrtc.org  int64_t interval_start_ms_ GUARDED_BY(crit_);
14349927ede24f34de9d095573004028673b121a680stefan@webrtc.org  unsigned int last_remb_bps_ GUARDED_BY(crit_);
14449927ede24f34de9d095573004028673b121a680stefan@webrtc.org  size_t sent_bytes_ GUARDED_BY(crit_);
14549927ede24f34de9d095573004028673b121a680stefan@webrtc.org  size_t total_overuse_bytes_ GUARDED_BY(crit_);
14649927ede24f34de9d095573004028673b121a680stefan@webrtc.org  bool suspended_in_stats_ GUARDED_BY(crit_);
14749927ede24f34de9d095573004028673b121a680stefan@webrtc.org};
14849927ede24f34de9d095573004028673b121a680stefan@webrtc.org
14949927ede24f34de9d095573004028673b121a680stefan@webrtc.orgclass RampUpTest : public test::CallTest {
15049927ede24f34de9d095573004028673b121a680stefan@webrtc.org protected:
15149927ede24f34de9d095573004028673b121a680stefan@webrtc.org  void RunRampUpTest(bool rtx,
15249927ede24f34de9d095573004028673b121a680stefan@webrtc.org                     size_t num_streams,
15349927ede24f34de9d095573004028673b121a680stefan@webrtc.org                     unsigned int start_bitrate_bps,
15449927ede24f34de9d095573004028673b121a680stefan@webrtc.org                     const std::string& extension_type);
15549927ede24f34de9d095573004028673b121a680stefan@webrtc.org
15649927ede24f34de9d095573004028673b121a680stefan@webrtc.org  void RunRampUpDownUpTest(size_t number_of_streams, bool rtx);
15749927ede24f34de9d095573004028673b121a680stefan@webrtc.org};
15849927ede24f34de9d095573004028673b121a680stefan@webrtc.org}  // namespace webrtc
15949927ede24f34de9d095573004028673b121a680stefan@webrtc.org#endif  // WEBRTC_VIDEO_RAMPUP_TESTS_H_
160