blob: f6dac6bc06044b1e9fbae8ff43a6a5be50802ea3 [file] [log] [blame]
pbos@webrtc.org5ab75672013-12-16 12:24:44 +00001/*
2 * Copyright (c) 2013 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#include <functional>
11#include <list>
12#include <string>
13
14#include "testing/gtest/include/gtest/gtest.h"
15
pbos@webrtc.org2b4ce3a2015-03-23 13:12:24 +000016#include "webrtc/base/checks.h"
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000017#include "webrtc/base/scoped_ptr.h"
pbos@webrtc.org38344ed2014-09-24 06:05:00 +000018#include "webrtc/base/thread_annotations.h"
pbos@webrtc.org5ab75672013-12-16 12:24:44 +000019#include "webrtc/call.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010020#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
21#include "webrtc/system_wrappers/include/event_wrapper.h"
22#include "webrtc/system_wrappers/include/trace.h"
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000023#include "webrtc/test/call_test.h"
pbos@webrtc.org5ab75672013-12-16 12:24:44 +000024#include "webrtc/test/direct_transport.h"
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +000025#include "webrtc/test/encoder_settings.h"
pbos@webrtc.org5ab75672013-12-16 12:24:44 +000026#include "webrtc/test/fake_decoder.h"
27#include "webrtc/test/fake_encoder.h"
Fredrik Solenberg0ccae132015-11-03 10:15:49 +010028#include "webrtc/test/mock_voice_engine.h"
pbos@webrtc.org5ab75672013-12-16 12:24:44 +000029#include "webrtc/test/frame_generator_capturer.h"
30
31namespace webrtc {
andresp@webrtc.orgb941fe82014-07-07 08:50:48 +000032namespace {
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020033// Note: If you consider to re-use this class, think twice and instead consider
34// writing tests that don't depend on the trace system.
andresp@webrtc.orgb941fe82014-07-07 08:50:48 +000035class TraceObserver {
36 public:
37 TraceObserver() {
38 Trace::set_level_filter(kTraceTerseInfo);
39
40 Trace::CreateTrace();
41 Trace::SetTraceCallback(&callback_);
42
43 // Call webrtc trace to initialize the tracer that would otherwise trigger a
44 // data-race if left to be initialized by multiple threads (i.e. threads
45 // spawned by test::DirectTransport members in BitrateEstimatorTest).
Fredrik Solenberg0ccae132015-11-03 10:15:49 +010046 WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1,
andresp@webrtc.orgb941fe82014-07-07 08:50:48 +000047 "Instantiate without data races.");
48 }
49
50 ~TraceObserver() {
pbos@webrtc.org2b4ce3a2015-03-23 13:12:24 +000051 Trace::SetTraceCallback(nullptr);
andresp@webrtc.orgb941fe82014-07-07 08:50:48 +000052 Trace::ReturnTrace();
53 }
54
55 void PushExpectedLogLine(const std::string& expected_log_line) {
56 callback_.PushExpectedLogLine(expected_log_line);
57 }
58
Fredrik Solenberg0ccae132015-11-03 10:15:49 +010059 EventTypeWrapper Wait() { return callback_.Wait(); }
andresp@webrtc.orgb941fe82014-07-07 08:50:48 +000060
61 private:
62 class Callback : public TraceCallback {
63 public:
Peter Boströmf2f82832015-05-01 13:00:41 +020064 Callback() : done_(EventWrapper::Create()) {}
andresp@webrtc.orgb941fe82014-07-07 08:50:48 +000065
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000066 void Print(TraceLevel level, const char* message, int length) override {
Peter Boströmf2f82832015-05-01 13:00:41 +020067 rtc::CritScope lock(&crit_sect_);
andresp@webrtc.orgb941fe82014-07-07 08:50:48 +000068 std::string msg(message);
69 if (msg.find("BitrateEstimator") != std::string::npos) {
70 received_log_lines_.push_back(msg);
71 }
72 int num_popped = 0;
73 while (!received_log_lines_.empty() && !expected_log_lines_.empty()) {
74 std::string a = received_log_lines_.front();
75 std::string b = expected_log_lines_.front();
76 received_log_lines_.pop_front();
77 expected_log_lines_.pop_front();
78 num_popped++;
79 EXPECT_TRUE(a.find(b) != std::string::npos);
80 }
81 if (expected_log_lines_.size() <= 0) {
82 if (num_popped > 0) {
83 done_->Set();
84 }
85 return;
86 }
87 }
88
89 EventTypeWrapper Wait() {
90 return done_->Wait(test::CallTest::kDefaultTimeoutMs);
91 }
92
93 void PushExpectedLogLine(const std::string& expected_log_line) {
Peter Boströmf2f82832015-05-01 13:00:41 +020094 rtc::CritScope lock(&crit_sect_);
andresp@webrtc.orgb941fe82014-07-07 08:50:48 +000095 expected_log_lines_.push_back(expected_log_line);
96 }
97
98 private:
99 typedef std::list<std::string> Strings;
Peter Boströmf2f82832015-05-01 13:00:41 +0200100 rtc::CriticalSection crit_sect_;
andresp@webrtc.orgb941fe82014-07-07 08:50:48 +0000101 Strings received_log_lines_ GUARDED_BY(crit_sect_);
102 Strings expected_log_lines_ GUARDED_BY(crit_sect_);
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +0000103 rtc::scoped_ptr<EventWrapper> done_;
andresp@webrtc.orgb941fe82014-07-07 08:50:48 +0000104 };
105
106 Callback callback_;
107};
108} // namespace
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000109
110static const int kTOFExtensionId = 4;
111static const int kASTExtensionId = 5;
112
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000113class BitrateEstimatorTest : public test::CallTest {
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000114 public:
stefanf116bd02015-10-27 08:29:42 -0700115 BitrateEstimatorTest() : receive_config_(nullptr) {}
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000116
Fredrik Solenberg0ccae132015-11-03 10:15:49 +0100117 virtual ~BitrateEstimatorTest() { EXPECT_TRUE(streams_.empty()); }
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000118
119 virtual void SetUp() {
Fredrik Solenberg0ccae132015-11-03 10:15:49 +0100120 EXPECT_CALL(mock_voice_engine_, GetEventLog())
121 .WillRepeatedly(testing::Return(nullptr));
122
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200123 Call::Config config;
Fredrik Solenberg0ccae132015-11-03 10:15:49 +0100124 config.voice_engine = &mock_voice_engine_;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200125 receiver_call_.reset(Call::Create(config));
126 sender_call_.reset(Call::Create(config));
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000127
stefanf116bd02015-10-27 08:29:42 -0700128 send_transport_.reset(new test::DirectTransport(sender_call_.get()));
129 send_transport_->SetReceiver(receiver_call_->Receiver());
130 receive_transport_.reset(new test::DirectTransport(receiver_call_.get()));
131 receive_transport_->SetReceiver(sender_call_->Receiver());
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000132
stefanf116bd02015-10-27 08:29:42 -0700133 send_config_ = VideoSendStream::Config(send_transport_.get());
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000134 send_config_.rtp.ssrcs.push_back(kSendSsrcs[0]);
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +0000135 // Encoders will be set separately per stream.
pbos@webrtc.org2b4ce3a2015-03-23 13:12:24 +0000136 send_config_.encoder_settings.encoder = nullptr;
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000137 send_config_.encoder_settings.payload_name = "FAKE";
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000138 send_config_.encoder_settings.payload_type = kFakeSendPayloadType;
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000139 encoder_config_.streams = test::CreateVideoStreams(1);
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000140
stefanf116bd02015-10-27 08:29:42 -0700141 receive_config_ = VideoReceiveStream::Config(receive_transport_.get());
pbos@webrtc.org776e6f22014-10-29 15:28:39 +0000142 // receive_config_.decoders will be set by every stream separately.
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000143 receive_config_.rtp.remote_ssrc = send_config_.rtp.ssrcs[0];
144 receive_config_.rtp.local_ssrc = kReceiverLocalSsrc;
Peter Boströmd7da1202015-06-05 14:09:38 +0200145 receive_config_.rtp.remb = true;
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000146 receive_config_.rtp.extensions.push_back(
147 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId));
148 receive_config_.rtp.extensions.push_back(
149 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId));
150 }
151
152 virtual void TearDown() {
153 std::for_each(streams_.begin(), streams_.end(),
Fredrik Solenberg0ccae132015-11-03 10:15:49 +0100154 std::mem_fun(&Stream::StopSending));
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000155
stefanf116bd02015-10-27 08:29:42 -0700156 send_transport_->StopSending();
157 receive_transport_->StopSending();
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000158
159 while (!streams_.empty()) {
160 delete streams_.back();
161 streams_.pop_back();
162 }
163
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000164 receiver_call_.reset();
165 }
166
167 protected:
168 friend class Stream;
169
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000170 class Stream {
171 public:
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200172 Stream(BitrateEstimatorTest* test, bool receive_audio)
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000173 : test_(test),
174 is_sending_receiving_(false),
pbos@webrtc.org2b4ce3a2015-03-23 13:12:24 +0000175 send_stream_(nullptr),
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200176 audio_receive_stream_(nullptr),
177 video_receive_stream_(nullptr),
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000178 frame_generator_capturer_(),
179 fake_encoder_(Clock::GetRealTimeClock()),
180 fake_decoder_() {
181 test_->send_config_.rtp.ssrcs[0]++;
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +0000182 test_->send_config_.encoder_settings.encoder = &fake_encoder_;
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000183 send_stream_ = test_->sender_call_->CreateVideoSendStream(
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000184 test_->send_config_, test_->encoder_config_);
henrikg91d6ede2015-09-17 00:24:34 -0700185 RTC_DCHECK_EQ(1u, test_->encoder_config_.streams.size());
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000186 frame_generator_capturer_.reset(test::FrameGeneratorCapturer::Create(
Fredrik Solenberg0ccae132015-11-03 10:15:49 +0100187 send_stream_->Input(), test_->encoder_config_.streams[0].width,
188 test_->encoder_config_.streams[0].height, 30,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000189 Clock::GetRealTimeClock()));
pbos@webrtc.orga5c8d2c2014-04-24 11:13:21 +0000190 send_stream_->Start();
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000191 frame_generator_capturer_->Start();
192
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200193 if (receive_audio) {
194 AudioReceiveStream::Config receive_config;
195 receive_config.rtp.remote_ssrc = test_->send_config_.rtp.ssrcs[0];
henrikg91d6ede2015-09-17 00:24:34 -0700196 // Bogus non-default id to prevent hitting a RTC_DCHECK when creating
197 // the AudioReceiveStream. Every receive stream has to correspond to
198 // an underlying channel id.
pbos8fc7fa72015-07-15 08:02:58 -0700199 receive_config.voe_channel_id = 0;
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200200 receive_config.rtp.extensions.push_back(
201 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId));
pbos6bb1b6e2015-07-24 07:10:18 -0700202 receive_config.combined_audio_video_bwe = true;
stefanf116bd02015-10-27 08:29:42 -0700203 audio_receive_stream_ =
204 test_->receiver_call_->CreateAudioReceiveStream(receive_config);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200205 } else {
206 VideoReceiveStream::Decoder decoder;
207 decoder.decoder = &fake_decoder_;
208 decoder.payload_type =
209 test_->send_config_.encoder_settings.payload_type;
210 decoder.payload_name =
211 test_->send_config_.encoder_settings.payload_name;
212 test_->receive_config_.decoders.push_back(decoder);
213 test_->receive_config_.rtp.remote_ssrc =
214 test_->send_config_.rtp.ssrcs[0];
215 test_->receive_config_.rtp.local_ssrc++;
216 video_receive_stream_ = test_->receiver_call_->CreateVideoReceiveStream(
217 test_->receive_config_);
218 video_receive_stream_->Start();
219 }
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000220 is_sending_receiving_ = true;
221 }
222
223 ~Stream() {
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200224 EXPECT_FALSE(is_sending_receiving_);
pbos@webrtc.org2b4ce3a2015-03-23 13:12:24 +0000225 frame_generator_capturer_.reset(nullptr);
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000226 test_->sender_call_->DestroyVideoSendStream(send_stream_);
pbos@webrtc.org2b4ce3a2015-03-23 13:12:24 +0000227 send_stream_ = nullptr;
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200228 if (audio_receive_stream_) {
229 test_->receiver_call_->DestroyAudioReceiveStream(audio_receive_stream_);
230 audio_receive_stream_ = nullptr;
231 }
232 if (video_receive_stream_) {
233 test_->receiver_call_->DestroyVideoReceiveStream(video_receive_stream_);
234 video_receive_stream_ = nullptr;
235 }
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000236 }
237
238 void StopSending() {
239 if (is_sending_receiving_) {
240 frame_generator_capturer_->Stop();
pbos@webrtc.orga5c8d2c2014-04-24 11:13:21 +0000241 send_stream_->Stop();
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200242 if (video_receive_stream_) {
243 video_receive_stream_->Stop();
244 }
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000245 is_sending_receiving_ = false;
246 }
247 }
248
249 private:
250 BitrateEstimatorTest* test_;
251 bool is_sending_receiving_;
252 VideoSendStream* send_stream_;
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200253 AudioReceiveStream* audio_receive_stream_;
254 VideoReceiveStream* video_receive_stream_;
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +0000255 rtc::scoped_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_;
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000256 test::FakeEncoder fake_encoder_;
257 test::FakeDecoder fake_decoder_;
258 };
259
Fredrik Solenberg0ccae132015-11-03 10:15:49 +0100260 test::MockVoiceEngine mock_voice_engine_;
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000261 TraceObserver receiver_trace_;
stefanf116bd02015-10-27 08:29:42 -0700262 rtc::scoped_ptr<test::DirectTransport> send_transport_;
263 rtc::scoped_ptr<test::DirectTransport> receive_transport_;
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +0000264 rtc::scoped_ptr<Call> sender_call_;
265 rtc::scoped_ptr<Call> receiver_call_;
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000266 VideoReceiveStream::Config receive_config_;
267 std::vector<Stream*> streams_;
268};
269
Erik Språng468e62a2015-07-06 10:50:47 +0200270static const char* kAbsSendTimeLog =
271 "RemoteBitrateEstimatorAbsSendTime: Instantiating.";
272static const char* kSingleStreamLog =
273 "RemoteBitrateEstimatorSingleStream: Instantiating.";
274
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200275TEST_F(BitrateEstimatorTest, InstantiatesTOFPerDefaultForVideo) {
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000276 send_config_.rtp.extensions.push_back(
277 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId));
Erik Språng468e62a2015-07-06 10:50:47 +0200278 receiver_trace_.PushExpectedLogLine(kSingleStreamLog);
279 receiver_trace_.PushExpectedLogLine(kSingleStreamLog);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200280 streams_.push_back(new Stream(this, false));
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000281 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait());
282}
283
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200284TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForAudio) {
solenberg@webrtc.orgab240512014-01-08 08:59:44 +0000285 send_config_.rtp.extensions.push_back(
286 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId));
Erik Språng468e62a2015-07-06 10:50:47 +0200287 receiver_trace_.PushExpectedLogLine(kSingleStreamLog);
288 receiver_trace_.PushExpectedLogLine(kSingleStreamLog);
solenberg@webrtc.orgab240512014-01-08 08:59:44 +0000289 receiver_trace_.PushExpectedLogLine("Switching to absolute send time RBE.");
Erik Språng468e62a2015-07-06 10:50:47 +0200290 receiver_trace_.PushExpectedLogLine(kAbsSendTimeLog);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200291 streams_.push_back(new Stream(this, true));
solenberg@webrtc.orgab240512014-01-08 08:59:44 +0000292 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait());
293}
294
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200295TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForVideo) {
296 send_config_.rtp.extensions.push_back(
297 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId));
Erik Språng468e62a2015-07-06 10:50:47 +0200298 receiver_trace_.PushExpectedLogLine(kSingleStreamLog);
299 receiver_trace_.PushExpectedLogLine(kSingleStreamLog);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200300 receiver_trace_.PushExpectedLogLine("Switching to absolute send time RBE.");
Erik Språng468e62a2015-07-06 10:50:47 +0200301 receiver_trace_.PushExpectedLogLine(kAbsSendTimeLog);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200302 streams_.push_back(new Stream(this, false));
303 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait());
304}
305
306TEST_F(BitrateEstimatorTest, SwitchesToASTForAudio) {
Erik Språng468e62a2015-07-06 10:50:47 +0200307 receiver_trace_.PushExpectedLogLine(kSingleStreamLog);
308 receiver_trace_.PushExpectedLogLine(kSingleStreamLog);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200309 streams_.push_back(new Stream(this, true));
310 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait());
311
312 send_config_.rtp.extensions.push_back(
313 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId));
314 receiver_trace_.PushExpectedLogLine("Switching to absolute send time RBE.");
Erik Språng468e62a2015-07-06 10:50:47 +0200315 receiver_trace_.PushExpectedLogLine(kAbsSendTimeLog);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200316 streams_.push_back(new Stream(this, true));
317 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait());
318}
319
320TEST_F(BitrateEstimatorTest, SwitchesToASTForVideo) {
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000321 send_config_.rtp.extensions.push_back(
322 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId));
Erik Språng468e62a2015-07-06 10:50:47 +0200323 receiver_trace_.PushExpectedLogLine(kSingleStreamLog);
324 receiver_trace_.PushExpectedLogLine(kSingleStreamLog);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200325 streams_.push_back(new Stream(this, false));
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000326 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait());
327
328 send_config_.rtp.extensions[0] =
329 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId);
330 receiver_trace_.PushExpectedLogLine("Switching to absolute send time RBE.");
Erik Språng468e62a2015-07-06 10:50:47 +0200331 receiver_trace_.PushExpectedLogLine(kAbsSendTimeLog);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200332 streams_.push_back(new Stream(this, false));
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000333 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait());
334}
335
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200336TEST_F(BitrateEstimatorTest, SwitchesToASTThenBackToTOFForVideo) {
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000337 send_config_.rtp.extensions.push_back(
338 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId));
Erik Språng468e62a2015-07-06 10:50:47 +0200339 receiver_trace_.PushExpectedLogLine(kSingleStreamLog);
340 receiver_trace_.PushExpectedLogLine(kSingleStreamLog);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200341 streams_.push_back(new Stream(this, false));
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000342 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait());
343
344 send_config_.rtp.extensions[0] =
345 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId);
346 receiver_trace_.PushExpectedLogLine("Switching to absolute send time RBE.");
Erik Språng468e62a2015-07-06 10:50:47 +0200347 receiver_trace_.PushExpectedLogLine(kAbsSendTimeLog);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200348 streams_.push_back(new Stream(this, false));
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000349 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait());
350
351 send_config_.rtp.extensions[0] =
352 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId);
353 receiver_trace_.PushExpectedLogLine(
354 "WrappingBitrateEstimator: Switching to transmission time offset RBE.");
Erik Språng468e62a2015-07-06 10:50:47 +0200355 receiver_trace_.PushExpectedLogLine(kSingleStreamLog);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200356 streams_.push_back(new Stream(this, false));
pbos@webrtc.org5ab75672013-12-16 12:24:44 +0000357 streams_[0]->StopSending();
358 streams_[1]->StopSending();
359 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait());
360}
361} // namespace webrtc