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