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