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