1686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org/* 2686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org * 4686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org * Use of this source code is governed by a BSD-style license 5686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org * that can be found in the LICENSE file in the root of the source 6686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org * tree. An additional intellectual property rights grant can be found 7686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org * in the file PATENTS. All contributing project authors may 8686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org */ 10686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 11686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org#ifndef WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_REMOTE_BITRATE_ESTIMATOR_UNITTEST_HELPER_H_ 12686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_REMOTE_BITRATE_ESTIMATOR_UNITTEST_HELPER_H_ 13686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 14686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org#include <list> 15686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org#include <map> 16686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org#include <utility> 17686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 18d5d709e492b5592114ecc197516a453acfee46dfpbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 19774b3d38a4a0f1a8ec08972a3c543cb5d607ce13henrike@webrtc.org#include "webrtc/base/constructormagic.h" 202a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h" 212a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org#include "webrtc/system_wrappers/interface/clock.h" 222a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h" 23686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 24686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.orgnamespace webrtc { 25686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.orgnamespace testing { 26686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 27686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.orgclass TestBitrateObserver : public RemoteBitrateObserver { 28686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org public: 29686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org TestBitrateObserver() : updated_(false), latest_bitrate_(0) {} 30b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org virtual ~TestBitrateObserver() {} 31686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 32b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org virtual void OnReceiveBitrateChanged(const std::vector<unsigned int>& ssrcs, 33988a5b39f0bed79e4dd366fb0bd8e88ec887741epbos@webrtc.org unsigned int bitrate) OVERRIDE; 34686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 35988a5b39f0bed79e4dd366fb0bd8e88ec887741epbos@webrtc.org void Reset() { updated_ = false; } 36686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 37988a5b39f0bed79e4dd366fb0bd8e88ec887741epbos@webrtc.org bool updated() const { return updated_; } 38686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 39988a5b39f0bed79e4dd366fb0bd8e88ec887741epbos@webrtc.org unsigned int latest_bitrate() const { return latest_bitrate_; } 40686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 41686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org private: 42686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org bool updated_; 43686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org unsigned int latest_bitrate_; 44686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org}; 45686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 46686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.orgclass RtpStream { 47686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org public: 48686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org struct RtpPacket { 49686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org int64_t send_time; 50686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org int64_t arrival_time; 51686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org uint32_t rtp_timestamp; 52686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org unsigned int size; 53686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org unsigned int ssrc; 54686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org }; 55686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 56686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org struct RtcpPacket { 57686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org uint32_t ntp_secs; 58686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org uint32_t ntp_frac; 59686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org uint32_t timestamp; 60686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org unsigned int ssrc; 61686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org }; 62686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 63686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org typedef std::list<RtpPacket*> PacketList; 64686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 652a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org enum { kSendSideOffsetUs = 1000000 }; 66686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 67686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org RtpStream(int fps, int bitrate_bps, unsigned int ssrc, unsigned int frequency, 68686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org uint32_t timestamp_offset, int64_t rtcp_receive_time); 69686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org void set_rtp_timestamp_offset(uint32_t offset); 70686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 71686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // Generates a new frame for this stream. If called too soon after the 72686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // previous frame, no frame will be generated. The frame is split into 73686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // packets. 742a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org int64_t GenerateFrame(int64_t time_now_us, PacketList* packets); 75686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 76686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // The send-side time when the next frame can be generated. 77686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org double next_rtp_time() const; 78686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 79686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // Generates an RTCP packet. 802a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org RtcpPacket* Rtcp(int64_t time_now_us); 81686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 82686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org void set_bitrate_bps(int bitrate_bps); 83686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 84686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org int bitrate_bps() const; 85686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 86686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org unsigned int ssrc() const; 87686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 88686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org static bool Compare(const std::pair<unsigned int, RtpStream*>& left, 89686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org const std::pair<unsigned int, RtpStream*>& right); 90686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 91686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org private: 922a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org enum { kRtcpIntervalUs = 1000000 }; 93686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 94686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org int fps_; 95686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org int bitrate_bps_; 96686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org unsigned int ssrc_; 97686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org unsigned int frequency_; 982a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org int64_t next_rtp_time_; 992a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org int64_t next_rtcp_time_; 100686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org uint32_t rtp_timestamp_offset_; 101686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org const double kNtpFracPerMs; 102686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 103686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org DISALLOW_COPY_AND_ASSIGN(RtpStream); 104686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org}; 105686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 106686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.orgclass StreamGenerator { 107686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org public: 108686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org typedef std::list<RtpStream::RtcpPacket*> RtcpList; 109686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 110686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org StreamGenerator(int capacity, double time_now); 111686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 112686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org ~StreamGenerator(); 113686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 114686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // Add a new stream. 115686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org void AddStream(RtpStream* stream); 116686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 117686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // Set the link capacity. 118686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org void set_capacity_bps(int capacity_bps); 119686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 120686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // Divides |bitrate_bps| among all streams. The allocated bitrate per stream 121686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // is decided by the initial allocation ratios. 122b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org void SetBitrateBps(int bitrate_bps); 123686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 124686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // Set the RTP timestamp offset for the stream identified by |ssrc|. 125686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org void set_rtp_timestamp_offset(unsigned int ssrc, uint32_t offset); 126686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 127686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // TODO(holmer): Break out the channel simulation part from this class to make 128686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // it possible to simulate different types of channels. 1292a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org int64_t GenerateFrame(RtpStream::PacketList* packets, int64_t time_now_us); 130686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 131686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org private: 132686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org typedef std::map<unsigned int, RtpStream*> StreamMap; 133686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 134686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // Capacity of the simulated channel in bits per second. 135686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org int capacity_; 136686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // The time when the last packet arrived. 1372a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org int64_t prev_arrival_time_us_; 138686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // All streams being transmitted on this simulated channel. 139686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org StreamMap streams_; 140686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 141686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org DISALLOW_COPY_AND_ASSIGN(StreamGenerator); 142686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org}; 143686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org} // namespace testing 144686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 145686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.orgclass RemoteBitrateEstimatorTest : public ::testing::Test { 146686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org public: 147686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org RemoteBitrateEstimatorTest(); 148988a5b39f0bed79e4dd366fb0bd8e88ec887741epbos@webrtc.org virtual ~RemoteBitrateEstimatorTest(); 149686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 150686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org protected: 151b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org virtual void SetUp() = 0; 152686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 153686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org void AddDefaultStream(); 154686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 155b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org // Helper to convert some time format to resolution used in absolute send time 156b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org // header extension, rounded upwards. |t| is the time to convert, in some 157b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org // resolution. |denom| is the value to divide |t| by to get whole seconds, 158b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org // e.g. |denom| = 1000 if |t| is in milliseconds. 159b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org static uint32_t AbsSendTime(int64_t t, int64_t denom); 160b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org 161b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org // Helper to add two absolute send time values and keep it less than 1<<24. 162b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org static uint32_t AddAbsSendTime(uint32_t t1, uint32_t t2); 163b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org 164b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org // Helper to create a WebRtcRTPHeader containing the relevant data for the 165b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org // estimator (all other fields are cleared) and call IncomingPacket on the 166b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org // estimator. 167b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org void IncomingPacket(uint32_t ssrc, 168b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org uint32_t payload_size, 169b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org int64_t arrival_time, 170b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org uint32_t rtp_timestamp, 171b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org uint32_t absolute_send_time); 172b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org 173686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // Generates a frame of packets belonging to a stream at a given bitrate and 174686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // with a given ssrc. The stream is pushed through a very simple simulated 175686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // network, and is then given to the receive-side bandwidth estimator. 176686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // Returns true if an over-use was seen, false otherwise. 177686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // The StreamGenerator::updated() should be used to check for any changes in 178686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // target bitrate after the call to this function. 179686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org bool GenerateAndProcessFrame(unsigned int ssrc, unsigned int bitrate_bps); 180686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 1812a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org // Run the bandwidth estimator with a stream of |number_of_frames| frames, or 1822a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org // until it reaches |target_bitrate|. 183686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // Can for instance be used to run the estimator for some time to get it 184686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org // into a steady state. 185686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org unsigned int SteadyStateRun(unsigned int ssrc, 186686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org int number_of_frames, 187686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org unsigned int start_bitrate, 188686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org unsigned int min_bitrate, 1892a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org unsigned int max_bitrate, 1902a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org unsigned int target_bitrate); 191686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 192b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org void InitialBehaviorTestHelper(unsigned int expected_converge_bitrate); 193b9d0acb4017586521b5a11d8b73ad8c733958a53stefan@webrtc.org void RateIncreaseReorderingTestHelper(unsigned int expected_bitrate); 194b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org void RateIncreaseRtpTimestampsTestHelper(); 195b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org void CapacityDropTestHelper(int number_of_streams, 196b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org bool wrap_time_stamp, 197b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org unsigned int expected_converge_bitrate, 198b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org unsigned int expected_bitrate_drop_delta); 199b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org 20098b201189e601aa1863085e0016e868d2db416b1pbos@webrtc.org static const unsigned int kDefaultSsrc; 20196583a9de5c2d521fc4a2ffa2aac3d5dcc392cb9stefan@webrtc.org static const int kArrivalTimeClockOffsetMs = 60000; 202686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 2032a5dbce193b4ee594f0bb66c4f1a2bb24f31e621stefan@webrtc.org SimulatedClock clock_; // Time at the receiver. 204686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org scoped_ptr<testing::TestBitrateObserver> bitrate_observer_; 205b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org scoped_ptr<RemoteBitrateEstimator> bitrate_estimator_; 206686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org scoped_ptr<testing::StreamGenerator> stream_generator_; 207686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 208686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org DISALLOW_COPY_AND_ASSIGN(RemoteBitrateEstimatorTest); 209686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org}; 210b7716d8746900180a583dba863c2cea7e4e0959csolenberg@webrtc.org} // namespace webrtc 211686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org 212686a447c4859e3c351601196f4e86b6569db65ecstefan@webrtc.org#endif // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_REMOTE_BITRATE_ESTIMATOR_UNITTEST_HELPER_H_ 213