1 /*
2  *  Copyright (c) 2012 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/include/voe_codec.h"
12 
13 #include "testing/gtest/include/gtest/gtest.h"
14 #include "webrtc/base/scoped_ptr.h"
15 #include "webrtc/modules/audio_device/include/fake_audio_device.h"
16 #include "webrtc/voice_engine/include/voe_base.h"
17 #include "webrtc/voice_engine/include/voe_hardware.h"
18 #include "webrtc/voice_engine/voice_engine_defines.h"
19 
20 namespace webrtc {
21 namespace voe {
22 namespace {
23 
24 class VoECodecTest : public ::testing::Test {
25  protected:
VoECodecTest()26   VoECodecTest()
27       : voe_(VoiceEngine::Create()),
28         base_(VoEBase::GetInterface(voe_)),
29         voe_codec_(VoECodec::GetInterface(voe_)),
30         channel_(-1),
31         adm_(new FakeAudioDeviceModule),
32         red_payload_type_(-1) {}
33 
~VoECodecTest()34   ~VoECodecTest() {}
35 
TearDown()36   void TearDown() {
37     base_->DeleteChannel(channel_);
38     base_->Terminate();
39     base_->Release();
40     voe_codec_->Release();
41     VoiceEngine::Delete(voe_);
42   }
43 
SetUp()44   void SetUp() {
45     // Check if all components are valid.
46     ASSERT_TRUE(voe_ != NULL);
47     ASSERT_TRUE(base_ != NULL);
48     ASSERT_TRUE(voe_codec_ != NULL);
49     ASSERT_TRUE(adm_.get() != NULL);
50     ASSERT_EQ(0, base_->Init(adm_.get()));
51     channel_ = base_->CreateChannel();
52     ASSERT_NE(-1, channel_);
53 
54     CodecInst my_codec;
55 
56     bool primary_found = false;
57     bool valid_secondary_found = false;
58     bool invalid_secondary_found = false;
59 
60     // Find primary and secondary codecs.
61     int num_codecs = voe_codec_->NumOfCodecs();
62     int n = 0;
63     while (n < num_codecs &&
64            (!primary_found || !valid_secondary_found ||
65             !invalid_secondary_found || red_payload_type_ < 0)) {
66       EXPECT_EQ(0, voe_codec_->GetCodec(n, my_codec));
67       if (!STR_CASE_CMP(my_codec.plname, "isac") && my_codec.plfreq == 16000) {
68         memcpy(&valid_secondary_, &my_codec, sizeof(my_codec));
69         valid_secondary_found = true;
70       } else if (!STR_CASE_CMP(my_codec.plname, "isac") &&
71                  my_codec.plfreq == 32000) {
72         memcpy(&invalid_secondary_, &my_codec, sizeof(my_codec));
73         invalid_secondary_found = true;
74       } else if (!STR_CASE_CMP(my_codec.plname, "L16") &&
75                  my_codec.plfreq == 16000) {
76         memcpy(&primary_, &my_codec, sizeof(my_codec));
77         primary_found = true;
78       } else if (!STR_CASE_CMP(my_codec.plname, "RED")) {
79         red_payload_type_ = my_codec.pltype;
80       }
81       n++;
82     }
83 
84     EXPECT_TRUE(primary_found);
85     EXPECT_TRUE(valid_secondary_found);
86     EXPECT_TRUE(invalid_secondary_found);
87     EXPECT_NE(-1, red_payload_type_);
88   }
89 
90   VoiceEngine* voe_;
91   VoEBase* base_;
92   VoECodec* voe_codec_;
93   int channel_;
94   CodecInst primary_;
95   CodecInst valid_secondary_;
96   rtc::scoped_ptr<FakeAudioDeviceModule> adm_;
97 
98   // A codec which is not valid to be registered as secondary codec.
99   CodecInst invalid_secondary_;
100   int red_payload_type_;
101 };
102 
TEST(VoECodecInst,TestCompareCodecInstances)103 TEST(VoECodecInst, TestCompareCodecInstances) {
104   CodecInst codec1, codec2;
105   memset(&codec1, 0, sizeof(CodecInst));
106   memset(&codec2, 0, sizeof(CodecInst));
107 
108   codec1.pltype = 101;
109   strncpy(codec1.plname, "isac", 4);
110   codec1.plfreq = 8000;
111   codec1.pacsize = 110;
112   codec1.channels = 1;
113   codec1.rate = 8000;
114   memcpy(&codec2, &codec1, sizeof(CodecInst));
115   // Compare two codecs now.
116   EXPECT_TRUE(codec1 == codec2);
117   EXPECT_FALSE(codec1 != codec2);
118 
119   // Changing pltype.
120   codec2.pltype = 102;
121   EXPECT_FALSE(codec1 == codec2);
122   EXPECT_TRUE(codec1 != codec2);
123 
124   // Reset to codec2 to codec1 state.
125   memcpy(&codec2, &codec1, sizeof(CodecInst));
126   // payload name should be case insensitive.
127   strncpy(codec2.plname, "ISAC", 4);
128   EXPECT_TRUE(codec1 == codec2);
129 
130   // Test modifying the |plfreq|
131   codec2.plfreq = 16000;
132   EXPECT_FALSE(codec1 == codec2);
133 
134   // Reset to codec2 to codec1 state.
135   memcpy(&codec2, &codec1, sizeof(CodecInst));
136   // Test modifying the |pacsize|.
137   codec2.pacsize = 440;
138   EXPECT_FALSE(codec1 == codec2);
139 
140   // Reset to codec2 to codec1 state.
141   memcpy(&codec2, &codec1, sizeof(CodecInst));
142   // Test modifying the |channels|.
143   codec2.channels = 2;
144   EXPECT_FALSE(codec1 == codec2);
145 
146   // Reset to codec2 to codec1 state.
147   memcpy(&codec2, &codec1, sizeof(CodecInst));
148   // Test modifying the |rate|.
149   codec2.rate = 0;
150   EXPECT_FALSE(codec1 == codec2);
151 }
152 
153 }  // namespace
154 }  // namespace voe
155 }  // namespace webrtc
156