blob: 2e8fe6192aa6df2d7245d06c00088a5b45c68e7c [file] [log] [blame]
turaj@webrtc.org42259e72012-12-11 02:15:12 +00001/*
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 "gtest/gtest.h"
andrew@webrtc.orgf0a90c32013-03-05 01:12:49 +000014#include "webrtc/modules/audio_device/include/fake_audio_device.h"
turaj@webrtc.org42259e72012-12-11 02:15:12 +000015#include "webrtc/system_wrappers/interface/scoped_ptr.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
20namespace webrtc {
21namespace voe {
22namespace {
23
turaj@webrtc.org42259e72012-12-11 02:15:12 +000024class VoECodecTest : public ::testing::Test {
25 protected:
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 }
34
35 ~VoECodecTest() {}
36
37 void TearDown() {
38 base_->DeleteChannel(channel_);
39 base_->Terminate();
40 base_->Release();
41 voe_codec_->Release();
42 VoiceEngine::Delete(voe_);
43 }
44
45 void SetUp() {
46 // Check if all components are valid.
47 ASSERT_TRUE(voe_ != NULL);
48 ASSERT_TRUE(base_ != NULL);
49 ASSERT_TRUE(voe_codec_ != NULL);
50 ASSERT_TRUE(adm_.get() != NULL);
51 ASSERT_EQ(0, base_->Init(adm_.get()));
52 channel_ = base_->CreateChannel();
53 ASSERT_NE(-1, channel_);
54
55 CodecInst my_codec;
56
57 bool primary_found = false;
58 bool valid_secondary_found = false;
59 bool invalid_secondary_found = false;
60
61 // Find primary and secondary codecs.
62 int num_codecs = voe_codec_->NumOfCodecs();
63 int n = 0;
64 while (n < num_codecs && (!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 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
103
104TEST_F(VoECodecTest, DualStreamSetSecondaryBeforePrimaryFails) {
105 // Setting secondary before a primary is registered should fail.
106 EXPECT_EQ(-1, voe_codec_->SetSecondarySendCodec(channel_, valid_secondary_,
107 red_payload_type_));
108 red_payload_type_ = 1;
109}
110
111TEST_F(VoECodecTest, DualStreamRegisterWithWrongInputsFails) {
112 // Register primary codec.
113 EXPECT_EQ(0, voe_codec_->SetSendCodec(channel_, primary_));
114
115 // Wrong secondary.
116 EXPECT_EQ(-1, voe_codec_->SetSecondarySendCodec(channel_, invalid_secondary_,
117 red_payload_type_));
118
henrike@webrtc.org09738612013-01-22 16:43:45 +0000119 // Wrong payload.
turaj@webrtc.org42259e72012-12-11 02:15:12 +0000120 EXPECT_EQ(-1, voe_codec_->SetSecondarySendCodec(channel_, valid_secondary_,
121 -1));
122 // Wrong channel.
123 EXPECT_EQ(-1, voe_codec_->SetSecondarySendCodec(channel_ + 1,
124 valid_secondary_,
125 red_payload_type_));
126}
127
128TEST_F(VoECodecTest, DualStreamGetSecodaryEncoder) {
129 // Register primary codec.
130 EXPECT_EQ(0, voe_codec_->SetSendCodec(channel_, primary_));
131
132 // Register a valid codec.
133 EXPECT_EQ(0, voe_codec_->SetSecondarySendCodec(channel_, valid_secondary_,
134 red_payload_type_));
135 CodecInst my_codec;
136
137 // Get secondary codec from wrong channel.
138 EXPECT_EQ(-1, voe_codec_->GetSecondarySendCodec(channel_ + 1, my_codec));
139
140 // Get secondary and compare.
141 memset(&my_codec, 0, sizeof(my_codec));
142 EXPECT_EQ(0, voe_codec_->GetSecondarySendCodec(channel_, my_codec));
143
144 EXPECT_EQ(valid_secondary_.plfreq, my_codec.plfreq);
145 EXPECT_EQ(valid_secondary_.channels, my_codec.channels);
146 EXPECT_EQ(valid_secondary_.pacsize, my_codec.pacsize);
147 EXPECT_EQ(valid_secondary_.rate, my_codec.rate);
148 EXPECT_EQ(valid_secondary_.pltype, my_codec.pltype);
149 EXPECT_EQ(0, STR_CASE_CMP(valid_secondary_.plname, my_codec.plname));
150}
151
152TEST_F(VoECodecTest, DualStreamRemoveSecondaryCodec) {
153 // Register primary codec.
154 EXPECT_EQ(0, voe_codec_->SetSendCodec(channel_, primary_));
155
156 // Register a valid codec.
157 EXPECT_EQ(0, voe_codec_->SetSecondarySendCodec(channel_, valid_secondary_,
158 red_payload_type_));
159 // Remove from wrong channel.
160 EXPECT_EQ(-1, voe_codec_->RemoveSecondarySendCodec(channel_ + 1));
161 EXPECT_EQ(0, voe_codec_->RemoveSecondarySendCodec(channel_));
162
163 CodecInst my_codec;
164
165 // Get should fail, if secondary is removed.
166 EXPECT_EQ(-1, voe_codec_->GetSecondarySendCodec(channel_, my_codec));
167}
168
169} // namespace
170} // namespace voe
171} // namespace webrtc