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