1 /* 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/voice_engine/test/auto_test/fixtures/after_streaming_fixture.h" 12 #include "webrtc/voice_engine/voice_engine_defines.h" 13 14 class CodecTest : public AfterStreamingFixture { 15 protected: 16 void SetUp() { 17 memset(&codec_instance_, 0, sizeof(codec_instance_)); 18 } 19 20 void SetArbitrarySendCodec() { 21 // Just grab the first codec. 22 EXPECT_EQ(0, voe_codec_->GetCodec(0, codec_instance_)); 23 EXPECT_EQ(0, voe_codec_->SetSendCodec(channel_, codec_instance_)); 24 } 25 26 webrtc::CodecInst codec_instance_; 27 }; 28 29 static void SetRateIfILBC(webrtc::CodecInst* codec_instance, int packet_size) { 30 if (!_stricmp(codec_instance->plname, "ilbc")) { 31 if (packet_size == 160 || packet_size == 320) { 32 codec_instance->rate = 15200; 33 } else { 34 codec_instance->rate = 13300; 35 } 36 } 37 } 38 39 static bool IsNotViableSendCodec(const char* codec_name) { 40 return !_stricmp(codec_name, "CN") || 41 !_stricmp(codec_name, "telephone-event") || 42 !_stricmp(codec_name, "red"); 43 } 44 45 TEST_F(CodecTest, PcmuIsDefaultCodecAndHasTheRightValues) { 46 EXPECT_EQ(0, voe_codec_->GetSendCodec(channel_, codec_instance_)); 47 EXPECT_EQ(1, codec_instance_.channels); 48 EXPECT_EQ(160, codec_instance_.pacsize); 49 EXPECT_EQ(8000, codec_instance_.plfreq); 50 EXPECT_EQ(0, codec_instance_.pltype); 51 EXPECT_EQ(64000, codec_instance_.rate); 52 EXPECT_STRCASEEQ("PCMU", codec_instance_.plname); 53 } 54 55 TEST_F(CodecTest, VoiceActivityDetectionIsOffByDefault) { 56 bool vad_enabled = false; 57 bool dtx_disabled = false; 58 webrtc::VadModes vad_mode = webrtc::kVadAggressiveMid; 59 60 voe_codec_->GetVADStatus(channel_, vad_enabled, vad_mode, dtx_disabled); 61 62 EXPECT_FALSE(vad_enabled); 63 EXPECT_TRUE(dtx_disabled); 64 EXPECT_EQ(webrtc::kVadConventional, vad_mode); 65 } 66 67 TEST_F(CodecTest, VoiceActivityDetectionCanBeEnabled) { 68 EXPECT_EQ(0, voe_codec_->SetVADStatus(channel_, true)); 69 70 bool vad_enabled = false; 71 bool dtx_disabled = false; 72 webrtc::VadModes vad_mode = webrtc::kVadAggressiveMid; 73 74 voe_codec_->GetVADStatus(channel_, vad_enabled, vad_mode, dtx_disabled); 75 76 EXPECT_TRUE(vad_enabled); 77 EXPECT_EQ(webrtc::kVadConventional, vad_mode); 78 EXPECT_FALSE(dtx_disabled); 79 } 80 81 TEST_F(CodecTest, VoiceActivityDetectionTypeSettingsCanBeChanged) { 82 bool vad_enabled = false; 83 bool dtx_disabled = false; 84 webrtc::VadModes vad_mode = webrtc::kVadAggressiveMid; 85 86 EXPECT_EQ(0, voe_codec_->SetVADStatus( 87 channel_, true, webrtc::kVadAggressiveLow, false)); 88 EXPECT_EQ(0, voe_codec_->GetVADStatus( 89 channel_, vad_enabled, vad_mode, dtx_disabled)); 90 EXPECT_EQ(vad_mode, webrtc::kVadAggressiveLow); 91 EXPECT_FALSE(dtx_disabled); 92 93 EXPECT_EQ(0, voe_codec_->SetVADStatus( 94 channel_, true, webrtc::kVadAggressiveMid, false)); 95 EXPECT_EQ(0, voe_codec_->GetVADStatus( 96 channel_, vad_enabled, vad_mode, dtx_disabled)); 97 EXPECT_EQ(vad_mode, webrtc::kVadAggressiveMid); 98 EXPECT_FALSE(dtx_disabled); 99 100 // The fourth argument is the DTX disable flag. 101 EXPECT_EQ(0, voe_codec_->SetVADStatus( 102 channel_, true, webrtc::kVadAggressiveHigh, true)); 103 EXPECT_EQ(0, voe_codec_->GetVADStatus( 104 channel_, vad_enabled, vad_mode, dtx_disabled)); 105 EXPECT_EQ(vad_mode, webrtc::kVadAggressiveHigh); 106 EXPECT_TRUE(dtx_disabled); 107 108 EXPECT_EQ(0, voe_codec_->SetVADStatus( 109 channel_, true, webrtc::kVadConventional, true)); 110 EXPECT_EQ(0, voe_codec_->GetVADStatus( 111 channel_, vad_enabled, vad_mode, dtx_disabled)); 112 EXPECT_EQ(vad_mode, webrtc::kVadConventional); 113 } 114 115 TEST_F(CodecTest, VoiceActivityDetectionCanBeTurnedOff) { 116 EXPECT_EQ(0, voe_codec_->SetVADStatus(channel_, true)); 117 118 // VAD is always on when DTX is on, so we need to turn off DTX too. 119 EXPECT_EQ(0, voe_codec_->SetVADStatus( 120 channel_, false, webrtc::kVadConventional, true)); 121 122 bool vad_enabled = false; 123 bool dtx_disabled = false; 124 webrtc::VadModes vad_mode = webrtc::kVadAggressiveMid; 125 126 voe_codec_->GetVADStatus(channel_, vad_enabled, vad_mode, dtx_disabled); 127 128 EXPECT_FALSE(vad_enabled); 129 EXPECT_TRUE(dtx_disabled); 130 EXPECT_EQ(webrtc::kVadConventional, vad_mode); 131 } 132 133 TEST_F(CodecTest, OpusMaxPlaybackRateCanBeSet) { 134 for (int i = 0; i < voe_codec_->NumOfCodecs(); ++i) { 135 voe_codec_->GetCodec(i, codec_instance_); 136 if (_stricmp("opus", codec_instance_.plname)) { 137 continue; 138 } 139 voe_codec_->SetSendCodec(channel_, codec_instance_); 140 // SetOpusMaxPlaybackRate can handle any integer as the bandwidth. Following 141 // tests some most commonly used numbers. 142 EXPECT_EQ(0, voe_codec_->SetOpusMaxPlaybackRate(channel_, 48000)); 143 EXPECT_EQ(0, voe_codec_->SetOpusMaxPlaybackRate(channel_, 32000)); 144 EXPECT_EQ(0, voe_codec_->SetOpusMaxPlaybackRate(channel_, 16000)); 145 EXPECT_EQ(0, voe_codec_->SetOpusMaxPlaybackRate(channel_, 8000)); 146 } 147 } 148 149 TEST_F(CodecTest, OpusMaxPlaybackRateCannotBeSetForNonOpus) { 150 for (int i = 0; i < voe_codec_->NumOfCodecs(); ++i) { 151 voe_codec_->GetCodec(i, codec_instance_); 152 if (!_stricmp("opus", codec_instance_.plname)) { 153 continue; 154 } 155 voe_codec_->SetSendCodec(channel_, codec_instance_); 156 EXPECT_EQ(-1, voe_codec_->SetOpusMaxPlaybackRate(channel_, 16000)); 157 } 158 } 159 160 // TODO(xians, phoglund): Re-enable when issue 372 is resolved. 161 TEST_F(CodecTest, DISABLED_ManualVerifySendCodecsForAllPacketSizes) { 162 for (int i = 0; i < voe_codec_->NumOfCodecs(); ++i) { 163 voe_codec_->GetCodec(i, codec_instance_); 164 if (IsNotViableSendCodec(codec_instance_.plname)) { 165 TEST_LOG("Skipping %s.\n", codec_instance_.plname); 166 continue; 167 } 168 EXPECT_NE(-1, codec_instance_.pltype) << 169 "The codec database should suggest a payload type."; 170 171 // Test with default packet size: 172 TEST_LOG("%s (pt=%d): default packet size(%d), accepts sizes ", 173 codec_instance_.plname, codec_instance_.pltype, 174 codec_instance_.pacsize); 175 voe_codec_->SetSendCodec(channel_, codec_instance_); 176 Sleep(CODEC_TEST_TIME); 177 178 // Now test other reasonable packet sizes: 179 bool at_least_one_succeeded = false; 180 for (int packet_size = 80; packet_size < 1000; packet_size += 80) { 181 SetRateIfILBC(&codec_instance_, packet_size); 182 codec_instance_.pacsize = packet_size; 183 184 if (voe_codec_->SetSendCodec(channel_, codec_instance_) != -1) { 185 // Note that it's fine for SetSendCodec to fail - what packet sizes 186 // it accepts depends on the codec. It should accept one at minimum. 187 TEST_LOG("%d ", packet_size); 188 TEST_LOG_FLUSH; 189 at_least_one_succeeded = true; 190 Sleep(CODEC_TEST_TIME); 191 } 192 } 193 TEST_LOG("\n"); 194 EXPECT_TRUE(at_least_one_succeeded); 195 } 196 } 197