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