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

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

Issue 1674413004: Added A/V sync tests with drifting clocks. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: drift replaced by speed Created 4 years, 10 months 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 | « no previous file | webrtc/test/call_test.h » ('j') | webrtc/test/drifting_clock.cc » ('J')
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>
11 #include <sstream> 11 #include <sstream>
12 #include <string> 12 #include <string>
13 13
14 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
15 15
16 #include "webrtc/base/checks.h" 16 #include "webrtc/base/checks.h"
17 #include "webrtc/base/scoped_ptr.h" 17 #include "webrtc/base/scoped_ptr.h"
18 #include "webrtc/base/thread_annotations.h" 18 #include "webrtc/base/thread_annotations.h"
19 #include "webrtc/call.h" 19 #include "webrtc/call.h"
20 #include "webrtc/call/transport_adapter.h" 20 #include "webrtc/call/transport_adapter.h"
21 #include "webrtc/config.h" 21 #include "webrtc/config.h"
22 #include "webrtc/modules/audio_coding/include/audio_coding_module.h" 22 #include "webrtc/modules/audio_coding/include/audio_coding_module.h"
23 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" 23 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
24 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" 24 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
25 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" 25 #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
26 #include "webrtc/system_wrappers/include/rtp_to_ntp.h" 26 #include "webrtc/system_wrappers/include/rtp_to_ntp.h"
27 #include "webrtc/test/call_test.h" 27 #include "webrtc/test/call_test.h"
28 #include "webrtc/test/direct_transport.h" 28 #include "webrtc/test/direct_transport.h"
29 #include "webrtc/test/drifting_clock.h"
29 #include "webrtc/test/encoder_settings.h" 30 #include "webrtc/test/encoder_settings.h"
30 #include "webrtc/test/fake_audio_device.h" 31 #include "webrtc/test/fake_audio_device.h"
31 #include "webrtc/test/fake_decoder.h" 32 #include "webrtc/test/fake_decoder.h"
32 #include "webrtc/test/fake_encoder.h" 33 #include "webrtc/test/fake_encoder.h"
33 #include "webrtc/test/frame_generator.h" 34 #include "webrtc/test/frame_generator.h"
34 #include "webrtc/test/frame_generator_capturer.h" 35 #include "webrtc/test/frame_generator_capturer.h"
35 #include "webrtc/test/rtp_rtcp_observer.h" 36 #include "webrtc/test/rtp_rtcp_observer.h"
36 #include "webrtc/test/testsupport/fileutils.h" 37 #include "webrtc/test/testsupport/fileutils.h"
37 #include "webrtc/test/testsupport/perf_test.h" 38 #include "webrtc/test/testsupport/perf_test.h"
38 #include "webrtc/voice_engine/include/voe_base.h" 39 #include "webrtc/voice_engine/include/voe_base.h"
39 #include "webrtc/voice_engine/include/voe_codec.h" 40 #include "webrtc/voice_engine/include/voe_codec.h"
40 #include "webrtc/voice_engine/include/voe_network.h" 41 #include "webrtc/voice_engine/include/voe_network.h"
41 #include "webrtc/voice_engine/include/voe_rtp_rtcp.h" 42 #include "webrtc/voice_engine/include/voe_rtp_rtcp.h"
42 #include "webrtc/voice_engine/include/voe_video_sync.h" 43 #include "webrtc/voice_engine/include/voe_video_sync.h"
43 44
45 using webrtc::test::DriftingClock;
46 using webrtc::test::FakeAudioDevice;
47
44 namespace webrtc { 48 namespace webrtc {
45 49
46 class CallPerfTest : public test::CallTest { 50 class CallPerfTest : public test::CallTest {
47 protected: 51 protected:
48 void TestAudioVideoSync(bool fec, bool create_audio_first); 52 void TestAudioVideoSync(bool fec,
53 bool create_audio_first,
54 float video_ntp_speed,
55 float video_rtp_speed,
56 float audio_rtp_speed);
49 57
50 void TestCpuOveruse(LoadObserver::Load tested_load, int encode_delay_ms); 58 void TestCpuOveruse(LoadObserver::Load tested_load, int encode_delay_ms);
51 59
52 void TestMinTransmitBitrate(bool pad_to_min_bitrate); 60 void TestMinTransmitBitrate(bool pad_to_min_bitrate);
53 61
54 void TestCaptureNtpTime(const FakeNetworkPipe::Config& net_config, 62 void TestCaptureNtpTime(const FakeNetworkPipe::Config& net_config,
55 int threshold_ms, 63 int threshold_ms,
56 int start_time_ms, 64 int start_time_ms,
57 int run_time_ms); 65 int run_time_ms);
58 }; 66 };
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 189
182 private: 190 private:
183 Clock* const clock_; 191 Clock* const clock_;
184 const int voe_channel_; 192 const int voe_channel_;
185 VoEVideoSync* const voe_sync_; 193 VoEVideoSync* const voe_sync_;
186 SyncRtcpObserver* const audio_observer_; 194 SyncRtcpObserver* const audio_observer_;
187 const int64_t creation_time_ms_; 195 const int64_t creation_time_ms_;
188 int64_t first_time_in_sync_; 196 int64_t first_time_in_sync_;
189 }; 197 };
190 198
191 void CallPerfTest::TestAudioVideoSync(bool fec, bool create_audio_first) { 199 void CallPerfTest::TestAudioVideoSync(bool fec,
200 bool create_audio_first,
201 float video_ntp_speed,
202 float video_rtp_speed,
203 float audio_rtp_speed) {
192 const char* kSyncGroup = "av_sync"; 204 const char* kSyncGroup = "av_sync";
193 const uint32_t kAudioSendSsrc = 1234; 205 const uint32_t kAudioSendSsrc = 1234;
194 const uint32_t kAudioRecvSsrc = 5678; 206 const uint32_t kAudioRecvSsrc = 5678;
195 class AudioPacketReceiver : public PacketReceiver { 207 class AudioPacketReceiver : public PacketReceiver {
196 public: 208 public:
197 AudioPacketReceiver(int channel, VoENetwork* voe_network) 209 AudioPacketReceiver(int channel, VoENetwork* voe_network)
198 : channel_(channel), 210 : channel_(channel),
199 voe_network_(voe_network), 211 voe_network_(voe_network),
200 parser_(RtpHeaderParser::Create()) {} 212 parser_(RtpHeaderParser::Create()) {}
201 DeliveryStatus DeliverPacket(MediaType media_type, 213 DeliveryStatus DeliverPacket(MediaType media_type,
(...skipping 19 matching lines...) Expand all
221 }; 233 };
222 234
223 VoiceEngine* voice_engine = VoiceEngine::Create(); 235 VoiceEngine* voice_engine = VoiceEngine::Create();
224 VoEBase* voe_base = VoEBase::GetInterface(voice_engine); 236 VoEBase* voe_base = VoEBase::GetInterface(voice_engine);
225 VoECodec* voe_codec = VoECodec::GetInterface(voice_engine); 237 VoECodec* voe_codec = VoECodec::GetInterface(voice_engine);
226 VoENetwork* voe_network = VoENetwork::GetInterface(voice_engine); 238 VoENetwork* voe_network = VoENetwork::GetInterface(voice_engine);
227 VoEVideoSync* voe_sync = VoEVideoSync::GetInterface(voice_engine); 239 VoEVideoSync* voe_sync = VoEVideoSync::GetInterface(voice_engine);
228 const std::string audio_filename = 240 const std::string audio_filename =
229 test::ResourcePath("voice_engine/audio_long16", "pcm"); 241 test::ResourcePath("voice_engine/audio_long16", "pcm");
230 ASSERT_STRNE("", audio_filename.c_str()); 242 ASSERT_STRNE("", audio_filename.c_str());
231 test::FakeAudioDevice fake_audio_device(Clock::GetRealTimeClock(), 243 FakeAudioDevice fake_audio_device(Clock::GetRealTimeClock(), audio_filename,
232 audio_filename); 244 audio_rtp_speed);
233 EXPECT_EQ(0, voe_base->Init(&fake_audio_device, nullptr)); 245 EXPECT_EQ(0, voe_base->Init(&fake_audio_device, nullptr));
234 Config voe_config; 246 Config voe_config;
235 voe_config.Set<VoicePacing>(new VoicePacing(true)); 247 voe_config.Set<VoicePacing>(new VoicePacing(true));
236 int send_channel_id = voe_base->CreateChannel(voe_config); 248 int send_channel_id = voe_base->CreateChannel(voe_config);
237 int recv_channel_id = voe_base->CreateChannel(); 249 int recv_channel_id = voe_base->CreateChannel();
238 250
239 SyncRtcpObserver audio_observer; 251 SyncRtcpObserver audio_observer;
240 252
241 AudioState::Config send_audio_state_config; 253 AudioState::Config send_audio_state_config;
242 send_audio_state_config.voice_engine = voice_engine; 254 send_audio_state_config.voice_engine = voice_engine;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 if (create_audio_first) { 329 if (create_audio_first) {
318 audio_receive_stream = 330 audio_receive_stream =
319 receiver_call_->CreateAudioReceiveStream(audio_recv_config); 331 receiver_call_->CreateAudioReceiveStream(audio_recv_config);
320 CreateVideoStreams(); 332 CreateVideoStreams();
321 } else { 333 } else {
322 CreateVideoStreams(); 334 CreateVideoStreams();
323 audio_receive_stream = 335 audio_receive_stream =
324 receiver_call_->CreateAudioReceiveStream(audio_recv_config); 336 receiver_call_->CreateAudioReceiveStream(audio_recv_config);
325 } 337 }
326 338
327 CreateFrameGeneratorCapturer(); 339 DriftingClock drifting_clock(clock_, video_ntp_speed);
pbos-webrtc 2016/02/10 13:28:13 Shouldn't we always use the one with drift, even i
danilchap 2016/02/10 15:50:19 Done. This test expected to work with large drift,
340 if (video_ntp_speed == DriftingClock::kNoDrift &&
341 video_rtp_speed == DriftingClock::kNoDrift) {
342 CreateFrameGeneratorCapturer();
343 } else {
344 CreateFrameGeneratorCapturerWithDrift(&drifting_clock, video_rtp_speed);
345 }
328 346
329 Start(); 347 Start();
330 348
331 fake_audio_device.Start(); 349 fake_audio_device.Start();
332 EXPECT_EQ(0, voe_base->StartPlayout(recv_channel_id)); 350 EXPECT_EQ(0, voe_base->StartPlayout(recv_channel_id));
333 EXPECT_EQ(0, voe_base->StartReceive(recv_channel_id)); 351 EXPECT_EQ(0, voe_base->StartReceive(recv_channel_id));
334 EXPECT_EQ(0, voe_base->StartSend(send_channel_id)); 352 EXPECT_EQ(0, voe_base->StartSend(send_channel_id));
335 353
336 EXPECT_TRUE(observer.Wait()) 354 EXPECT_TRUE(observer.Wait())
337 << "Timed out while waiting for audio and video to be synchronized."; 355 << "Timed out while waiting for audio and video to be synchronized.";
(...skipping 20 matching lines...) Expand all
358 voe_codec->Release(); 376 voe_codec->Release();
359 voe_network->Release(); 377 voe_network->Release();
360 voe_sync->Release(); 378 voe_sync->Release();
361 379
362 DestroyCalls(); 380 DestroyCalls();
363 381
364 VoiceEngine::Delete(voice_engine); 382 VoiceEngine::Delete(voice_engine);
365 } 383 }
366 384
367 TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithAudioCreatedFirst) { 385 TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithAudioCreatedFirst) {
368 TestAudioVideoSync(false, true); 386 TestAudioVideoSync(false, true, DriftingClock::kNoDrift,
387 DriftingClock::kNoDrift, DriftingClock::kNoDrift);
369 } 388 }
370 389
371 TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithVideoCreatedFirst) { 390 TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithVideoCreatedFirst) {
372 TestAudioVideoSync(false, false); 391 TestAudioVideoSync(false, false, DriftingClock::kNoDrift,
392 DriftingClock::kNoDrift, DriftingClock::kNoDrift);
373 } 393 }
374 394
375 TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithFec) { 395 TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithFec) {
376 TestAudioVideoSync(true, false); 396 TestAudioVideoSync(true, false, DriftingClock::kNoDrift,
397 DriftingClock::kNoDrift, DriftingClock::kNoDrift);
398 }
399
400 // TODO(danilchap): Reenable after adding support for frame capture clock
401 // that is not in sync with local TickTime clock.
402 TEST_F(CallPerfTest, DISABLED_PlaysOutAudioAndVideoInSyncWithVideoNtpDrift) {
403 TestAudioVideoSync(false, true, DriftingClock::PercentsFaster(10.0f),
404 DriftingClock::kNoDrift, DriftingClock::kNoDrift);
405 }
406
407 TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithAudioRtpDrift) {
408 TestAudioVideoSync(false, true, DriftingClock::kNoDrift,
409 DriftingClock::kNoDrift,
410 DriftingClock::PercentsFaster(30.0f));
411 }
412
413 TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithVideoRtpDrift) {
414 TestAudioVideoSync(false, true, DriftingClock::kNoDrift,
415 DriftingClock::PercentsFaster(30.0f),
416 DriftingClock::kNoDrift);
417 }
418
419 TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithAudioFasterThanVideoDrift) {
420 TestAudioVideoSync(false, true, DriftingClock::kNoDrift,
421 DriftingClock::PercentsSlower(30.0f),
422 DriftingClock::PercentsFaster(30.0f));
423 }
424
425 TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithVideoFasterThanAudioDrift) {
426 TestAudioVideoSync(false, true, DriftingClock::kNoDrift,
427 DriftingClock::PercentsFaster(30.0f),
428 DriftingClock::PercentsSlower(30.0f));
377 } 429 }
378 430
379 void CallPerfTest::TestCaptureNtpTime(const FakeNetworkPipe::Config& net_config, 431 void CallPerfTest::TestCaptureNtpTime(const FakeNetworkPipe::Config& net_config,
380 int threshold_ms, 432 int threshold_ms,
381 int start_time_ms, 433 int start_time_ms,
382 int run_time_ms) { 434 int run_time_ms) {
383 class CaptureNtpTimeObserver : public test::EndToEndTest, 435 class CaptureNtpTimeObserver : public test::EndToEndTest,
384 public VideoRenderer { 436 public VideoRenderer {
385 public: 437 public:
386 CaptureNtpTimeObserver(const FakeNetworkPipe::Config& net_config, 438 CaptureNtpTimeObserver(const FakeNetworkPipe::Config& net_config,
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 int encoder_inits_; 801 int encoder_inits_;
750 uint32_t last_set_bitrate_; 802 uint32_t last_set_bitrate_;
751 VideoSendStream* send_stream_; 803 VideoSendStream* send_stream_;
752 VideoEncoderConfig encoder_config_; 804 VideoEncoderConfig encoder_config_;
753 } test; 805 } test;
754 806
755 RunBaseTest(&test); 807 RunBaseTest(&test);
756 } 808 }
757 809
758 } // namespace webrtc 810 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | webrtc/test/call_test.h » ('j') | webrtc/test/drifting_clock.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698