xref: /aosp_15_r20/external/webrtc/video/stream_synchronization_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #include "video/stream_synchronization.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <algorithm>
14*d9f75844SAndroid Build Coastguard Worker 
15*d9f75844SAndroid Build Coastguard Worker #include "system_wrappers/include/clock.h"
16*d9f75844SAndroid Build Coastguard Worker #include "system_wrappers/include/ntp_time.h"
17*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
18*d9f75844SAndroid Build Coastguard Worker 
19*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
20*d9f75844SAndroid Build Coastguard Worker namespace {
21*d9f75844SAndroid Build Coastguard Worker constexpr int kMaxChangeMs = 80;  // From stream_synchronization.cc
22*d9f75844SAndroid Build Coastguard Worker constexpr int kDefaultAudioFrequency = 8000;
23*d9f75844SAndroid Build Coastguard Worker constexpr int kDefaultVideoFrequency = 90000;
24*d9f75844SAndroid Build Coastguard Worker constexpr int kSmoothingFilter = 4 * 2;
25*d9f75844SAndroid Build Coastguard Worker }  // namespace
26*d9f75844SAndroid Build Coastguard Worker 
27*d9f75844SAndroid Build Coastguard Worker class StreamSynchronizationTest : public ::testing::Test {
28*d9f75844SAndroid Build Coastguard Worker  public:
StreamSynchronizationTest()29*d9f75844SAndroid Build Coastguard Worker   StreamSynchronizationTest()
30*d9f75844SAndroid Build Coastguard Worker       : sync_(0, 0), clock_sender_(98765000), clock_receiver_(43210000) {}
31*d9f75844SAndroid Build Coastguard Worker 
32*d9f75844SAndroid Build Coastguard Worker  protected:
33*d9f75844SAndroid Build Coastguard Worker   // Generates the necessary RTCP measurements and RTP timestamps and computes
34*d9f75844SAndroid Build Coastguard Worker   // the audio and video delays needed to get the two streams in sync.
35*d9f75844SAndroid Build Coastguard Worker   // `audio_delay_ms` and `video_delay_ms` are the number of milliseconds after
36*d9f75844SAndroid Build Coastguard Worker   // capture which the frames are received.
37*d9f75844SAndroid Build Coastguard Worker   // `current_audio_delay_ms` is the number of milliseconds which audio is
38*d9f75844SAndroid Build Coastguard Worker   // currently being delayed by the receiver.
DelayedStreams(int audio_delay_ms,int video_delay_ms,int current_audio_delay_ms,int * total_audio_delay_ms,int * total_video_delay_ms)39*d9f75844SAndroid Build Coastguard Worker   bool DelayedStreams(int audio_delay_ms,
40*d9f75844SAndroid Build Coastguard Worker                       int video_delay_ms,
41*d9f75844SAndroid Build Coastguard Worker                       int current_audio_delay_ms,
42*d9f75844SAndroid Build Coastguard Worker                       int* total_audio_delay_ms,
43*d9f75844SAndroid Build Coastguard Worker                       int* total_video_delay_ms) {
44*d9f75844SAndroid Build Coastguard Worker     int audio_frequency =
45*d9f75844SAndroid Build Coastguard Worker         static_cast<int>(kDefaultAudioFrequency * audio_clock_drift_ + 0.5);
46*d9f75844SAndroid Build Coastguard Worker     int video_frequency =
47*d9f75844SAndroid Build Coastguard Worker         static_cast<int>(kDefaultVideoFrequency * video_clock_drift_ + 0.5);
48*d9f75844SAndroid Build Coastguard Worker 
49*d9f75844SAndroid Build Coastguard Worker     // Generate NTP/RTP timestamp pair for both streams corresponding to RTCP.
50*d9f75844SAndroid Build Coastguard Worker     StreamSynchronization::Measurements audio;
51*d9f75844SAndroid Build Coastguard Worker     StreamSynchronization::Measurements video;
52*d9f75844SAndroid Build Coastguard Worker     NtpTime ntp_time = clock_sender_.CurrentNtpTime();
53*d9f75844SAndroid Build Coastguard Worker     uint32_t rtp_timestamp =
54*d9f75844SAndroid Build Coastguard Worker         clock_sender_.CurrentTime().ms() * audio_frequency / 1000;
55*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(audio.rtp_to_ntp.UpdateMeasurements(ntp_time, rtp_timestamp),
56*d9f75844SAndroid Build Coastguard Worker               RtpToNtpEstimator::kNewMeasurement);
57*d9f75844SAndroid Build Coastguard Worker     clock_sender_.AdvanceTimeMilliseconds(100);
58*d9f75844SAndroid Build Coastguard Worker     clock_receiver_.AdvanceTimeMilliseconds(100);
59*d9f75844SAndroid Build Coastguard Worker     ntp_time = clock_sender_.CurrentNtpTime();
60*d9f75844SAndroid Build Coastguard Worker     rtp_timestamp = clock_sender_.CurrentTime().ms() * video_frequency / 1000;
61*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(video.rtp_to_ntp.UpdateMeasurements(ntp_time, rtp_timestamp),
62*d9f75844SAndroid Build Coastguard Worker               RtpToNtpEstimator::kNewMeasurement);
63*d9f75844SAndroid Build Coastguard Worker     clock_sender_.AdvanceTimeMilliseconds(900);
64*d9f75844SAndroid Build Coastguard Worker     clock_receiver_.AdvanceTimeMilliseconds(900);
65*d9f75844SAndroid Build Coastguard Worker     ntp_time = clock_sender_.CurrentNtpTime();
66*d9f75844SAndroid Build Coastguard Worker     rtp_timestamp = clock_sender_.CurrentTime().ms() * audio_frequency / 1000;
67*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(audio.rtp_to_ntp.UpdateMeasurements(ntp_time, rtp_timestamp),
68*d9f75844SAndroid Build Coastguard Worker               RtpToNtpEstimator::kNewMeasurement);
69*d9f75844SAndroid Build Coastguard Worker     clock_sender_.AdvanceTimeMilliseconds(100);
70*d9f75844SAndroid Build Coastguard Worker     clock_receiver_.AdvanceTimeMilliseconds(100);
71*d9f75844SAndroid Build Coastguard Worker     ntp_time = clock_sender_.CurrentNtpTime();
72*d9f75844SAndroid Build Coastguard Worker     rtp_timestamp = clock_sender_.CurrentTime().ms() * video_frequency / 1000;
73*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(video.rtp_to_ntp.UpdateMeasurements(ntp_time, rtp_timestamp),
74*d9f75844SAndroid Build Coastguard Worker               RtpToNtpEstimator::kNewMeasurement);
75*d9f75844SAndroid Build Coastguard Worker     clock_sender_.AdvanceTimeMilliseconds(900);
76*d9f75844SAndroid Build Coastguard Worker     clock_receiver_.AdvanceTimeMilliseconds(900);
77*d9f75844SAndroid Build Coastguard Worker 
78*d9f75844SAndroid Build Coastguard Worker     // Capture an audio and a video frame at the same time.
79*d9f75844SAndroid Build Coastguard Worker     audio.latest_timestamp =
80*d9f75844SAndroid Build Coastguard Worker         clock_sender_.CurrentTime().ms() * audio_frequency / 1000;
81*d9f75844SAndroid Build Coastguard Worker     video.latest_timestamp =
82*d9f75844SAndroid Build Coastguard Worker         clock_sender_.CurrentTime().ms() * video_frequency / 1000;
83*d9f75844SAndroid Build Coastguard Worker 
84*d9f75844SAndroid Build Coastguard Worker     if (audio_delay_ms > video_delay_ms) {
85*d9f75844SAndroid Build Coastguard Worker       // Audio later than video.
86*d9f75844SAndroid Build Coastguard Worker       clock_receiver_.AdvanceTimeMilliseconds(video_delay_ms);
87*d9f75844SAndroid Build Coastguard Worker       video.latest_receive_time_ms = clock_receiver_.CurrentTime().ms();
88*d9f75844SAndroid Build Coastguard Worker       clock_receiver_.AdvanceTimeMilliseconds(audio_delay_ms - video_delay_ms);
89*d9f75844SAndroid Build Coastguard Worker       audio.latest_receive_time_ms = clock_receiver_.CurrentTime().ms();
90*d9f75844SAndroid Build Coastguard Worker     } else {
91*d9f75844SAndroid Build Coastguard Worker       // Video later than audio.
92*d9f75844SAndroid Build Coastguard Worker       clock_receiver_.AdvanceTimeMilliseconds(audio_delay_ms);
93*d9f75844SAndroid Build Coastguard Worker       audio.latest_receive_time_ms = clock_receiver_.CurrentTime().ms();
94*d9f75844SAndroid Build Coastguard Worker       clock_receiver_.AdvanceTimeMilliseconds(video_delay_ms - audio_delay_ms);
95*d9f75844SAndroid Build Coastguard Worker       video.latest_receive_time_ms = clock_receiver_.CurrentTime().ms();
96*d9f75844SAndroid Build Coastguard Worker     }
97*d9f75844SAndroid Build Coastguard Worker 
98*d9f75844SAndroid Build Coastguard Worker     int relative_delay_ms;
99*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(StreamSynchronization::ComputeRelativeDelay(
100*d9f75844SAndroid Build Coastguard Worker         audio, video, &relative_delay_ms));
101*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(video_delay_ms - audio_delay_ms, relative_delay_ms);
102*d9f75844SAndroid Build Coastguard Worker 
103*d9f75844SAndroid Build Coastguard Worker     return sync_.ComputeDelays(relative_delay_ms, current_audio_delay_ms,
104*d9f75844SAndroid Build Coastguard Worker                                total_audio_delay_ms, total_video_delay_ms);
105*d9f75844SAndroid Build Coastguard Worker   }
106*d9f75844SAndroid Build Coastguard Worker 
107*d9f75844SAndroid Build Coastguard Worker   // Simulate audio playback 300 ms after capture and video rendering 100 ms
108*d9f75844SAndroid Build Coastguard Worker   // after capture. Verify that the correct extra delays are calculated for
109*d9f75844SAndroid Build Coastguard Worker   // audio and video, and that they change correctly when we simulate that
110*d9f75844SAndroid Build Coastguard Worker   // NetEQ or the VCM adds more delay to the streams.
BothDelayedAudioLaterTest(int base_target_delay_ms)111*d9f75844SAndroid Build Coastguard Worker   void BothDelayedAudioLaterTest(int base_target_delay_ms) {
112*d9f75844SAndroid Build Coastguard Worker     const int kAudioDelayMs = base_target_delay_ms + 300;
113*d9f75844SAndroid Build Coastguard Worker     const int kVideoDelayMs = base_target_delay_ms + 100;
114*d9f75844SAndroid Build Coastguard Worker     int current_audio_delay_ms = base_target_delay_ms;
115*d9f75844SAndroid Build Coastguard Worker     int total_audio_delay_ms = 0;
116*d9f75844SAndroid Build Coastguard Worker     int total_video_delay_ms = base_target_delay_ms;
117*d9f75844SAndroid Build Coastguard Worker     int filtered_move = (kAudioDelayMs - kVideoDelayMs) / kSmoothingFilter;
118*d9f75844SAndroid Build Coastguard Worker 
119*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(DelayedStreams(kAudioDelayMs, kVideoDelayMs,
120*d9f75844SAndroid Build Coastguard Worker                                current_audio_delay_ms, &total_audio_delay_ms,
121*d9f75844SAndroid Build Coastguard Worker                                &total_video_delay_ms));
122*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms + filtered_move, total_video_delay_ms);
123*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms, total_audio_delay_ms);
124*d9f75844SAndroid Build Coastguard Worker 
125*d9f75844SAndroid Build Coastguard Worker     // Set new current delay.
126*d9f75844SAndroid Build Coastguard Worker     current_audio_delay_ms = total_audio_delay_ms;
127*d9f75844SAndroid Build Coastguard Worker     clock_sender_.AdvanceTimeMilliseconds(1000);
128*d9f75844SAndroid Build Coastguard Worker     clock_receiver_.AdvanceTimeMilliseconds(
129*d9f75844SAndroid Build Coastguard Worker         1000 - std::max(kAudioDelayMs, kVideoDelayMs));
130*d9f75844SAndroid Build Coastguard Worker     // Simulate base_target_delay_ms minimum delay in the VCM.
131*d9f75844SAndroid Build Coastguard Worker     total_video_delay_ms = base_target_delay_ms;
132*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(DelayedStreams(kAudioDelayMs, kVideoDelayMs,
133*d9f75844SAndroid Build Coastguard Worker                                current_audio_delay_ms, &total_audio_delay_ms,
134*d9f75844SAndroid Build Coastguard Worker                                &total_video_delay_ms));
135*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms + 2 * filtered_move, total_video_delay_ms);
136*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms, total_audio_delay_ms);
137*d9f75844SAndroid Build Coastguard Worker 
138*d9f75844SAndroid Build Coastguard Worker     // Set new current delay.
139*d9f75844SAndroid Build Coastguard Worker     current_audio_delay_ms = total_audio_delay_ms;
140*d9f75844SAndroid Build Coastguard Worker     clock_sender_.AdvanceTimeMilliseconds(1000);
141*d9f75844SAndroid Build Coastguard Worker     clock_receiver_.AdvanceTimeMilliseconds(
142*d9f75844SAndroid Build Coastguard Worker         1000 - std::max(kAudioDelayMs, kVideoDelayMs));
143*d9f75844SAndroid Build Coastguard Worker     // Simulate base_target_delay_ms minimum delay in the VCM.
144*d9f75844SAndroid Build Coastguard Worker     total_video_delay_ms = base_target_delay_ms;
145*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(DelayedStreams(kAudioDelayMs, kVideoDelayMs,
146*d9f75844SAndroid Build Coastguard Worker                                current_audio_delay_ms, &total_audio_delay_ms,
147*d9f75844SAndroid Build Coastguard Worker                                &total_video_delay_ms));
148*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms + 3 * filtered_move, total_video_delay_ms);
149*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms, total_audio_delay_ms);
150*d9f75844SAndroid Build Coastguard Worker 
151*d9f75844SAndroid Build Coastguard Worker     // Simulate that NetEQ introduces some audio delay.
152*d9f75844SAndroid Build Coastguard Worker     const int kNeteqDelayIncrease = 50;
153*d9f75844SAndroid Build Coastguard Worker     current_audio_delay_ms = base_target_delay_ms + kNeteqDelayIncrease;
154*d9f75844SAndroid Build Coastguard Worker     clock_sender_.AdvanceTimeMilliseconds(1000);
155*d9f75844SAndroid Build Coastguard Worker     clock_receiver_.AdvanceTimeMilliseconds(
156*d9f75844SAndroid Build Coastguard Worker         1000 - std::max(kAudioDelayMs, kVideoDelayMs));
157*d9f75844SAndroid Build Coastguard Worker     // Simulate base_target_delay_ms minimum delay in the VCM.
158*d9f75844SAndroid Build Coastguard Worker     total_video_delay_ms = base_target_delay_ms;
159*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(DelayedStreams(kAudioDelayMs, kVideoDelayMs,
160*d9f75844SAndroid Build Coastguard Worker                                current_audio_delay_ms, &total_audio_delay_ms,
161*d9f75844SAndroid Build Coastguard Worker                                &total_video_delay_ms));
162*d9f75844SAndroid Build Coastguard Worker     filtered_move = 3 * filtered_move +
163*d9f75844SAndroid Build Coastguard Worker                     (kNeteqDelayIncrease + kAudioDelayMs - kVideoDelayMs) /
164*d9f75844SAndroid Build Coastguard Worker                         kSmoothingFilter;
165*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms + filtered_move, total_video_delay_ms);
166*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms, total_audio_delay_ms);
167*d9f75844SAndroid Build Coastguard Worker 
168*d9f75844SAndroid Build Coastguard Worker     // Simulate that NetEQ reduces its delay.
169*d9f75844SAndroid Build Coastguard Worker     const int kNeteqDelayDecrease = 10;
170*d9f75844SAndroid Build Coastguard Worker     current_audio_delay_ms = base_target_delay_ms + kNeteqDelayDecrease;
171*d9f75844SAndroid Build Coastguard Worker     clock_sender_.AdvanceTimeMilliseconds(1000);
172*d9f75844SAndroid Build Coastguard Worker     clock_receiver_.AdvanceTimeMilliseconds(
173*d9f75844SAndroid Build Coastguard Worker         1000 - std::max(kAudioDelayMs, kVideoDelayMs));
174*d9f75844SAndroid Build Coastguard Worker     // Simulate base_target_delay_ms minimum delay in the VCM.
175*d9f75844SAndroid Build Coastguard Worker     total_video_delay_ms = base_target_delay_ms;
176*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(DelayedStreams(kAudioDelayMs, kVideoDelayMs,
177*d9f75844SAndroid Build Coastguard Worker                                current_audio_delay_ms, &total_audio_delay_ms,
178*d9f75844SAndroid Build Coastguard Worker                                &total_video_delay_ms));
179*d9f75844SAndroid Build Coastguard Worker     filtered_move =
180*d9f75844SAndroid Build Coastguard Worker         filtered_move + (kNeteqDelayDecrease + kAudioDelayMs - kVideoDelayMs) /
181*d9f75844SAndroid Build Coastguard Worker                             kSmoothingFilter;
182*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms + filtered_move, total_video_delay_ms);
183*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms, total_audio_delay_ms);
184*d9f75844SAndroid Build Coastguard Worker   }
185*d9f75844SAndroid Build Coastguard Worker 
BothDelayedVideoLaterTest(int base_target_delay_ms)186*d9f75844SAndroid Build Coastguard Worker   void BothDelayedVideoLaterTest(int base_target_delay_ms) {
187*d9f75844SAndroid Build Coastguard Worker     const int kAudioDelayMs = base_target_delay_ms + 100;
188*d9f75844SAndroid Build Coastguard Worker     const int kVideoDelayMs = base_target_delay_ms + 300;
189*d9f75844SAndroid Build Coastguard Worker     int current_audio_delay_ms = base_target_delay_ms;
190*d9f75844SAndroid Build Coastguard Worker     int total_audio_delay_ms = 0;
191*d9f75844SAndroid Build Coastguard Worker     int total_video_delay_ms = base_target_delay_ms;
192*d9f75844SAndroid Build Coastguard Worker 
193*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(DelayedStreams(kAudioDelayMs, kVideoDelayMs,
194*d9f75844SAndroid Build Coastguard Worker                                current_audio_delay_ms, &total_audio_delay_ms,
195*d9f75844SAndroid Build Coastguard Worker                                &total_video_delay_ms));
196*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms, total_video_delay_ms);
197*d9f75844SAndroid Build Coastguard Worker     // The audio delay is not allowed to change more than this.
198*d9f75844SAndroid Build Coastguard Worker     EXPECT_GE(base_target_delay_ms + kMaxChangeMs, total_audio_delay_ms);
199*d9f75844SAndroid Build Coastguard Worker     int last_total_audio_delay_ms = total_audio_delay_ms;
200*d9f75844SAndroid Build Coastguard Worker 
201*d9f75844SAndroid Build Coastguard Worker     // Set new current audio delay.
202*d9f75844SAndroid Build Coastguard Worker     current_audio_delay_ms = total_audio_delay_ms;
203*d9f75844SAndroid Build Coastguard Worker     clock_sender_.AdvanceTimeMilliseconds(1000);
204*d9f75844SAndroid Build Coastguard Worker     clock_receiver_.AdvanceTimeMilliseconds(800);
205*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(DelayedStreams(kAudioDelayMs, kVideoDelayMs,
206*d9f75844SAndroid Build Coastguard Worker                                current_audio_delay_ms, &total_audio_delay_ms,
207*d9f75844SAndroid Build Coastguard Worker                                &total_video_delay_ms));
208*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms, total_video_delay_ms);
209*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(last_total_audio_delay_ms +
210*d9f75844SAndroid Build Coastguard Worker                   MaxAudioDelayChangeMs(
211*d9f75844SAndroid Build Coastguard Worker                       current_audio_delay_ms,
212*d9f75844SAndroid Build Coastguard Worker                       base_target_delay_ms + kVideoDelayMs - kAudioDelayMs),
213*d9f75844SAndroid Build Coastguard Worker               total_audio_delay_ms);
214*d9f75844SAndroid Build Coastguard Worker     last_total_audio_delay_ms = total_audio_delay_ms;
215*d9f75844SAndroid Build Coastguard Worker 
216*d9f75844SAndroid Build Coastguard Worker     // Set new current audio delay.
217*d9f75844SAndroid Build Coastguard Worker     current_audio_delay_ms = total_audio_delay_ms;
218*d9f75844SAndroid Build Coastguard Worker     clock_sender_.AdvanceTimeMilliseconds(1000);
219*d9f75844SAndroid Build Coastguard Worker     clock_receiver_.AdvanceTimeMilliseconds(800);
220*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(DelayedStreams(kAudioDelayMs, kVideoDelayMs,
221*d9f75844SAndroid Build Coastguard Worker                                current_audio_delay_ms, &total_audio_delay_ms,
222*d9f75844SAndroid Build Coastguard Worker                                &total_video_delay_ms));
223*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms, total_video_delay_ms);
224*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(last_total_audio_delay_ms +
225*d9f75844SAndroid Build Coastguard Worker                   MaxAudioDelayChangeMs(
226*d9f75844SAndroid Build Coastguard Worker                       current_audio_delay_ms,
227*d9f75844SAndroid Build Coastguard Worker                       base_target_delay_ms + kVideoDelayMs - kAudioDelayMs),
228*d9f75844SAndroid Build Coastguard Worker               total_audio_delay_ms);
229*d9f75844SAndroid Build Coastguard Worker     last_total_audio_delay_ms = total_audio_delay_ms;
230*d9f75844SAndroid Build Coastguard Worker 
231*d9f75844SAndroid Build Coastguard Worker     // Simulate that NetEQ for some reason reduced the delay.
232*d9f75844SAndroid Build Coastguard Worker     current_audio_delay_ms = base_target_delay_ms + 10;
233*d9f75844SAndroid Build Coastguard Worker     clock_sender_.AdvanceTimeMilliseconds(1000);
234*d9f75844SAndroid Build Coastguard Worker     clock_receiver_.AdvanceTimeMilliseconds(800);
235*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(DelayedStreams(kAudioDelayMs, kVideoDelayMs,
236*d9f75844SAndroid Build Coastguard Worker                                current_audio_delay_ms, &total_audio_delay_ms,
237*d9f75844SAndroid Build Coastguard Worker                                &total_video_delay_ms));
238*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms, total_video_delay_ms);
239*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(last_total_audio_delay_ms +
240*d9f75844SAndroid Build Coastguard Worker                   MaxAudioDelayChangeMs(
241*d9f75844SAndroid Build Coastguard Worker                       current_audio_delay_ms,
242*d9f75844SAndroid Build Coastguard Worker                       base_target_delay_ms + kVideoDelayMs - kAudioDelayMs),
243*d9f75844SAndroid Build Coastguard Worker               total_audio_delay_ms);
244*d9f75844SAndroid Build Coastguard Worker     last_total_audio_delay_ms = total_audio_delay_ms;
245*d9f75844SAndroid Build Coastguard Worker 
246*d9f75844SAndroid Build Coastguard Worker     // Simulate that NetEQ for some reason significantly increased the delay.
247*d9f75844SAndroid Build Coastguard Worker     current_audio_delay_ms = base_target_delay_ms + 350;
248*d9f75844SAndroid Build Coastguard Worker     clock_sender_.AdvanceTimeMilliseconds(1000);
249*d9f75844SAndroid Build Coastguard Worker     clock_receiver_.AdvanceTimeMilliseconds(800);
250*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(DelayedStreams(kAudioDelayMs, kVideoDelayMs,
251*d9f75844SAndroid Build Coastguard Worker                                current_audio_delay_ms, &total_audio_delay_ms,
252*d9f75844SAndroid Build Coastguard Worker                                &total_video_delay_ms));
253*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(base_target_delay_ms, total_video_delay_ms);
254*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(last_total_audio_delay_ms +
255*d9f75844SAndroid Build Coastguard Worker                   MaxAudioDelayChangeMs(
256*d9f75844SAndroid Build Coastguard Worker                       current_audio_delay_ms,
257*d9f75844SAndroid Build Coastguard Worker                       base_target_delay_ms + kVideoDelayMs - kAudioDelayMs),
258*d9f75844SAndroid Build Coastguard Worker               total_audio_delay_ms);
259*d9f75844SAndroid Build Coastguard Worker   }
260*d9f75844SAndroid Build Coastguard Worker 
MaxAudioDelayChangeMs(int current_audio_delay_ms,int delay_ms) const261*d9f75844SAndroid Build Coastguard Worker   int MaxAudioDelayChangeMs(int current_audio_delay_ms, int delay_ms) const {
262*d9f75844SAndroid Build Coastguard Worker     int diff_ms = (delay_ms - current_audio_delay_ms) / kSmoothingFilter;
263*d9f75844SAndroid Build Coastguard Worker     diff_ms = std::min(diff_ms, kMaxChangeMs);
264*d9f75844SAndroid Build Coastguard Worker     diff_ms = std::max(diff_ms, -kMaxChangeMs);
265*d9f75844SAndroid Build Coastguard Worker     return diff_ms;
266*d9f75844SAndroid Build Coastguard Worker   }
267*d9f75844SAndroid Build Coastguard Worker 
268*d9f75844SAndroid Build Coastguard Worker   StreamSynchronization sync_;
269*d9f75844SAndroid Build Coastguard Worker   SimulatedClock clock_sender_;
270*d9f75844SAndroid Build Coastguard Worker   SimulatedClock clock_receiver_;
271*d9f75844SAndroid Build Coastguard Worker   double audio_clock_drift_ = 1.0;
272*d9f75844SAndroid Build Coastguard Worker   double video_clock_drift_ = 1.0;
273*d9f75844SAndroid Build Coastguard Worker };
274*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,NoDelay)275*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, NoDelay) {
276*d9f75844SAndroid Build Coastguard Worker   int total_audio_delay_ms = 0;
277*d9f75844SAndroid Build Coastguard Worker   int total_video_delay_ms = 0;
278*d9f75844SAndroid Build Coastguard Worker 
279*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(DelayedStreams(/*audio_delay_ms=*/0, /*video_delay_ms=*/0,
280*d9f75844SAndroid Build Coastguard Worker                               /*current_audio_delay_ms=*/0,
281*d9f75844SAndroid Build Coastguard Worker                               &total_audio_delay_ms, &total_video_delay_ms));
282*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, total_audio_delay_ms);
283*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, total_video_delay_ms);
284*d9f75844SAndroid Build Coastguard Worker }
285*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,VideoDelayed)286*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, VideoDelayed) {
287*d9f75844SAndroid Build Coastguard Worker   const int kAudioDelayMs = 200;
288*d9f75844SAndroid Build Coastguard Worker   int total_audio_delay_ms = 0;
289*d9f75844SAndroid Build Coastguard Worker   int total_video_delay_ms = 0;
290*d9f75844SAndroid Build Coastguard Worker 
291*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(DelayedStreams(kAudioDelayMs, /*video_delay_ms=*/0,
292*d9f75844SAndroid Build Coastguard Worker                              /*current_audio_delay_ms=*/0,
293*d9f75844SAndroid Build Coastguard Worker                              &total_audio_delay_ms, &total_video_delay_ms));
294*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, total_audio_delay_ms);
295*d9f75844SAndroid Build Coastguard Worker   // The delay is not allowed to change more than this.
296*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(kAudioDelayMs / kSmoothingFilter, total_video_delay_ms);
297*d9f75844SAndroid Build Coastguard Worker 
298*d9f75844SAndroid Build Coastguard Worker   // Simulate 0 minimum delay in the VCM.
299*d9f75844SAndroid Build Coastguard Worker   total_video_delay_ms = 0;
300*d9f75844SAndroid Build Coastguard Worker   clock_sender_.AdvanceTimeMilliseconds(1000);
301*d9f75844SAndroid Build Coastguard Worker   clock_receiver_.AdvanceTimeMilliseconds(800);
302*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(DelayedStreams(kAudioDelayMs, /*video_delay_ms=*/0,
303*d9f75844SAndroid Build Coastguard Worker                              /*current_audio_delay_ms=*/0,
304*d9f75844SAndroid Build Coastguard Worker                              &total_audio_delay_ms, &total_video_delay_ms));
305*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, total_audio_delay_ms);
306*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(2 * kAudioDelayMs / kSmoothingFilter, total_video_delay_ms);
307*d9f75844SAndroid Build Coastguard Worker 
308*d9f75844SAndroid Build Coastguard Worker   // Simulate 0 minimum delay in the VCM.
309*d9f75844SAndroid Build Coastguard Worker   total_video_delay_ms = 0;
310*d9f75844SAndroid Build Coastguard Worker   clock_sender_.AdvanceTimeMilliseconds(1000);
311*d9f75844SAndroid Build Coastguard Worker   clock_receiver_.AdvanceTimeMilliseconds(800);
312*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(DelayedStreams(kAudioDelayMs, /*video_delay_ms=*/0,
313*d9f75844SAndroid Build Coastguard Worker                              /*current_audio_delay_ms=*/0,
314*d9f75844SAndroid Build Coastguard Worker                              &total_audio_delay_ms, &total_video_delay_ms));
315*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, total_audio_delay_ms);
316*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(3 * kAudioDelayMs / kSmoothingFilter, total_video_delay_ms);
317*d9f75844SAndroid Build Coastguard Worker }
318*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,AudioDelayed)319*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, AudioDelayed) {
320*d9f75844SAndroid Build Coastguard Worker   const int kVideoDelayMs = 200;
321*d9f75844SAndroid Build Coastguard Worker   int current_audio_delay_ms = 0;
322*d9f75844SAndroid Build Coastguard Worker   int total_audio_delay_ms = 0;
323*d9f75844SAndroid Build Coastguard Worker   int total_video_delay_ms = 0;
324*d9f75844SAndroid Build Coastguard Worker 
325*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(DelayedStreams(/*audio_delay_ms=*/0, kVideoDelayMs,
326*d9f75844SAndroid Build Coastguard Worker                              current_audio_delay_ms, &total_audio_delay_ms,
327*d9f75844SAndroid Build Coastguard Worker                              &total_video_delay_ms));
328*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, total_video_delay_ms);
329*d9f75844SAndroid Build Coastguard Worker   // The delay is not allowed to change more than this.
330*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(kVideoDelayMs / kSmoothingFilter, total_audio_delay_ms);
331*d9f75844SAndroid Build Coastguard Worker   int last_total_audio_delay_ms = total_audio_delay_ms;
332*d9f75844SAndroid Build Coastguard Worker 
333*d9f75844SAndroid Build Coastguard Worker   // Set new current audio delay.
334*d9f75844SAndroid Build Coastguard Worker   current_audio_delay_ms = total_audio_delay_ms;
335*d9f75844SAndroid Build Coastguard Worker   clock_sender_.AdvanceTimeMilliseconds(1000);
336*d9f75844SAndroid Build Coastguard Worker   clock_receiver_.AdvanceTimeMilliseconds(800);
337*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(DelayedStreams(/*audio_delay_ms=*/0, kVideoDelayMs,
338*d9f75844SAndroid Build Coastguard Worker                              current_audio_delay_ms, &total_audio_delay_ms,
339*d9f75844SAndroid Build Coastguard Worker                              &total_video_delay_ms));
340*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, total_video_delay_ms);
341*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(last_total_audio_delay_ms +
342*d9f75844SAndroid Build Coastguard Worker                 MaxAudioDelayChangeMs(current_audio_delay_ms, kVideoDelayMs),
343*d9f75844SAndroid Build Coastguard Worker             total_audio_delay_ms);
344*d9f75844SAndroid Build Coastguard Worker   last_total_audio_delay_ms = total_audio_delay_ms;
345*d9f75844SAndroid Build Coastguard Worker 
346*d9f75844SAndroid Build Coastguard Worker   // Set new current audio delay.
347*d9f75844SAndroid Build Coastguard Worker   current_audio_delay_ms = total_audio_delay_ms;
348*d9f75844SAndroid Build Coastguard Worker   clock_sender_.AdvanceTimeMilliseconds(1000);
349*d9f75844SAndroid Build Coastguard Worker   clock_receiver_.AdvanceTimeMilliseconds(800);
350*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(DelayedStreams(/*audio_delay_ms=*/0, kVideoDelayMs,
351*d9f75844SAndroid Build Coastguard Worker                              current_audio_delay_ms, &total_audio_delay_ms,
352*d9f75844SAndroid Build Coastguard Worker                              &total_video_delay_ms));
353*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, total_video_delay_ms);
354*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(last_total_audio_delay_ms +
355*d9f75844SAndroid Build Coastguard Worker                 MaxAudioDelayChangeMs(current_audio_delay_ms, kVideoDelayMs),
356*d9f75844SAndroid Build Coastguard Worker             total_audio_delay_ms);
357*d9f75844SAndroid Build Coastguard Worker   last_total_audio_delay_ms = total_audio_delay_ms;
358*d9f75844SAndroid Build Coastguard Worker 
359*d9f75844SAndroid Build Coastguard Worker   // Simulate that NetEQ for some reason reduced the delay.
360*d9f75844SAndroid Build Coastguard Worker   current_audio_delay_ms = 10;
361*d9f75844SAndroid Build Coastguard Worker   clock_sender_.AdvanceTimeMilliseconds(1000);
362*d9f75844SAndroid Build Coastguard Worker   clock_receiver_.AdvanceTimeMilliseconds(800);
363*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(DelayedStreams(/*audio_delay_ms=*/0, kVideoDelayMs,
364*d9f75844SAndroid Build Coastguard Worker                              current_audio_delay_ms, &total_audio_delay_ms,
365*d9f75844SAndroid Build Coastguard Worker                              &total_video_delay_ms));
366*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, total_video_delay_ms);
367*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(last_total_audio_delay_ms +
368*d9f75844SAndroid Build Coastguard Worker                 MaxAudioDelayChangeMs(current_audio_delay_ms, kVideoDelayMs),
369*d9f75844SAndroid Build Coastguard Worker             total_audio_delay_ms);
370*d9f75844SAndroid Build Coastguard Worker   last_total_audio_delay_ms = total_audio_delay_ms;
371*d9f75844SAndroid Build Coastguard Worker 
372*d9f75844SAndroid Build Coastguard Worker   // Simulate that NetEQ for some reason significantly increased the delay.
373*d9f75844SAndroid Build Coastguard Worker   current_audio_delay_ms = 350;
374*d9f75844SAndroid Build Coastguard Worker   clock_sender_.AdvanceTimeMilliseconds(1000);
375*d9f75844SAndroid Build Coastguard Worker   clock_receiver_.AdvanceTimeMilliseconds(800);
376*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(DelayedStreams(/*audio_delay_ms=*/0, kVideoDelayMs,
377*d9f75844SAndroid Build Coastguard Worker                              current_audio_delay_ms, &total_audio_delay_ms,
378*d9f75844SAndroid Build Coastguard Worker                              &total_video_delay_ms));
379*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, total_video_delay_ms);
380*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(last_total_audio_delay_ms +
381*d9f75844SAndroid Build Coastguard Worker                 MaxAudioDelayChangeMs(current_audio_delay_ms, kVideoDelayMs),
382*d9f75844SAndroid Build Coastguard Worker             total_audio_delay_ms);
383*d9f75844SAndroid Build Coastguard Worker }
384*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,NoAudioIncomingUnboundedIncrease)385*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, NoAudioIncomingUnboundedIncrease) {
386*d9f75844SAndroid Build Coastguard Worker   // Test how audio delay can grow unbounded when audio stops coming in.
387*d9f75844SAndroid Build Coastguard Worker   // This is handled in caller of RtpStreamsSynchronizer, for example in
388*d9f75844SAndroid Build Coastguard Worker   // RtpStreamsSynchronizer by not updating delays when audio samples stop
389*d9f75844SAndroid Build Coastguard Worker   // coming in.
390*d9f75844SAndroid Build Coastguard Worker   const int kVideoDelayMs = 300;
391*d9f75844SAndroid Build Coastguard Worker   const int kAudioDelayMs = 100;
392*d9f75844SAndroid Build Coastguard Worker   int current_audio_delay_ms = kAudioDelayMs;
393*d9f75844SAndroid Build Coastguard Worker   int total_audio_delay_ms = 0;
394*d9f75844SAndroid Build Coastguard Worker   int total_video_delay_ms = 0;
395*d9f75844SAndroid Build Coastguard Worker 
396*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(DelayedStreams(/*audio_delay_ms=*/0, kVideoDelayMs,
397*d9f75844SAndroid Build Coastguard Worker                              current_audio_delay_ms, &total_audio_delay_ms,
398*d9f75844SAndroid Build Coastguard Worker                              &total_video_delay_ms));
399*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, total_video_delay_ms);
400*d9f75844SAndroid Build Coastguard Worker   // The delay is not allowed to change more than this.
401*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ((kVideoDelayMs - kAudioDelayMs) / kSmoothingFilter,
402*d9f75844SAndroid Build Coastguard Worker             total_audio_delay_ms);
403*d9f75844SAndroid Build Coastguard Worker   int last_total_audio_delay_ms = total_audio_delay_ms;
404*d9f75844SAndroid Build Coastguard Worker 
405*d9f75844SAndroid Build Coastguard Worker   // Set new current audio delay: simulate audio samples are flowing in.
406*d9f75844SAndroid Build Coastguard Worker   current_audio_delay_ms = total_audio_delay_ms;
407*d9f75844SAndroid Build Coastguard Worker 
408*d9f75844SAndroid Build Coastguard Worker   clock_sender_.AdvanceTimeMilliseconds(1000);
409*d9f75844SAndroid Build Coastguard Worker   clock_receiver_.AdvanceTimeMilliseconds(1000);
410*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(DelayedStreams(/*audio_delay_ms=*/0, kVideoDelayMs,
411*d9f75844SAndroid Build Coastguard Worker                              current_audio_delay_ms, &total_audio_delay_ms,
412*d9f75844SAndroid Build Coastguard Worker                              &total_video_delay_ms));
413*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, total_video_delay_ms);
414*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(last_total_audio_delay_ms +
415*d9f75844SAndroid Build Coastguard Worker                 MaxAudioDelayChangeMs(current_audio_delay_ms, kVideoDelayMs),
416*d9f75844SAndroid Build Coastguard Worker             total_audio_delay_ms);
417*d9f75844SAndroid Build Coastguard Worker   last_total_audio_delay_ms = total_audio_delay_ms;
418*d9f75844SAndroid Build Coastguard Worker 
419*d9f75844SAndroid Build Coastguard Worker   // Simulate no incoming audio by not update audio delay.
420*d9f75844SAndroid Build Coastguard Worker   const int kSimulationSecs = 300;     // 5min
421*d9f75844SAndroid Build Coastguard Worker   const int kMaxDeltaDelayMs = 10000;  // max delay for audio in webrtc
422*d9f75844SAndroid Build Coastguard Worker   for (auto time_secs = 0; time_secs < kSimulationSecs; time_secs++) {
423*d9f75844SAndroid Build Coastguard Worker     clock_sender_.AdvanceTimeMilliseconds(1000);
424*d9f75844SAndroid Build Coastguard Worker     clock_receiver_.AdvanceTimeMilliseconds(1000);
425*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(DelayedStreams(/*audio_delay_ms=*/0, kVideoDelayMs,
426*d9f75844SAndroid Build Coastguard Worker                                current_audio_delay_ms, &total_audio_delay_ms,
427*d9f75844SAndroid Build Coastguard Worker                                &total_video_delay_ms));
428*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(0, total_video_delay_ms);
429*d9f75844SAndroid Build Coastguard Worker 
430*d9f75844SAndroid Build Coastguard Worker     // Audio delay does not go above kMaxDeltaDelayMs.
431*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(std::min(kMaxDeltaDelayMs,
432*d9f75844SAndroid Build Coastguard Worker                        last_total_audio_delay_ms +
433*d9f75844SAndroid Build Coastguard Worker                            MaxAudioDelayChangeMs(current_audio_delay_ms,
434*d9f75844SAndroid Build Coastguard Worker                                                  kVideoDelayMs)),
435*d9f75844SAndroid Build Coastguard Worker               total_audio_delay_ms);
436*d9f75844SAndroid Build Coastguard Worker     last_total_audio_delay_ms = total_audio_delay_ms;
437*d9f75844SAndroid Build Coastguard Worker   }
438*d9f75844SAndroid Build Coastguard Worker   // By now the audio delay has grown unbounded to kMaxDeltaDelayMs.
439*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(kMaxDeltaDelayMs, last_total_audio_delay_ms);
440*d9f75844SAndroid Build Coastguard Worker }
441*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,BothDelayedVideoLater)442*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, BothDelayedVideoLater) {
443*d9f75844SAndroid Build Coastguard Worker   BothDelayedVideoLaterTest(0);
444*d9f75844SAndroid Build Coastguard Worker }
445*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,BothDelayedVideoLaterAudioClockDrift)446*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, BothDelayedVideoLaterAudioClockDrift) {
447*d9f75844SAndroid Build Coastguard Worker   audio_clock_drift_ = 1.05;
448*d9f75844SAndroid Build Coastguard Worker   BothDelayedVideoLaterTest(0);
449*d9f75844SAndroid Build Coastguard Worker }
450*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,BothDelayedVideoLaterVideoClockDrift)451*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, BothDelayedVideoLaterVideoClockDrift) {
452*d9f75844SAndroid Build Coastguard Worker   video_clock_drift_ = 1.05;
453*d9f75844SAndroid Build Coastguard Worker   BothDelayedVideoLaterTest(0);
454*d9f75844SAndroid Build Coastguard Worker }
455*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,BothDelayedAudioLater)456*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, BothDelayedAudioLater) {
457*d9f75844SAndroid Build Coastguard Worker   BothDelayedAudioLaterTest(0);
458*d9f75844SAndroid Build Coastguard Worker }
459*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,BothDelayedAudioClockDrift)460*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, BothDelayedAudioClockDrift) {
461*d9f75844SAndroid Build Coastguard Worker   audio_clock_drift_ = 1.05;
462*d9f75844SAndroid Build Coastguard Worker   BothDelayedAudioLaterTest(0);
463*d9f75844SAndroid Build Coastguard Worker }
464*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,BothDelayedVideoClockDrift)465*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, BothDelayedVideoClockDrift) {
466*d9f75844SAndroid Build Coastguard Worker   video_clock_drift_ = 1.05;
467*d9f75844SAndroid Build Coastguard Worker   BothDelayedAudioLaterTest(0);
468*d9f75844SAndroid Build Coastguard Worker }
469*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,BothEquallyDelayed)470*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, BothEquallyDelayed) {
471*d9f75844SAndroid Build Coastguard Worker   const int kDelayMs = 2000;
472*d9f75844SAndroid Build Coastguard Worker   int current_audio_delay_ms = kDelayMs;
473*d9f75844SAndroid Build Coastguard Worker   int total_audio_delay_ms = 0;
474*d9f75844SAndroid Build Coastguard Worker   int total_video_delay_ms = kDelayMs;
475*d9f75844SAndroid Build Coastguard Worker   // In sync, expect no change.
476*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(DelayedStreams(kDelayMs, kDelayMs, current_audio_delay_ms,
477*d9f75844SAndroid Build Coastguard Worker                               &total_audio_delay_ms, &total_video_delay_ms));
478*d9f75844SAndroid Build Coastguard Worker   // Trigger another call with the same values, delay should not be modified.
479*d9f75844SAndroid Build Coastguard Worker   total_video_delay_ms = kDelayMs;
480*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(DelayedStreams(kDelayMs, kDelayMs, current_audio_delay_ms,
481*d9f75844SAndroid Build Coastguard Worker                               &total_audio_delay_ms, &total_video_delay_ms));
482*d9f75844SAndroid Build Coastguard Worker   // Change delay value, delay should not be modified.
483*d9f75844SAndroid Build Coastguard Worker   const int kDelayMs2 = 5000;
484*d9f75844SAndroid Build Coastguard Worker   current_audio_delay_ms = kDelayMs2;
485*d9f75844SAndroid Build Coastguard Worker   total_video_delay_ms = kDelayMs2;
486*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(DelayedStreams(kDelayMs2, kDelayMs2, current_audio_delay_ms,
487*d9f75844SAndroid Build Coastguard Worker                               &total_audio_delay_ms, &total_video_delay_ms));
488*d9f75844SAndroid Build Coastguard Worker }
489*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,BothDelayedAudioLaterWithBaseDelay)490*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, BothDelayedAudioLaterWithBaseDelay) {
491*d9f75844SAndroid Build Coastguard Worker   const int kBaseTargetDelayMs = 3000;
492*d9f75844SAndroid Build Coastguard Worker   sync_.SetTargetBufferingDelay(kBaseTargetDelayMs);
493*d9f75844SAndroid Build Coastguard Worker   BothDelayedAudioLaterTest(kBaseTargetDelayMs);
494*d9f75844SAndroid Build Coastguard Worker }
495*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,BothDelayedAudioClockDriftWithBaseDelay)496*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, BothDelayedAudioClockDriftWithBaseDelay) {
497*d9f75844SAndroid Build Coastguard Worker   const int kBaseTargetDelayMs = 3000;
498*d9f75844SAndroid Build Coastguard Worker   sync_.SetTargetBufferingDelay(kBaseTargetDelayMs);
499*d9f75844SAndroid Build Coastguard Worker   audio_clock_drift_ = 1.05;
500*d9f75844SAndroid Build Coastguard Worker   BothDelayedAudioLaterTest(kBaseTargetDelayMs);
501*d9f75844SAndroid Build Coastguard Worker }
502*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,BothDelayedVideoClockDriftWithBaseDelay)503*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, BothDelayedVideoClockDriftWithBaseDelay) {
504*d9f75844SAndroid Build Coastguard Worker   const int kBaseTargetDelayMs = 3000;
505*d9f75844SAndroid Build Coastguard Worker   sync_.SetTargetBufferingDelay(kBaseTargetDelayMs);
506*d9f75844SAndroid Build Coastguard Worker   video_clock_drift_ = 1.05;
507*d9f75844SAndroid Build Coastguard Worker   BothDelayedAudioLaterTest(kBaseTargetDelayMs);
508*d9f75844SAndroid Build Coastguard Worker }
509*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,BothDelayedVideoLaterWithBaseDelay)510*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest, BothDelayedVideoLaterWithBaseDelay) {
511*d9f75844SAndroid Build Coastguard Worker   const int kBaseTargetDelayMs = 2000;
512*d9f75844SAndroid Build Coastguard Worker   sync_.SetTargetBufferingDelay(kBaseTargetDelayMs);
513*d9f75844SAndroid Build Coastguard Worker   BothDelayedVideoLaterTest(kBaseTargetDelayMs);
514*d9f75844SAndroid Build Coastguard Worker }
515*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,BothDelayedVideoLaterAudioClockDriftWithBaseDelay)516*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest,
517*d9f75844SAndroid Build Coastguard Worker        BothDelayedVideoLaterAudioClockDriftWithBaseDelay) {
518*d9f75844SAndroid Build Coastguard Worker   const int kBaseTargetDelayMs = 2000;
519*d9f75844SAndroid Build Coastguard Worker   audio_clock_drift_ = 1.05;
520*d9f75844SAndroid Build Coastguard Worker   sync_.SetTargetBufferingDelay(kBaseTargetDelayMs);
521*d9f75844SAndroid Build Coastguard Worker   BothDelayedVideoLaterTest(kBaseTargetDelayMs);
522*d9f75844SAndroid Build Coastguard Worker }
523*d9f75844SAndroid Build Coastguard Worker 
TEST_F(StreamSynchronizationTest,BothDelayedVideoLaterVideoClockDriftWithBaseDelay)524*d9f75844SAndroid Build Coastguard Worker TEST_F(StreamSynchronizationTest,
525*d9f75844SAndroid Build Coastguard Worker        BothDelayedVideoLaterVideoClockDriftWithBaseDelay) {
526*d9f75844SAndroid Build Coastguard Worker   const int kBaseTargetDelayMs = 2000;
527*d9f75844SAndroid Build Coastguard Worker   video_clock_drift_ = 1.05;
528*d9f75844SAndroid Build Coastguard Worker   sync_.SetTargetBufferingDelay(kBaseTargetDelayMs);
529*d9f75844SAndroid Build Coastguard Worker   BothDelayedVideoLaterTest(kBaseTargetDelayMs);
530*d9f75844SAndroid Build Coastguard Worker }
531*d9f75844SAndroid Build Coastguard Worker 
532*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
533