Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(196)

Side by Side Diff: webrtc/call/call_perf_tests.cc

Issue 1419193002: Call OnSentPacket for all packets sent in the test framework. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Comments addresded. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/call/call.cc ('k') | webrtc/modules/rtp_rtcp/source/rtp_sender.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 #include <algorithm> 10 #include <algorithm>
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 void TestMinTransmitBitrate(bool pad_to_min_bitrate); 51 void TestMinTransmitBitrate(bool pad_to_min_bitrate);
52 52
53 void TestCaptureNtpTime(const FakeNetworkPipe::Config& net_config, 53 void TestCaptureNtpTime(const FakeNetworkPipe::Config& net_config,
54 int threshold_ms, 54 int threshold_ms,
55 int start_time_ms, 55 int start_time_ms,
56 int run_time_ms); 56 int run_time_ms);
57 }; 57 };
58 58
59 class SyncRtcpObserver : public test::RtpRtcpObserver { 59 class SyncRtcpObserver : public test::RtpRtcpObserver {
60 public: 60 public:
61 explicit SyncRtcpObserver(const FakeNetworkPipe::Config& config) 61 SyncRtcpObserver() : test::RtpRtcpObserver(CallPerfTest::kLongTimeoutMs) {}
62 : test::RtpRtcpObserver(CallPerfTest::kLongTimeoutMs, config) {}
63 62
64 Action OnSendRtcp(const uint8_t* packet, size_t length) override { 63 Action OnSendRtcp(const uint8_t* packet, size_t length) override {
65 RTCPUtility::RTCPParserV2 parser(packet, length, true); 64 RTCPUtility::RTCPParserV2 parser(packet, length, true);
66 EXPECT_TRUE(parser.IsValid()); 65 EXPECT_TRUE(parser.IsValid());
67 66
68 for (RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); 67 for (RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
69 packet_type != RTCPUtility::RTCPPacketTypes::kInvalid; 68 packet_type != RTCPUtility::RTCPPacketTypes::kInvalid;
70 packet_type = parser.Iterate()) { 69 packet_type = parser.Iterate()) {
71 if (packet_type == RTCPUtility::RTCPPacketTypes::kSr) { 70 if (packet_type == RTCPUtility::RTCPPacketTypes::kSr) {
72 const RTCPUtility::RTCPPacket& packet = parser.Packet(); 71 const RTCPUtility::RTCPPacket& packet = parser.Packet();
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 class VideoRtcpAndSyncObserver : public SyncRtcpObserver, public VideoRenderer { 119 class VideoRtcpAndSyncObserver : public SyncRtcpObserver, public VideoRenderer {
121 static const int kInSyncThresholdMs = 50; 120 static const int kInSyncThresholdMs = 50;
122 static const int kStartupTimeMs = 2000; 121 static const int kStartupTimeMs = 2000;
123 static const int kMinRunTimeMs = 30000; 122 static const int kMinRunTimeMs = 30000;
124 123
125 public: 124 public:
126 VideoRtcpAndSyncObserver(Clock* clock, 125 VideoRtcpAndSyncObserver(Clock* clock,
127 int voe_channel, 126 int voe_channel,
128 VoEVideoSync* voe_sync, 127 VoEVideoSync* voe_sync,
129 SyncRtcpObserver* audio_observer) 128 SyncRtcpObserver* audio_observer)
130 : SyncRtcpObserver(FakeNetworkPipe::Config()), 129 : clock_(clock),
131 clock_(clock),
132 voe_channel_(voe_channel), 130 voe_channel_(voe_channel),
133 voe_sync_(voe_sync), 131 voe_sync_(voe_sync),
134 audio_observer_(audio_observer), 132 audio_observer_(audio_observer),
135 creation_time_ms_(clock_->TimeInMilliseconds()), 133 creation_time_ms_(clock_->TimeInMilliseconds()),
136 first_time_in_sync_(-1) {} 134 first_time_in_sync_(-1) {}
137 135
138 void RenderFrame(const VideoFrame& video_frame, 136 void RenderFrame(const VideoFrame& video_frame,
139 int time_to_render_ms) override { 137 int time_to_render_ms) override {
140 int64_t now_ms = clock_->TimeInMilliseconds(); 138 int64_t now_ms = clock_->TimeInMilliseconds();
141 uint32_t playout_timestamp = 0; 139 uint32_t playout_timestamp = 0;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 } 173 }
176 if (time_since_creation > kMinRunTimeMs) 174 if (time_since_creation > kMinRunTimeMs)
177 observation_complete_->Set(); 175 observation_complete_->Set();
178 } 176 }
179 } 177 }
180 178
181 bool IsTextureSupported() const override { return false; } 179 bool IsTextureSupported() const override { return false; }
182 180
183 private: 181 private:
184 Clock* const clock_; 182 Clock* const clock_;
185 int voe_channel_; 183 const int voe_channel_;
186 VoEVideoSync* voe_sync_; 184 VoEVideoSync* const voe_sync_;
187 SyncRtcpObserver* audio_observer_; 185 SyncRtcpObserver* const audio_observer_;
188 int64_t creation_time_ms_; 186 const int64_t creation_time_ms_;
189 int64_t first_time_in_sync_; 187 int64_t first_time_in_sync_;
190 }; 188 };
191 189
192 void CallPerfTest::TestAudioVideoSync(bool fec, bool create_audio_first) { 190 void CallPerfTest::TestAudioVideoSync(bool fec, bool create_audio_first) {
193 const char* kSyncGroup = "av_sync"; 191 const char* kSyncGroup = "av_sync";
194 class AudioPacketReceiver : public PacketReceiver { 192 class AudioPacketReceiver : public PacketReceiver {
195 public: 193 public:
196 AudioPacketReceiver(int channel, VoENetwork* voe_network) 194 AudioPacketReceiver(int channel, VoENetwork* voe_network)
197 : channel_(channel), 195 : channel_(channel),
198 voe_network_(voe_network), 196 voe_network_(voe_network),
(...skipping 26 matching lines...) Expand all
225 VoENetwork* voe_network = VoENetwork::GetInterface(voice_engine); 223 VoENetwork* voe_network = VoENetwork::GetInterface(voice_engine);
226 VoEVideoSync* voe_sync = VoEVideoSync::GetInterface(voice_engine); 224 VoEVideoSync* voe_sync = VoEVideoSync::GetInterface(voice_engine);
227 const std::string audio_filename = 225 const std::string audio_filename =
228 test::ResourcePath("voice_engine/audio_long16", "pcm"); 226 test::ResourcePath("voice_engine/audio_long16", "pcm");
229 ASSERT_STRNE("", audio_filename.c_str()); 227 ASSERT_STRNE("", audio_filename.c_str());
230 test::FakeAudioDevice fake_audio_device(Clock::GetRealTimeClock(), 228 test::FakeAudioDevice fake_audio_device(Clock::GetRealTimeClock(),
231 audio_filename); 229 audio_filename);
232 EXPECT_EQ(0, voe_base->Init(&fake_audio_device, nullptr)); 230 EXPECT_EQ(0, voe_base->Init(&fake_audio_device, nullptr));
233 int channel = voe_base->CreateChannel(); 231 int channel = voe_base->CreateChannel();
234 232
235 FakeNetworkPipe::Config net_config; 233 SyncRtcpObserver audio_observer;
236 net_config.queue_delay_ms = 500;
237 net_config.loss_percent = 5;
238 SyncRtcpObserver audio_observer(net_config);
239 VideoRtcpAndSyncObserver observer(Clock::GetRealTimeClock(),
240 channel,
241 voe_sync,
242 &audio_observer);
243 234
244 Call::Config receiver_config; 235 Call::Config receiver_config;
245 receiver_config.voice_engine = voice_engine; 236 receiver_config.voice_engine = voice_engine;
246 CreateCalls(Call::Config(), receiver_config); 237 CreateCalls(Call::Config(), receiver_config);
247 238
248 CodecInst isac = {103, "ISAC", 16000, 480, 1, 32000}; 239 CodecInst isac = {103, "ISAC", 16000, 480, 1, 32000};
249 EXPECT_EQ(0, voe_codec->SetSendCodec(channel, isac)); 240 EXPECT_EQ(0, voe_codec->SetSendCodec(channel, isac));
250 241
251 AudioPacketReceiver voe_packet_receiver(channel, voe_network); 242 AudioPacketReceiver voe_packet_receiver(channel, voe_network);
252 audio_observer.SetReceivers(&voe_packet_receiver, &voe_packet_receiver);
253 243
254 internal::TransportAdapter transport_adapter(audio_observer.SendTransport()); 244 FakeNetworkPipe::Config net_config;
245 net_config.queue_delay_ms = 500;
246 net_config.loss_percent = 5;
247 test::PacketTransport audio_send_transport(
248 nullptr, &audio_observer, test::PacketTransport::kSender, net_config);
249 audio_send_transport.SetReceiver(&voe_packet_receiver);
250 test::PacketTransport audio_receive_transport(
251 nullptr, &audio_observer, test::PacketTransport::kReceiver, net_config);
252 audio_receive_transport.SetReceiver(&voe_packet_receiver);
253
254 internal::TransportAdapter transport_adapter(&audio_send_transport);
255 transport_adapter.Enable(); 255 transport_adapter.Enable();
256 EXPECT_EQ(0, 256 EXPECT_EQ(0,
257 voe_network->RegisterExternalTransport(channel, transport_adapter)); 257 voe_network->RegisterExternalTransport(channel, transport_adapter));
258 258
259 observer.SetReceivers(receiver_call_->Receiver(), sender_call_->Receiver()); 259 VideoRtcpAndSyncObserver observer(Clock::GetRealTimeClock(), channel,
260 voe_sync, &audio_observer);
261
262 test::PacketTransport sync_send_transport(sender_call_.get(), &observer,
263 test::PacketTransport::kSender,
264 FakeNetworkPipe::Config());
265 sync_send_transport.SetReceiver(receiver_call_->Receiver());
266 test::PacketTransport sync_receive_transport(receiver_call_.get(), &observer,
267 test::PacketTransport::kReceiver,
268 FakeNetworkPipe::Config());
269 sync_receive_transport.SetReceiver(sender_call_->Receiver());
260 270
261 test::FakeDecoder fake_decoder; 271 test::FakeDecoder fake_decoder;
262 272
263 CreateSendConfig(1, observer.SendTransport()); 273 CreateSendConfig(1, &sync_send_transport);
264 CreateMatchingReceiveConfigs(observer.ReceiveTransport()); 274 CreateMatchingReceiveConfigs(&sync_receive_transport);
265 275
266 send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 276 send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
267 if (fec) { 277 if (fec) {
268 send_config_.rtp.fec.red_payload_type = kRedPayloadType; 278 send_config_.rtp.fec.red_payload_type = kRedPayloadType;
269 send_config_.rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; 279 send_config_.rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
270 receive_configs_[0].rtp.fec.red_payload_type = kRedPayloadType; 280 receive_configs_[0].rtp.fec.red_payload_type = kRedPayloadType;
271 receive_configs_[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; 281 receive_configs_[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
272 } 282 }
273 receive_configs_[0].rtp.nack.rtp_history_ms = 1000; 283 receive_configs_[0].rtp.nack.rtp_history_ms = 1000;
274 receive_configs_[0].renderer = &observer; 284 receive_configs_[0].renderer = &observer;
(...skipping 26 matching lines...) Expand all
301 311
302 EXPECT_EQ(kEventSignaled, observer.Wait()) 312 EXPECT_EQ(kEventSignaled, observer.Wait())
303 << "Timed out while waiting for audio and video to be synchronized."; 313 << "Timed out while waiting for audio and video to be synchronized.";
304 314
305 EXPECT_EQ(0, voe_base->StopSend(channel)); 315 EXPECT_EQ(0, voe_base->StopSend(channel));
306 EXPECT_EQ(0, voe_base->StopReceive(channel)); 316 EXPECT_EQ(0, voe_base->StopReceive(channel));
307 EXPECT_EQ(0, voe_base->StopPlayout(channel)); 317 EXPECT_EQ(0, voe_base->StopPlayout(channel));
308 fake_audio_device.Stop(); 318 fake_audio_device.Stop();
309 319
310 Stop(); 320 Stop();
311 observer.StopSending(); 321 sync_send_transport.StopSending();
312 audio_observer.StopSending(); 322 sync_receive_transport.StopSending();
323 audio_send_transport.StopSending();
324 audio_receive_transport.StopSending();
313 325
314 voe_base->DeleteChannel(channel); 326 voe_base->DeleteChannel(channel);
315 voe_base->Release(); 327 voe_base->Release();
316 voe_codec->Release(); 328 voe_codec->Release();
317 voe_network->Release(); 329 voe_network->Release();
318 voe_sync->Release(); 330 voe_sync->Release();
319 331
320 DestroyStreams(); 332 DestroyStreams();
321 333
322 receiver_call_->DestroyAudioReceiveStream(audio_receive_stream); 334 receiver_call_->DestroyAudioReceiveStream(audio_receive_stream);
(...skipping 15 matching lines...) Expand all
338 TestAudioVideoSync(true, false); 350 TestAudioVideoSync(true, false);
339 } 351 }
340 352
341 void CallPerfTest::TestCaptureNtpTime(const FakeNetworkPipe::Config& net_config, 353 void CallPerfTest::TestCaptureNtpTime(const FakeNetworkPipe::Config& net_config,
342 int threshold_ms, 354 int threshold_ms,
343 int start_time_ms, 355 int start_time_ms,
344 int run_time_ms) { 356 int run_time_ms) {
345 class CaptureNtpTimeObserver : public test::EndToEndTest, 357 class CaptureNtpTimeObserver : public test::EndToEndTest,
346 public VideoRenderer { 358 public VideoRenderer {
347 public: 359 public:
348 CaptureNtpTimeObserver(const FakeNetworkPipe::Config& config, 360 CaptureNtpTimeObserver(int threshold_ms, int start_time_ms, int run_time_ms)
349 int threshold_ms, 361 : EndToEndTest(kLongTimeoutMs),
350 int start_time_ms,
351 int run_time_ms)
352 : EndToEndTest(kLongTimeoutMs, config),
353 clock_(Clock::GetRealTimeClock()), 362 clock_(Clock::GetRealTimeClock()),
354 threshold_ms_(threshold_ms), 363 threshold_ms_(threshold_ms),
355 start_time_ms_(start_time_ms), 364 start_time_ms_(start_time_ms),
356 run_time_ms_(run_time_ms), 365 run_time_ms_(run_time_ms),
357 creation_time_ms_(clock_->TimeInMilliseconds()), 366 creation_time_ms_(clock_->TimeInMilliseconds()),
358 capturer_(nullptr), 367 capturer_(nullptr),
359 rtp_start_timestamp_set_(false), 368 rtp_start_timestamp_set_(false),
360 rtp_start_timestamp_(0) {} 369 rtp_start_timestamp_(0) {}
361 370
362 private: 371 private:
363 void RenderFrame(const VideoFrame& video_frame, 372 void RenderFrame(const VideoFrame& video_frame,
364 int time_to_render_ms) override { 373 int time_to_render_ms) override {
374 rtc::CritScope lock(&crit_);
365 if (video_frame.ntp_time_ms() <= 0) { 375 if (video_frame.ntp_time_ms() <= 0) {
366 // Haven't got enough RTCP SR in order to calculate the capture ntp 376 // Haven't got enough RTCP SR in order to calculate the capture ntp
367 // time. 377 // time.
368 return; 378 return;
369 } 379 }
370 380
371 int64_t now_ms = clock_->TimeInMilliseconds(); 381 int64_t now_ms = clock_->TimeInMilliseconds();
372 int64_t time_since_creation = now_ms - creation_time_ms_; 382 int64_t time_since_creation = now_ms - creation_time_ms_;
373 if (time_since_creation < start_time_ms_) { 383 if (time_since_creation < start_time_ms_) {
374 // Wait for |start_time_ms_| before start measuring. 384 // Wait for |start_time_ms_| before start measuring.
(...skipping 20 matching lines...) Expand all
395 ss << time_offset_ms; 405 ss << time_offset_ms;
396 406
397 webrtc::test::PrintResult( 407 webrtc::test::PrintResult(
398 "capture_ntp_time", "", "real - estimated", ss.str(), "ms", true); 408 "capture_ntp_time", "", "real - estimated", ss.str(), "ms", true);
399 EXPECT_TRUE(std::abs(time_offset_ms) < threshold_ms_); 409 EXPECT_TRUE(std::abs(time_offset_ms) < threshold_ms_);
400 } 410 }
401 411
402 bool IsTextureSupported() const override { return false; } 412 bool IsTextureSupported() const override { return false; }
403 413
404 virtual Action OnSendRtp(const uint8_t* packet, size_t length) { 414 virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
415 rtc::CritScope lock(&crit_);
405 RTPHeader header; 416 RTPHeader header;
406 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 417 EXPECT_TRUE(parser_->Parse(packet, length, &header));
407 418
408 if (!rtp_start_timestamp_set_) { 419 if (!rtp_start_timestamp_set_) {
409 // Calculate the rtp timestamp offset in order to calculate the real 420 // Calculate the rtp timestamp offset in order to calculate the real
410 // capture time. 421 // capture time.
411 uint32_t first_capture_timestamp = 422 uint32_t first_capture_timestamp =
412 90 * static_cast<uint32_t>(capturer_->first_frame_capture_time()); 423 90 * static_cast<uint32_t>(capturer_->first_frame_capture_time());
413 rtp_start_timestamp_ = header.timestamp - first_capture_timestamp; 424 rtp_start_timestamp_ = header.timestamp - first_capture_timestamp;
414 rtp_start_timestamp_set_ = true; 425 rtp_start_timestamp_set_ = true;
(...skipping 18 matching lines...) Expand all
433 // Enable the receiver side rtt calculation. 444 // Enable the receiver side rtt calculation.
434 (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = true; 445 (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = true;
435 } 446 }
436 447
437 void PerformTest() override { 448 void PerformTest() override {
438 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out while waiting for " 449 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out while waiting for "
439 "estimated capture NTP time to be " 450 "estimated capture NTP time to be "
440 "within bounds."; 451 "within bounds.";
441 } 452 }
442 453
443 Clock* clock_; 454 rtc::CriticalSection crit_;
455 Clock* const clock_;
444 int threshold_ms_; 456 int threshold_ms_;
445 int start_time_ms_; 457 int start_time_ms_;
446 int run_time_ms_; 458 int run_time_ms_;
447 int64_t creation_time_ms_; 459 int64_t creation_time_ms_;
448 test::FrameGeneratorCapturer* capturer_; 460 test::FrameGeneratorCapturer* capturer_;
449 bool rtp_start_timestamp_set_; 461 bool rtp_start_timestamp_set_;
450 uint32_t rtp_start_timestamp_; 462 uint32_t rtp_start_timestamp_;
451 typedef std::map<uint32_t, uint32_t> FrameCaptureTimeList; 463 typedef std::map<uint32_t, uint32_t> FrameCaptureTimeList;
452 FrameCaptureTimeList capture_time_list_; 464 FrameCaptureTimeList capture_time_list_ GUARDED_BY(&crit_);
453 } test(net_config, threshold_ms, start_time_ms, run_time_ms); 465 } test(threshold_ms, start_time_ms, run_time_ms);
454 466
455 RunBaseTest(&test); 467 RunBaseTest(&test, net_config);
456 } 468 }
457 469
458 TEST_F(CallPerfTest, CaptureNtpTimeWithNetworkDelay) { 470 TEST_F(CallPerfTest, CaptureNtpTimeWithNetworkDelay) {
459 FakeNetworkPipe::Config net_config; 471 FakeNetworkPipe::Config net_config;
460 net_config.queue_delay_ms = 100; 472 net_config.queue_delay_ms = 100;
461 // TODO(wu): lower the threshold as the calculation/estimatation becomes more 473 // TODO(wu): lower the threshold as the calculation/estimatation becomes more
462 // accurate. 474 // accurate.
463 const int kThresholdMs = 100; 475 const int kThresholdMs = 100;
464 const int kStartTimeMs = 10000; 476 const int kStartTimeMs = 10000;
465 const int kRunTimeMs = 20000; 477 const int kRunTimeMs = 20000;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 513
502 void PerformTest() override { 514 void PerformTest() override {
503 EXPECT_EQ(kEventSignaled, Wait()) 515 EXPECT_EQ(kEventSignaled, Wait())
504 << "Timed out before receiving an overuse callback."; 516 << "Timed out before receiving an overuse callback.";
505 } 517 }
506 518
507 LoadObserver::Load tested_load_; 519 LoadObserver::Load tested_load_;
508 test::DelayedEncoder encoder_; 520 test::DelayedEncoder encoder_;
509 } test(tested_load, encode_delay_ms); 521 } test(tested_load, encode_delay_ms);
510 522
511 RunBaseTest(&test); 523 RunBaseTest(&test, FakeNetworkPipe::Config());
512 } 524 }
513 525
514 TEST_F(CallPerfTest, ReceivesCpuUnderuse) { 526 TEST_F(CallPerfTest, ReceivesCpuUnderuse) {
515 const int kEncodeDelayMs = 2; 527 const int kEncodeDelayMs = 2;
516 TestCpuOveruse(LoadObserver::kUnderuse, kEncodeDelayMs); 528 TestCpuOveruse(LoadObserver::kUnderuse, kEncodeDelayMs);
517 } 529 }
518 530
519 TEST_F(CallPerfTest, ReceivesCpuOveruse) { 531 TEST_F(CallPerfTest, ReceivesCpuOveruse) {
520 const int kEncodeDelayMs = 35; 532 const int kEncodeDelayMs = 35;
521 TestCpuOveruse(LoadObserver::kOveruse, kEncodeDelayMs); 533 TestCpuOveruse(LoadObserver::kOveruse, kEncodeDelayMs);
522 } 534 }
523 535
524 void CallPerfTest::TestMinTransmitBitrate(bool pad_to_min_bitrate) { 536 void CallPerfTest::TestMinTransmitBitrate(bool pad_to_min_bitrate) {
525 static const int kMaxEncodeBitrateKbps = 30; 537 static const int kMaxEncodeBitrateKbps = 30;
526 static const int kMinTransmitBitrateBps = 150000; 538 static const int kMinTransmitBitrateBps = 150000;
527 static const int kMinAcceptableTransmitBitrate = 130; 539 static const int kMinAcceptableTransmitBitrate = 130;
528 static const int kMaxAcceptableTransmitBitrate = 170; 540 static const int kMaxAcceptableTransmitBitrate = 170;
529 static const int kNumBitrateObservationsInRange = 100; 541 static const int kNumBitrateObservationsInRange = 100;
530 static const int kAcceptableBitrateErrorMargin = 15; // +- 7 542 static const int kAcceptableBitrateErrorMargin = 15; // +- 7
531 class BitrateObserver : public test::EndToEndTest, public PacketReceiver { 543 class BitrateObserver : public test::EndToEndTest {
532 public: 544 public:
533 explicit BitrateObserver(bool using_min_transmit_bitrate) 545 explicit BitrateObserver(bool using_min_transmit_bitrate)
534 : EndToEndTest(kLongTimeoutMs), 546 : EndToEndTest(kLongTimeoutMs),
535 send_stream_(nullptr), 547 send_stream_(nullptr),
536 send_transport_receiver_(nullptr),
537 pad_to_min_bitrate_(using_min_transmit_bitrate), 548 pad_to_min_bitrate_(using_min_transmit_bitrate),
538 num_bitrate_observations_in_range_(0) {} 549 num_bitrate_observations_in_range_(0) {}
539 550
540 private: 551 private:
541 void SetReceivers(PacketReceiver* send_transport_receiver, 552 // TODO(holmer): Run this with a timer instead of once per packet.
542 PacketReceiver* receive_transport_receiver) override { 553 Action OnSendRtp(const uint8_t* packet, size_t length) override {
543 send_transport_receiver_ = send_transport_receiver;
544 test::RtpRtcpObserver::SetReceivers(this, receive_transport_receiver);
545 }
546
547 DeliveryStatus DeliverPacket(MediaType media_type,
548 const uint8_t* packet,
549 size_t length,
550 const PacketTime& packet_time) override {
551 VideoSendStream::Stats stats = send_stream_->GetStats(); 554 VideoSendStream::Stats stats = send_stream_->GetStats();
552 if (stats.substreams.size() > 0) { 555 if (stats.substreams.size() > 0) {
553 RTC_DCHECK_EQ(1u, stats.substreams.size()); 556 RTC_DCHECK_EQ(1u, stats.substreams.size());
554 int bitrate_kbps = 557 int bitrate_kbps =
555 stats.substreams.begin()->second.total_bitrate_bps / 1000; 558 stats.substreams.begin()->second.total_bitrate_bps / 1000;
556 if (bitrate_kbps > 0) { 559 if (bitrate_kbps > 0) {
557 test::PrintResult( 560 test::PrintResult(
558 "bitrate_stats_", 561 "bitrate_stats_",
559 (pad_to_min_bitrate_ ? "min_transmit_bitrate" 562 (pad_to_min_bitrate_ ? "min_transmit_bitrate"
560 : "without_min_transmit_bitrate"), 563 : "without_min_transmit_bitrate"),
(...skipping 13 matching lines...) Expand all
574 bitrate_kbps < (kMaxEncodeBitrateKbps + 577 bitrate_kbps < (kMaxEncodeBitrateKbps +
575 kAcceptableBitrateErrorMargin / 2)) { 578 kAcceptableBitrateErrorMargin / 2)) {
576 ++num_bitrate_observations_in_range_; 579 ++num_bitrate_observations_in_range_;
577 } 580 }
578 } 581 }
579 if (num_bitrate_observations_in_range_ == 582 if (num_bitrate_observations_in_range_ ==
580 kNumBitrateObservationsInRange) 583 kNumBitrateObservationsInRange)
581 observation_complete_->Set(); 584 observation_complete_->Set();
582 } 585 }
583 } 586 }
584 return send_transport_receiver_->DeliverPacket(media_type, packet, length, 587 return SEND_PACKET;
585 packet_time);
586 } 588 }
587 589
588 void OnStreamsCreated( 590 void OnStreamsCreated(
589 VideoSendStream* send_stream, 591 VideoSendStream* send_stream,
590 const std::vector<VideoReceiveStream*>& receive_streams) override { 592 const std::vector<VideoReceiveStream*>& receive_streams) override {
591 send_stream_ = send_stream; 593 send_stream_ = send_stream;
592 } 594 }
593 595
594 void ModifyConfigs(VideoSendStream::Config* send_config, 596 void ModifyConfigs(VideoSendStream::Config* send_config,
595 std::vector<VideoReceiveStream::Config>* receive_configs, 597 std::vector<VideoReceiveStream::Config>* receive_configs,
596 VideoEncoderConfig* encoder_config) override { 598 VideoEncoderConfig* encoder_config) override {
597 if (pad_to_min_bitrate_) { 599 if (pad_to_min_bitrate_) {
598 encoder_config->min_transmit_bitrate_bps = kMinTransmitBitrateBps; 600 encoder_config->min_transmit_bitrate_bps = kMinTransmitBitrateBps;
599 } else { 601 } else {
600 RTC_DCHECK_EQ(0, encoder_config->min_transmit_bitrate_bps); 602 RTC_DCHECK_EQ(0, encoder_config->min_transmit_bitrate_bps);
601 } 603 }
602 } 604 }
603 605
604 void PerformTest() override { 606 void PerformTest() override {
605 EXPECT_EQ(kEventSignaled, Wait()) 607 EXPECT_EQ(kEventSignaled, Wait())
606 << "Timeout while waiting for send-bitrate stats."; 608 << "Timeout while waiting for send-bitrate stats.";
607 } 609 }
608 610
609 VideoSendStream* send_stream_; 611 VideoSendStream* send_stream_;
610 PacketReceiver* send_transport_receiver_;
611 const bool pad_to_min_bitrate_; 612 const bool pad_to_min_bitrate_;
612 int num_bitrate_observations_in_range_; 613 int num_bitrate_observations_in_range_;
613 } test(pad_to_min_bitrate); 614 } test(pad_to_min_bitrate);
614 615
615 fake_encoder_.SetMaxBitrate(kMaxEncodeBitrateKbps); 616 fake_encoder_.SetMaxBitrate(kMaxEncodeBitrateKbps);
616 RunBaseTest(&test); 617 RunBaseTest(&test, FakeNetworkPipe::Config());
617 } 618 }
618 619
619 TEST_F(CallPerfTest, PadsToMinTransmitBitrate) { TestMinTransmitBitrate(true); } 620 TEST_F(CallPerfTest, PadsToMinTransmitBitrate) { TestMinTransmitBitrate(true); }
620 621
621 TEST_F(CallPerfTest, NoPadWithoutMinTransmitBitrate) { 622 TEST_F(CallPerfTest, NoPadWithoutMinTransmitBitrate) {
622 TestMinTransmitBitrate(false); 623 TestMinTransmitBitrate(false);
623 } 624 }
624 625
625 TEST_F(CallPerfTest, KeepsHighBitrateWhenReconfiguringSender) { 626 TEST_F(CallPerfTest, KeepsHighBitrateWhenReconfiguringSender) {
626 static const uint32_t kInitialBitrateKbps = 400; 627 static const uint32_t kInitialBitrateKbps = 400;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
701 } 702 }
702 703
703 private: 704 private:
704 rtc::scoped_ptr<webrtc::EventWrapper> time_to_reconfigure_; 705 rtc::scoped_ptr<webrtc::EventWrapper> time_to_reconfigure_;
705 int encoder_inits_; 706 int encoder_inits_;
706 uint32_t last_set_bitrate_; 707 uint32_t last_set_bitrate_;
707 VideoSendStream* send_stream_; 708 VideoSendStream* send_stream_;
708 VideoEncoderConfig encoder_config_; 709 VideoEncoderConfig encoder_config_;
709 } test; 710 } test;
710 711
711 RunBaseTest(&test); 712 RunBaseTest(&test, FakeNetworkPipe::Config());
712 } 713 }
713 714
714 } // namespace webrtc 715 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/call/call.cc ('k') | webrtc/modules/rtp_rtcp/source/rtp_sender.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698