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