1e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org/*
2e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org *
4e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org *  Use of this source code is governed by a BSD-style license
5e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org *  that can be found in the LICENSE file in the root of the source
6e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org *  tree. An additional intellectual property rights grant can be found
7e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org *  in the file PATENTS.  All contributing project authors may
8e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org */
10e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
113c0aae17f0e3a70fe90ecc6835926b66a3de18fbkjellander@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
1200b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org#include "webrtc/base/scoped_ptr.h"
13e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org#include "webrtc/common_types.h"
143c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h"
153e6db2321ccdc8738c9cecbe9bdab13d4f0f658dkjellander#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
163e6db2321ccdc8738c9cecbe9bdab13d4f0f658dkjellander#include "webrtc/modules/audio_coding/test/utility.h"
17ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/include/module_common_types.h"
1898f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/sleep.h"
192ab209ef14240b02801cd0282df5b5a6ab8a6ddbpbos@webrtc.org#include "webrtc/test/testsupport/fileutils.h"
20e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
21e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.orgnamespace webrtc {
22e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
23adaf80961280dfecd3fdcc23bd3fa0a312ce42dehenrik.lundin@webrtc.orgclass TargetDelayTest : public ::testing::Test {
24adaf80961280dfecd3fdcc23bd3fa0a312ce42dehenrik.lundin@webrtc.org protected:
25adaf80961280dfecd3fdcc23bd3fa0a312ce42dehenrik.lundin@webrtc.org  TargetDelayTest() : acm_(AudioCodingModule::Create(0)) {}
266ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
276ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  ~TargetDelayTest() {}
28e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
29e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  void SetUp() {
3089df0928071d156777aa82755e701755b4829576andrew@webrtc.org    EXPECT_TRUE(acm_.get() != NULL);
31e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
32e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    CodecInst codec;
33e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    ASSERT_EQ(0, AudioCodingModule::Codec("L16", &codec, kSampleRateHz, 1));
34e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    ASSERT_EQ(0, acm_->InitializeReceiver());
35e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    ASSERT_EQ(0, acm_->RegisterReceiveCodec(codec));
36e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
37e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    rtp_info_.header.payloadType = codec.pltype;
38e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    rtp_info_.header.timestamp = 0;
39e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    rtp_info_.header.ssrc = 0x12345678;
40e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    rtp_info_.header.markerBit = false;
41e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    rtp_info_.header.sequenceNumber = 0;
42e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    rtp_info_.type.Audio.channel = 1;
43e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    rtp_info_.type.Audio.isCNG = false;
44e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    rtp_info_.frameType = kAudioFrameSpeech;
456ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
466ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    int16_t audio[kFrameSizeSamples];
476ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    const int kRange = 0x7FF;  // 2047, easy for masking.
484591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org    for (size_t n = 0; n < kFrameSizeSamples; ++n)
496ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org      audio[n] = (rand() & kRange) - kRange / 2;
506ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    WebRtcPcm16b_Encode(audio, kFrameSizeSamples, payload_);
516ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  }
526ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
536ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  void OutOfRangeInput() {
546ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    EXPECT_EQ(-1, SetMinimumDelay(-1));
556ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    EXPECT_EQ(-1, SetMinimumDelay(10001));
566ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  }
576ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
586ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  void NoTargetDelayBufferSizeChanges() {
596ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    for (int n = 0; n < 30; ++n)  // Run enough iterations.
606ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org      Run(true);
616ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    int clean_optimal_delay = GetCurrentOptimalDelayMs();
626ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    Run(false);  // Run with jitter.
636ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    int jittery_optimal_delay = GetCurrentOptimalDelayMs();
646ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    EXPECT_GT(jittery_optimal_delay, clean_optimal_delay);
656ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    int required_delay = RequiredDelay();
666ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    EXPECT_GT(required_delay, 0);
676ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    EXPECT_NEAR(required_delay, jittery_optimal_delay, 1);
686ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  }
696ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
706ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  void WithTargetDelayBufferNotChanging() {
716ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    // A target delay that is one packet larger than jitter.
726ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    const int kTargetDelayMs = (kInterarrivalJitterPacket + 1) *
736ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org        kNum10msPerFrame * 10;
746ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    ASSERT_EQ(0, SetMinimumDelay(kTargetDelayMs));
756ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    for (int n = 0; n < 30; ++n)  // Run enough iterations to fill the buffer.
766ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org      Run(true);
776ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    int clean_optimal_delay = GetCurrentOptimalDelayMs();
786ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    EXPECT_EQ(kTargetDelayMs, clean_optimal_delay);
796ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    Run(false);  // Run with jitter.
806ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    int jittery_optimal_delay = GetCurrentOptimalDelayMs();
816ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    EXPECT_EQ(jittery_optimal_delay, clean_optimal_delay);
826ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  }
836ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
846ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  void RequiredDelayAtCorrectRange() {
856ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    for (int n = 0; n < 30; ++n)  // Run clean and store delay.
866ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org      Run(true);
876ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    int clean_optimal_delay = GetCurrentOptimalDelayMs();
886ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
896ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    // A relatively large delay.
906ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    const int kTargetDelayMs = (kInterarrivalJitterPacket + 10) *
916ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org        kNum10msPerFrame * 10;
926ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    ASSERT_EQ(0, SetMinimumDelay(kTargetDelayMs));
936ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    for (int n = 0; n < 300; ++n)  // Run enough iterations to fill the buffer.
946ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org      Run(true);
956ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    Run(false);  // Run with jitter.
966ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
976ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    int jittery_optimal_delay = GetCurrentOptimalDelayMs();
986ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    EXPECT_EQ(kTargetDelayMs, jittery_optimal_delay);
996ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
1006ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    int required_delay = RequiredDelay();
1016ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
1026ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    // Checking |required_delay| is in correct range.
1036ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    EXPECT_GT(required_delay, 0);
1046ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    EXPECT_GT(jittery_optimal_delay, required_delay);
1056ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    EXPECT_GT(required_delay, clean_optimal_delay);
1066ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
1076ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    // A tighter check for the value of |required_delay|.
1086ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    // The jitter forces a delay of
1096ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    // |kInterarrivalJitterPacket * kNum10msPerFrame * 10| milliseconds. So we
1106ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    // expect |required_delay| be close to that.
1116ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    EXPECT_NEAR(kInterarrivalJitterPacket * kNum10msPerFrame * 10,
1126ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org                required_delay, 1);
1136ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  }
1146ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
1156ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  void TargetDelayBufferMinMax() {
1166ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    const int kTargetMinDelayMs = kNum10msPerFrame * 10;
1176ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    ASSERT_EQ(0, SetMinimumDelay(kTargetMinDelayMs));
1186ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    for (int m = 0; m < 30; ++m)  // Run enough iterations to fill the buffer.
1196ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org      Run(true);
1206ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    int clean_optimal_delay = GetCurrentOptimalDelayMs();
1216ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    EXPECT_EQ(kTargetMinDelayMs, clean_optimal_delay);
1226ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
1236ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    const int kTargetMaxDelayMs = 2 * (kNum10msPerFrame * 10);
1246ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    ASSERT_EQ(0, SetMaximumDelay(kTargetMaxDelayMs));
1256ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    for (int n = 0; n < 30; ++n)  // Run enough iterations to fill the buffer.
1266ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org      Run(false);
1276ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
1286ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    int capped_optimal_delay = GetCurrentOptimalDelayMs();
1296ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    EXPECT_EQ(kTargetMaxDelayMs, capped_optimal_delay);
130e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  }
131e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
1326ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org private:
1336ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  static const int kSampleRateHz = 16000;
1346ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  static const int kNum10msPerFrame = 2;
1354591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  static const size_t kFrameSizeSamples = 320;  // 20 ms @ 16 kHz.
1366ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  // payload-len = frame-samples * 2 bytes/sample.
1376ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  static const int kPayloadLenBytes = 320 * 2;
1386ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  // Inter-arrival time in number of packets in a jittery channel. One is no
1396ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  // jitter.
1406ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  static const int kInterarrivalJitterPacket = 2;
1416ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
142e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  void Push() {
143e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    rtp_info_.header.timestamp += kFrameSizeSamples;
144e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    rtp_info_.header.sequenceNumber++;
1456ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    ASSERT_EQ(0, acm_->IncomingPacket(payload_, kFrameSizeSamples * 2,
146e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org                                      rtp_info_));
147e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  }
148e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
149e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  // Pull audio equivalent to the amount of audio in one RTP packet.
150e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  void Pull() {
151e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    AudioFrame frame;
152e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    for (int k = 0; k < kNum10msPerFrame; ++k) {  // Pull one frame.
153e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org      ASSERT_EQ(0, acm_->PlayoutData10Ms(-1, &frame));
154e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org      // Had to use ASSERT_TRUE, ASSERT_EQ generated error.
155e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org      ASSERT_TRUE(kSampleRateHz == frame.sample_rate_hz_);
1566955870806624479723addfae6dcf5d13968796cPeter Kasting      ASSERT_EQ(1u, frame.num_channels_);
157e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org      ASSERT_TRUE(kSampleRateHz / 100 == frame.samples_per_channel_);
158e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    }
159e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  }
160e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
161e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  void Run(bool clean) {
162e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    for (int n = 0; n < 10; ++n) {
163e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org      for (int m = 0; m < 5; ++m) {
164e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org        Push();
165e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org        Pull();
166e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org      }
167e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
168e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org      if (!clean) {
169e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org        for (int m = 0; m < 10; ++m) {  // Long enough to trigger delay change.
170e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org          Push();
171e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org          for (int n = 0; n < kInterarrivalJitterPacket; ++n)
172e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org            Pull();
173e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org        }
174e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org      }
175e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    }
176e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  }
177e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
178e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  int SetMinimumDelay(int delay_ms) {
179e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    return acm_->SetMinimumPlayoutDelay(delay_ms);
180e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  }
181e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
182401ef361ac3651f8089ab26cedfa65ccec3e6555pwestin@webrtc.org  int SetMaximumDelay(int delay_ms) {
183401ef361ac3651f8089ab26cedfa65ccec3e6555pwestin@webrtc.org    return acm_->SetMaximumPlayoutDelay(delay_ms);
184401ef361ac3651f8089ab26cedfa65ccec3e6555pwestin@webrtc.org  }
185401ef361ac3651f8089ab26cedfa65ccec3e6555pwestin@webrtc.org
186e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  int GetCurrentOptimalDelayMs() {
187c0bd7be0df67735d63f5cdd302a3b85f88239874minyue@webrtc.org    NetworkStatistics stats;
188c0bd7be0df67735d63f5cdd302a3b85f88239874minyue@webrtc.org    acm_->GetNetworkStatistics(&stats);
189e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    return stats.preferredBufferSize;
190e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  }
191e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
192e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  int RequiredDelay() {
193e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org    return acm_->LeastRequiredDelayMs();
194e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  }
195e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
19600b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<AudioCodingModule> acm_;
197e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org  WebRtcRTPHeader rtp_info_;
1986ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  uint8_t payload_[kPayloadLenBytes];
199e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org};
200e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
201e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#if defined(WEBRTC_ANDROID)
202e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_OutOfRangeInput DISABLED_OutOfRangeInput
203e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#else
204e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_OutOfRangeInput OutOfRangeInput
205e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#endif
206e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter BoströmTEST_F(TargetDelayTest, MAYBE_OutOfRangeInput) {
207adaf80961280dfecd3fdcc23bd3fa0a312ce42dehenrik.lundin@webrtc.org  OutOfRangeInput();
2086ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org}
2096ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
210e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#if defined(WEBRTC_ANDROID)
211e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_NoTargetDelayBufferSizeChanges \
212e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström  DISABLED_NoTargetDelayBufferSizeChanges
213e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#else
214e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_NoTargetDelayBufferSizeChanges NoTargetDelayBufferSizeChanges
215e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#endif
216e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter BoströmTEST_F(TargetDelayTest, MAYBE_NoTargetDelayBufferSizeChanges) {
217adaf80961280dfecd3fdcc23bd3fa0a312ce42dehenrik.lundin@webrtc.org  NoTargetDelayBufferSizeChanges();
2186ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org}
2196ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
220e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#if defined(WEBRTC_ANDROID)
221e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_WithTargetDelayBufferNotChanging \
222e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström  DISABLED_WithTargetDelayBufferNotChanging
223e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#else
224e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_WithTargetDelayBufferNotChanging WithTargetDelayBufferNotChanging
225e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#endif
226e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter BoströmTEST_F(TargetDelayTest, MAYBE_WithTargetDelayBufferNotChanging) {
227adaf80961280dfecd3fdcc23bd3fa0a312ce42dehenrik.lundin@webrtc.org  WithTargetDelayBufferNotChanging();
228e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org}
229e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
230e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#if defined(WEBRTC_ANDROID)
231e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_RequiredDelayAtCorrectRange DISABLED_RequiredDelayAtCorrectRange
232e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#else
233e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_RequiredDelayAtCorrectRange RequiredDelayAtCorrectRange
234e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#endif
235e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter BoströmTEST_F(TargetDelayTest, MAYBE_RequiredDelayAtCorrectRange) {
236adaf80961280dfecd3fdcc23bd3fa0a312ce42dehenrik.lundin@webrtc.org  RequiredDelayAtCorrectRange();
237e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org}
238e46c8d387587ba148e229a7bb18f1cc0708a2a87turaj@webrtc.org
239e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#if defined(WEBRTC_ANDROID)
240e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_TargetDelayBufferMinMax DISABLED_TargetDelayBufferMinMax
241e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#else
242e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_TargetDelayBufferMinMax TargetDelayBufferMinMax
243e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#endif
244e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter BoströmTEST_F(TargetDelayTest, MAYBE_TargetDelayBufferMinMax) {
245adaf80961280dfecd3fdcc23bd3fa0a312ce42dehenrik.lundin@webrtc.org  TargetDelayBufferMinMax();
246401ef361ac3651f8089ab26cedfa65ccec3e6555pwestin@webrtc.org}
247401ef361ac3651f8089ab26cedfa65ccec3e6555pwestin@webrtc.org
2486ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org}  // namespace webrtc
2496ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org
250