1 /* 2 * Copyright (c) 2012 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 11 #include <algorithm> 12 #include <math.h> 13 14 #include "testing/gtest/include/gtest/gtest.h" 15 #include "webrtc/video_engine/stream_synchronization.h" 16 17 namespace webrtc { 18 19 // These correspond to the same constants defined in vie_sync_module.cc. 20 enum { kMaxVideoDiffMs = 80 }; 21 enum { kMaxAudioDiffMs = 80 }; 22 enum { kMaxDelay = 1500 }; 23 24 // Test constants. 25 enum { kDefaultAudioFrequency = 8000 }; 26 enum { kDefaultVideoFrequency = 90000 }; 27 const double kNtpFracPerMs = 4.294967296E6; 28 static const int kSmoothingFilter = 4 * 2; 29 30 class Time { 31 public: 32 explicit Time(int64_t offset) 33 : kNtpJan1970(2208988800UL), 34 time_now_ms_(offset) {} 35 36 RtcpMeasurement GenerateRtcp(int frequency, uint32_t offset) const { 37 RtcpMeasurement rtcp; 38 NowNtp(&rtcp.ntp_secs, &rtcp.ntp_frac); 39 rtcp.rtp_timestamp = NowRtp(frequency, offset); 40 return rtcp; 41 } 42 43 void NowNtp(uint32_t* ntp_secs, uint32_t* ntp_frac) const { 44 *ntp_secs = time_now_ms_ / 1000 + kNtpJan1970; 45 int64_t remainder_ms = time_now_ms_ % 1000; 46 *ntp_frac = static_cast<uint32_t>( 47 static_cast<double>(remainder_ms) * kNtpFracPerMs + 0.5); 48 } 49 50 uint32_t NowRtp(int frequency, uint32_t offset) const { 51 return frequency * time_now_ms_ / 1000 + offset; 52 } 53 54 void IncreaseTimeMs(int64_t inc) { 55 time_now_ms_ += inc; 56 } 57 58 int64_t time_now_ms() const { 59 return time_now_ms_; 60 } 61 62 private: 63 // January 1970, in NTP seconds. 64 const uint32_t kNtpJan1970; 65 int64_t time_now_ms_; 66 }; 67 68 class StreamSynchronizationTest : public ::testing::Test { 69 protected: 70 virtual void SetUp() { 71 sync_ = new StreamSynchronization(0, 0); 72 send_time_ = new Time(kSendTimeOffsetMs); 73 receive_time_ = new Time(kReceiveTimeOffsetMs); 74 audio_clock_drift_ = 1.0; 75 video_clock_drift_ = 1.0; 76 } 77 78 virtual void TearDown() { 79 delete sync_; 80 delete send_time_; 81 delete receive_time_; 82 } 83 84 // Generates the necessary RTCP measurements and RTP timestamps and computes 85 // the audio and video delays needed to get the two streams in sync. 86 // |audio_delay_ms| and |video_delay_ms| are the number of milliseconds after 87 // capture which the frames are rendered. 88 // |current_audio_delay_ms| is the number of milliseconds which audio is 89 // currently being delayed by the receiver. 90 bool DelayedStreams(int audio_delay_ms, 91 int video_delay_ms, 92 int current_audio_delay_ms, 93 int* extra_audio_delay_ms, 94 int* total_video_delay_ms) { 95 int audio_frequency = static_cast<int>(kDefaultAudioFrequency * 96 audio_clock_drift_ + 0.5); 97 int audio_offset = 0; 98 int video_frequency = static_cast<int>(kDefaultVideoFrequency * 99 video_clock_drift_ + 0.5); 100 int video_offset = 0; 101 StreamSynchronization::Measurements audio; 102 StreamSynchronization::Measurements video; 103 // Generate NTP/RTP timestamp pair for both streams corresponding to RTCP. 104 audio.rtcp.push_front(send_time_->GenerateRtcp(audio_frequency, 105 audio_offset)); 106 send_time_->IncreaseTimeMs(100); 107 receive_time_->IncreaseTimeMs(100); 108 video.rtcp.push_front(send_time_->GenerateRtcp(video_frequency, 109 video_offset)); 110 send_time_->IncreaseTimeMs(900); 111 receive_time_->IncreaseTimeMs(900); 112 audio.rtcp.push_front(send_time_->GenerateRtcp(audio_frequency, 113 audio_offset)); 114 send_time_->IncreaseTimeMs(100); 115 receive_time_->IncreaseTimeMs(100); 116 video.rtcp.push_front(send_time_->GenerateRtcp(video_frequency, 117 video_offset)); 118 send_time_->IncreaseTimeMs(900); 119 receive_time_->IncreaseTimeMs(900); 120 121 // Capture an audio and a video frame at the same time. 122 audio.latest_timestamp = send_time_->NowRtp(audio_frequency, 123 audio_offset); 124 video.latest_timestamp = send_time_->NowRtp(video_frequency, 125 video_offset); 126 127 if (audio_delay_ms > video_delay_ms) { 128 // Audio later than video. 129 receive_time_->IncreaseTimeMs(video_delay_ms); 130 video.latest_receive_time_ms = receive_time_->time_now_ms(); 131 receive_time_->IncreaseTimeMs(audio_delay_ms - video_delay_ms); 132 audio.latest_receive_time_ms = receive_time_->time_now_ms(); 133 } else { 134 // Video later than audio. 135 receive_time_->IncreaseTimeMs(audio_delay_ms); 136 audio.latest_receive_time_ms = receive_time_->time_now_ms(); 137 receive_time_->IncreaseTimeMs(video_delay_ms - audio_delay_ms); 138 video.latest_receive_time_ms = receive_time_->time_now_ms(); 139 } 140 int relative_delay_ms; 141 StreamSynchronization::ComputeRelativeDelay(audio, video, 142 &relative_delay_ms); 143 EXPECT_EQ(video_delay_ms - audio_delay_ms, relative_delay_ms); 144 return sync_->ComputeDelays(relative_delay_ms, 145 current_audio_delay_ms, 146 extra_audio_delay_ms, 147 total_video_delay_ms); 148 } 149 150 // Simulate audio playback 300 ms after capture and video rendering 100 ms 151 // after capture. Verify that the correct extra delays are calculated for 152 // audio and video, and that they change correctly when we simulate that 153 // NetEQ or the VCM adds more delay to the streams. 154 // TODO(holmer): This is currently wrong! We should simply change 155 // audio_delay_ms or video_delay_ms since those now include VCM and NetEQ 156 // delays. 157 void BothDelayedAudioLaterTest(int base_target_delay) { 158 int current_audio_delay_ms = base_target_delay; 159 int audio_delay_ms = base_target_delay + 300; 160 int video_delay_ms = base_target_delay + 100; 161 int extra_audio_delay_ms = 0; 162 int total_video_delay_ms = base_target_delay; 163 int filtered_move = (audio_delay_ms - video_delay_ms) / kSmoothingFilter; 164 const int kNeteqDelayIncrease = 50; 165 const int kNeteqDelayDecrease = 10; 166 167 EXPECT_TRUE(DelayedStreams(audio_delay_ms, 168 video_delay_ms, 169 current_audio_delay_ms, 170 &extra_audio_delay_ms, 171 &total_video_delay_ms)); 172 EXPECT_EQ(base_target_delay + filtered_move, total_video_delay_ms); 173 EXPECT_EQ(base_target_delay, extra_audio_delay_ms); 174 current_audio_delay_ms = extra_audio_delay_ms; 175 176 send_time_->IncreaseTimeMs(1000); 177 receive_time_->IncreaseTimeMs(1000 - std::max(audio_delay_ms, 178 video_delay_ms)); 179 // Simulate base_target_delay minimum delay in the VCM. 180 total_video_delay_ms = base_target_delay; 181 EXPECT_TRUE(DelayedStreams(audio_delay_ms, 182 video_delay_ms, 183 current_audio_delay_ms, 184 &extra_audio_delay_ms, 185 &total_video_delay_ms)); 186 EXPECT_EQ(base_target_delay + 2 * filtered_move, total_video_delay_ms); 187 EXPECT_EQ(base_target_delay, extra_audio_delay_ms); 188 current_audio_delay_ms = extra_audio_delay_ms; 189 190 send_time_->IncreaseTimeMs(1000); 191 receive_time_->IncreaseTimeMs(1000 - std::max(audio_delay_ms, 192 video_delay_ms)); 193 // Simulate base_target_delay minimum delay in the VCM. 194 total_video_delay_ms = base_target_delay; 195 EXPECT_TRUE(DelayedStreams(audio_delay_ms, 196 video_delay_ms, 197 current_audio_delay_ms, 198 &extra_audio_delay_ms, 199 &total_video_delay_ms)); 200 EXPECT_EQ(base_target_delay + 3 * filtered_move, total_video_delay_ms); 201 EXPECT_EQ(base_target_delay, extra_audio_delay_ms); 202 203 // Simulate that NetEQ introduces some audio delay. 204 current_audio_delay_ms = base_target_delay + kNeteqDelayIncrease; 205 send_time_->IncreaseTimeMs(1000); 206 receive_time_->IncreaseTimeMs(1000 - std::max(audio_delay_ms, 207 video_delay_ms)); 208 // Simulate base_target_delay minimum delay in the VCM. 209 total_video_delay_ms = base_target_delay; 210 EXPECT_TRUE(DelayedStreams(audio_delay_ms, 211 video_delay_ms, 212 current_audio_delay_ms, 213 &extra_audio_delay_ms, 214 &total_video_delay_ms)); 215 filtered_move = 3 * filtered_move + 216 (kNeteqDelayIncrease + audio_delay_ms - video_delay_ms) / 217 kSmoothingFilter; 218 EXPECT_EQ(base_target_delay + filtered_move, total_video_delay_ms); 219 EXPECT_EQ(base_target_delay, extra_audio_delay_ms); 220 221 // Simulate that NetEQ reduces its delay. 222 current_audio_delay_ms = base_target_delay + kNeteqDelayDecrease; 223 send_time_->IncreaseTimeMs(1000); 224 receive_time_->IncreaseTimeMs(1000 - std::max(audio_delay_ms, 225 video_delay_ms)); 226 // Simulate base_target_delay minimum delay in the VCM. 227 total_video_delay_ms = base_target_delay; 228 EXPECT_TRUE(DelayedStreams(audio_delay_ms, 229 video_delay_ms, 230 current_audio_delay_ms, 231 &extra_audio_delay_ms, 232 &total_video_delay_ms)); 233 234 filtered_move = filtered_move + 235 (kNeteqDelayDecrease + audio_delay_ms - video_delay_ms) / 236 kSmoothingFilter; 237 238 EXPECT_EQ(base_target_delay + filtered_move, total_video_delay_ms); 239 EXPECT_EQ(base_target_delay, extra_audio_delay_ms); 240 } 241 242 void BothDelayedVideoLaterTest(int base_target_delay) { 243 int current_audio_delay_ms = base_target_delay; 244 int audio_delay_ms = base_target_delay + 100; 245 int video_delay_ms = base_target_delay + 300; 246 int extra_audio_delay_ms = 0; 247 int total_video_delay_ms = base_target_delay; 248 249 EXPECT_TRUE(DelayedStreams(audio_delay_ms, 250 video_delay_ms, 251 current_audio_delay_ms, 252 &extra_audio_delay_ms, 253 &total_video_delay_ms)); 254 EXPECT_EQ(base_target_delay, total_video_delay_ms); 255 // The audio delay is not allowed to change more than this in 1 second. 256 EXPECT_GE(base_target_delay + kMaxAudioDiffMs, extra_audio_delay_ms); 257 current_audio_delay_ms = extra_audio_delay_ms; 258 int current_extra_delay_ms = extra_audio_delay_ms; 259 260 send_time_->IncreaseTimeMs(1000); 261 receive_time_->IncreaseTimeMs(800); 262 EXPECT_TRUE(DelayedStreams(audio_delay_ms, 263 video_delay_ms, 264 current_audio_delay_ms, 265 &extra_audio_delay_ms, 266 &total_video_delay_ms)); 267 EXPECT_EQ(base_target_delay, total_video_delay_ms); 268 // The audio delay is not allowed to change more than the half of the 269 // required change in delay. 270 EXPECT_EQ(current_extra_delay_ms + MaxAudioDelayIncrease( 271 current_audio_delay_ms, 272 base_target_delay + video_delay_ms - audio_delay_ms), 273 extra_audio_delay_ms); 274 current_audio_delay_ms = extra_audio_delay_ms; 275 current_extra_delay_ms = extra_audio_delay_ms; 276 277 send_time_->IncreaseTimeMs(1000); 278 receive_time_->IncreaseTimeMs(800); 279 EXPECT_TRUE(DelayedStreams(audio_delay_ms, 280 video_delay_ms, 281 current_audio_delay_ms, 282 &extra_audio_delay_ms, 283 &total_video_delay_ms)); 284 EXPECT_EQ(base_target_delay, total_video_delay_ms); 285 // The audio delay is not allowed to change more than the half of the 286 // required change in delay. 287 EXPECT_EQ(current_extra_delay_ms + MaxAudioDelayIncrease( 288 current_audio_delay_ms, 289 base_target_delay + video_delay_ms - audio_delay_ms), 290 extra_audio_delay_ms); 291 current_extra_delay_ms = extra_audio_delay_ms; 292 293 // Simulate that NetEQ for some reason reduced the delay. 294 current_audio_delay_ms = base_target_delay + 10; 295 send_time_->IncreaseTimeMs(1000); 296 receive_time_->IncreaseTimeMs(800); 297 EXPECT_TRUE(DelayedStreams(audio_delay_ms, 298 video_delay_ms, 299 current_audio_delay_ms, 300 &extra_audio_delay_ms, 301 &total_video_delay_ms)); 302 EXPECT_EQ(base_target_delay, total_video_delay_ms); 303 // Since we only can ask NetEQ for a certain amount of extra delay, and 304 // we only measure the total NetEQ delay, we will ask for additional delay 305 // here to try to stay in sync. 306 EXPECT_EQ(current_extra_delay_ms + MaxAudioDelayIncrease( 307 current_audio_delay_ms, 308 base_target_delay + video_delay_ms - audio_delay_ms), 309 extra_audio_delay_ms); 310 current_extra_delay_ms = extra_audio_delay_ms; 311 312 // Simulate that NetEQ for some reason significantly increased the delay. 313 current_audio_delay_ms = base_target_delay + 350; 314 send_time_->IncreaseTimeMs(1000); 315 receive_time_->IncreaseTimeMs(800); 316 EXPECT_TRUE(DelayedStreams(audio_delay_ms, 317 video_delay_ms, 318 current_audio_delay_ms, 319 &extra_audio_delay_ms, 320 &total_video_delay_ms)); 321 EXPECT_EQ(base_target_delay, total_video_delay_ms); 322 // The audio delay is not allowed to change more than the half of the 323 // required change in delay. 324 EXPECT_EQ(current_extra_delay_ms + MaxAudioDelayIncrease( 325 current_audio_delay_ms, 326 base_target_delay + video_delay_ms - audio_delay_ms), 327 extra_audio_delay_ms); 328 } 329 330 int MaxAudioDelayIncrease(int current_audio_delay_ms, int delay_ms) { 331 return std::min((delay_ms - current_audio_delay_ms) / kSmoothingFilter, 332 static_cast<int>(kMaxAudioDiffMs)); 333 } 334 335 int MaxAudioDelayDecrease(int current_audio_delay_ms, int delay_ms) { 336 return std::max((delay_ms - current_audio_delay_ms) / kSmoothingFilter, 337 -kMaxAudioDiffMs); 338 } 339 340 enum { kSendTimeOffsetMs = 98765 }; 341 enum { kReceiveTimeOffsetMs = 43210 }; 342 343 StreamSynchronization* sync_; 344 Time* send_time_; // The simulated clock at the sender. 345 Time* receive_time_; // The simulated clock at the receiver. 346 double audio_clock_drift_; 347 double video_clock_drift_; 348 }; 349 350 TEST_F(StreamSynchronizationTest, NoDelay) { 351 uint32_t current_audio_delay_ms = 0; 352 int extra_audio_delay_ms = 0; 353 int total_video_delay_ms = 0; 354 355 EXPECT_FALSE(DelayedStreams(0, 0, current_audio_delay_ms, 356 &extra_audio_delay_ms, &total_video_delay_ms)); 357 EXPECT_EQ(0, extra_audio_delay_ms); 358 EXPECT_EQ(0, total_video_delay_ms); 359 } 360 361 TEST_F(StreamSynchronizationTest, VideoDelay) { 362 uint32_t current_audio_delay_ms = 0; 363 int delay_ms = 200; 364 int extra_audio_delay_ms = 0; 365 int total_video_delay_ms = 0; 366 367 EXPECT_TRUE(DelayedStreams(delay_ms, 0, current_audio_delay_ms, 368 &extra_audio_delay_ms, &total_video_delay_ms)); 369 EXPECT_EQ(0, extra_audio_delay_ms); 370 // The video delay is not allowed to change more than this in 1 second. 371 EXPECT_EQ(delay_ms / kSmoothingFilter, total_video_delay_ms); 372 373 send_time_->IncreaseTimeMs(1000); 374 receive_time_->IncreaseTimeMs(800); 375 // Simulate 0 minimum delay in the VCM. 376 total_video_delay_ms = 0; 377 EXPECT_TRUE(DelayedStreams(delay_ms, 0, current_audio_delay_ms, 378 &extra_audio_delay_ms, &total_video_delay_ms)); 379 EXPECT_EQ(0, extra_audio_delay_ms); 380 // The video delay is not allowed to change more than this in 1 second. 381 EXPECT_EQ(2 * delay_ms / kSmoothingFilter, total_video_delay_ms); 382 383 send_time_->IncreaseTimeMs(1000); 384 receive_time_->IncreaseTimeMs(800); 385 // Simulate 0 minimum delay in the VCM. 386 total_video_delay_ms = 0; 387 EXPECT_TRUE(DelayedStreams(delay_ms, 0, current_audio_delay_ms, 388 &extra_audio_delay_ms, &total_video_delay_ms)); 389 EXPECT_EQ(0, extra_audio_delay_ms); 390 EXPECT_EQ(3 * delay_ms / kSmoothingFilter, total_video_delay_ms); 391 } 392 393 TEST_F(StreamSynchronizationTest, AudioDelay) { 394 int current_audio_delay_ms = 0; 395 int delay_ms = 200; 396 int extra_audio_delay_ms = 0; 397 int total_video_delay_ms = 0; 398 399 EXPECT_TRUE(DelayedStreams(0, delay_ms, current_audio_delay_ms, 400 &extra_audio_delay_ms, &total_video_delay_ms)); 401 EXPECT_EQ(0, total_video_delay_ms); 402 // The audio delay is not allowed to change more than this in 1 second. 403 EXPECT_EQ(delay_ms / kSmoothingFilter, extra_audio_delay_ms); 404 current_audio_delay_ms = extra_audio_delay_ms; 405 int current_extra_delay_ms = extra_audio_delay_ms; 406 407 send_time_->IncreaseTimeMs(1000); 408 receive_time_->IncreaseTimeMs(800); 409 EXPECT_TRUE(DelayedStreams(0, delay_ms, current_audio_delay_ms, 410 &extra_audio_delay_ms, &total_video_delay_ms)); 411 EXPECT_EQ(0, total_video_delay_ms); 412 // The audio delay is not allowed to change more than the half of the required 413 // change in delay. 414 EXPECT_EQ(current_extra_delay_ms + 415 MaxAudioDelayIncrease(current_audio_delay_ms, delay_ms), 416 extra_audio_delay_ms); 417 current_audio_delay_ms = extra_audio_delay_ms; 418 current_extra_delay_ms = extra_audio_delay_ms; 419 420 send_time_->IncreaseTimeMs(1000); 421 receive_time_->IncreaseTimeMs(800); 422 EXPECT_TRUE(DelayedStreams(0, delay_ms, current_audio_delay_ms, 423 &extra_audio_delay_ms, &total_video_delay_ms)); 424 EXPECT_EQ(0, total_video_delay_ms); 425 // The audio delay is not allowed to change more than the half of the required 426 // change in delay. 427 EXPECT_EQ(current_extra_delay_ms + 428 MaxAudioDelayIncrease(current_audio_delay_ms, delay_ms), 429 extra_audio_delay_ms); 430 current_extra_delay_ms = extra_audio_delay_ms; 431 432 // Simulate that NetEQ for some reason reduced the delay. 433 current_audio_delay_ms = 10; 434 send_time_->IncreaseTimeMs(1000); 435 receive_time_->IncreaseTimeMs(800); 436 EXPECT_TRUE(DelayedStreams(0, delay_ms, current_audio_delay_ms, 437 &extra_audio_delay_ms, &total_video_delay_ms)); 438 EXPECT_EQ(0, total_video_delay_ms); 439 // Since we only can ask NetEQ for a certain amount of extra delay, and 440 // we only measure the total NetEQ delay, we will ask for additional delay 441 // here to try to 442 EXPECT_EQ(current_extra_delay_ms + 443 MaxAudioDelayIncrease(current_audio_delay_ms, delay_ms), 444 extra_audio_delay_ms); 445 current_extra_delay_ms = extra_audio_delay_ms; 446 447 // Simulate that NetEQ for some reason significantly increased the delay. 448 current_audio_delay_ms = 350; 449 send_time_->IncreaseTimeMs(1000); 450 receive_time_->IncreaseTimeMs(800); 451 EXPECT_TRUE(DelayedStreams(0, delay_ms, current_audio_delay_ms, 452 &extra_audio_delay_ms, &total_video_delay_ms)); 453 EXPECT_EQ(0, total_video_delay_ms); 454 // The audio delay is not allowed to change more than the half of the required 455 // change in delay. 456 EXPECT_EQ(current_extra_delay_ms + 457 MaxAudioDelayDecrease(current_audio_delay_ms, delay_ms), 458 extra_audio_delay_ms); 459 } 460 461 TEST_F(StreamSynchronizationTest, BothDelayedVideoLater) { 462 BothDelayedVideoLaterTest(0); 463 } 464 465 TEST_F(StreamSynchronizationTest, BothDelayedVideoLaterAudioClockDrift) { 466 audio_clock_drift_ = 1.05; 467 BothDelayedVideoLaterTest(0); 468 } 469 470 TEST_F(StreamSynchronizationTest, BothDelayedVideoLaterVideoClockDrift) { 471 video_clock_drift_ = 1.05; 472 BothDelayedVideoLaterTest(0); 473 } 474 475 TEST_F(StreamSynchronizationTest, BothDelayedAudioLater) { 476 BothDelayedAudioLaterTest(0); 477 } 478 479 TEST_F(StreamSynchronizationTest, BothDelayedAudioClockDrift) { 480 audio_clock_drift_ = 1.05; 481 BothDelayedAudioLaterTest(0); 482 } 483 484 TEST_F(StreamSynchronizationTest, BothDelayedVideoClockDrift) { 485 video_clock_drift_ = 1.05; 486 BothDelayedAudioLaterTest(0); 487 } 488 489 TEST_F(StreamSynchronizationTest, BaseDelay) { 490 int base_target_delay_ms = 2000; 491 int current_audio_delay_ms = 2000; 492 int extra_audio_delay_ms = 0; 493 int total_video_delay_ms = base_target_delay_ms; 494 sync_->SetTargetBufferingDelay(base_target_delay_ms); 495 // We are in sync don't change. 496 EXPECT_FALSE(DelayedStreams(base_target_delay_ms, base_target_delay_ms, 497 current_audio_delay_ms, 498 &extra_audio_delay_ms, &total_video_delay_ms)); 499 // Triggering another call with the same values. Delay should not be modified. 500 base_target_delay_ms = 2000; 501 current_audio_delay_ms = base_target_delay_ms; 502 total_video_delay_ms = base_target_delay_ms; 503 sync_->SetTargetBufferingDelay(base_target_delay_ms); 504 // We are in sync don't change. 505 EXPECT_FALSE(DelayedStreams(base_target_delay_ms, base_target_delay_ms, 506 current_audio_delay_ms, 507 &extra_audio_delay_ms, &total_video_delay_ms)); 508 // Changing delay value - intended to test this module only. In practice it 509 // would take VoE time to adapt. 510 base_target_delay_ms = 5000; 511 current_audio_delay_ms = base_target_delay_ms; 512 total_video_delay_ms = base_target_delay_ms; 513 sync_->SetTargetBufferingDelay(base_target_delay_ms); 514 // We are in sync don't change. 515 EXPECT_FALSE(DelayedStreams(base_target_delay_ms, base_target_delay_ms, 516 current_audio_delay_ms, 517 &extra_audio_delay_ms, &total_video_delay_ms)); 518 } 519 520 TEST_F(StreamSynchronizationTest, BothDelayedAudioLaterWithBaseDelay) { 521 int base_target_delay_ms = 3000; 522 sync_->SetTargetBufferingDelay(base_target_delay_ms); 523 BothDelayedAudioLaterTest(base_target_delay_ms); 524 } 525 526 TEST_F(StreamSynchronizationTest, BothDelayedAudioClockDriftWithBaseDelay) { 527 int base_target_delay_ms = 3000; 528 sync_->SetTargetBufferingDelay(base_target_delay_ms); 529 audio_clock_drift_ = 1.05; 530 BothDelayedAudioLaterTest(base_target_delay_ms); 531 } 532 533 TEST_F(StreamSynchronizationTest, BothDelayedVideoClockDriftWithBaseDelay) { 534 int base_target_delay_ms = 3000; 535 sync_->SetTargetBufferingDelay(base_target_delay_ms); 536 video_clock_drift_ = 1.05; 537 BothDelayedAudioLaterTest(base_target_delay_ms); 538 } 539 540 TEST_F(StreamSynchronizationTest, BothDelayedVideoLaterWithBaseDelay) { 541 int base_target_delay_ms = 2000; 542 sync_->SetTargetBufferingDelay(base_target_delay_ms); 543 BothDelayedVideoLaterTest(base_target_delay_ms); 544 } 545 546 TEST_F(StreamSynchronizationTest, 547 BothDelayedVideoLaterAudioClockDriftWithBaseDelay) { 548 int base_target_delay_ms = 2000; 549 audio_clock_drift_ = 1.05; 550 sync_->SetTargetBufferingDelay(base_target_delay_ms); 551 BothDelayedVideoLaterTest(base_target_delay_ms); 552 } 553 554 TEST_F(StreamSynchronizationTest, 555 BothDelayedVideoLaterVideoClockDriftWithBaseDelay) { 556 int base_target_delay_ms = 2000; 557 video_clock_drift_ = 1.05; 558 sync_->SetTargetBufferingDelay(base_target_delay_ms); 559 BothDelayedVideoLaterTest(base_target_delay_ms); 560 } 561 562 } // namespace webrtc 563