OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 #include <memory> | |
10 #include <string> | 11 #include <string> |
11 | 12 |
12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
13 #include "webrtc/test/testsupport/fileutils.h" | 14 #include "webrtc/test/testsupport/fileutils.h" |
14 #include "webrtc_cng.h" | 15 #include "webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h" |
15 | 16 |
16 namespace webrtc { | 17 namespace webrtc { |
17 | 18 |
18 enum { | 19 enum { |
19 kSidShortIntervalUpdate = 1, | 20 kSidShortIntervalUpdate = 1, |
20 kSidNormalIntervalUpdate = 100, | 21 kSidNormalIntervalUpdate = 100, |
21 kSidLongIntervalUpdate = 10000 | 22 kSidLongIntervalUpdate = 10000 |
22 }; | 23 }; |
23 | 24 |
24 enum { | 25 enum { |
25 kCNGNumParamsLow = 0, | 26 kCNGNumParamsLow = 0, |
26 kCNGNumParamsNormal = 8, | 27 kCNGNumParamsNormal = 8, |
27 kCNGNumParamsHigh = WEBRTC_CNG_MAX_LPC_ORDER, | 28 kCNGNumParamsHigh = WEBRTC_CNG_MAX_LPC_ORDER, |
28 kCNGNumParamsTooHigh = WEBRTC_CNG_MAX_LPC_ORDER + 1 | 29 kCNGNumParamsTooHigh = WEBRTC_CNG_MAX_LPC_ORDER + 1 |
29 }; | 30 }; |
30 | 31 |
31 enum { | 32 enum { |
32 kNoSid, | 33 kNoSid, |
33 kForceSid | 34 kForceSid |
34 }; | 35 }; |
35 | 36 |
36 class CngTest : public ::testing::Test { | 37 class CngTest : public ::testing::Test { |
37 protected: | 38 protected: |
38 CngTest(); | |
39 virtual void SetUp(); | 39 virtual void SetUp(); |
40 | 40 |
41 CNG_enc_inst* cng_enc_inst_; | 41 std::unique_ptr<ComfortNoiseEncoder> cng_encoder_; |
hlundin-webrtc
2016/04/13 07:05:23
Does it make sense to keep the encoder and decoder
ossu
2016/04/13 11:57:06
Yeah, it's probably neater to put them into the te
kwiberg-webrtc
2016/04/14 09:42:47
Good. Test fixtures are a good idea much more seld
| |
42 CNG_dec_inst* cng_dec_inst_; | 42 std::unique_ptr<ComfortNoiseDecoder> cng_decoder_; |
43 int16_t speech_data_[640]; // Max size of CNG internal buffers. | 43 int16_t speech_data_[640]; // Max size of CNG internal buffers. |
44 }; | 44 }; |
45 | 45 |
46 CngTest::CngTest() | |
47 : cng_enc_inst_(NULL), | |
48 cng_dec_inst_(NULL) { | |
49 } | |
50 | |
51 void CngTest::SetUp() { | 46 void CngTest::SetUp() { |
52 FILE* input_file; | 47 FILE* input_file; |
53 const std::string file_name = | 48 const std::string file_name = |
54 webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"); | 49 webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"); |
55 input_file = fopen(file_name.c_str(), "rb"); | 50 input_file = fopen(file_name.c_str(), "rb"); |
56 ASSERT_TRUE(input_file != NULL); | 51 ASSERT_TRUE(input_file != NULL); |
57 ASSERT_EQ(640, static_cast<int32_t>(fread(speech_data_, sizeof(int16_t), | 52 ASSERT_EQ(640, static_cast<int32_t>(fread(speech_data_, sizeof(int16_t), |
58 640, input_file))); | 53 640, input_file))); |
59 fclose(input_file); | 54 fclose(input_file); |
60 input_file = NULL; | 55 input_file = NULL; |
61 } | 56 } |
62 | 57 |
63 // Test failing Create. | |
64 TEST_F(CngTest, CngCreateFail) { | |
65 // Test to see that an invalid pointer is caught. | |
66 EXPECT_EQ(-1, WebRtcCng_CreateEnc(NULL)); | |
67 EXPECT_EQ(-1, WebRtcCng_CreateDec(NULL)); | |
68 } | |
69 | |
70 // Test normal Create. | |
71 TEST_F(CngTest, CngCreate) { | |
72 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); | |
73 EXPECT_EQ(0, WebRtcCng_CreateDec(&cng_dec_inst_)); | |
74 EXPECT_TRUE(cng_enc_inst_ != NULL); | |
75 EXPECT_TRUE(cng_dec_inst_ != NULL); | |
76 // Free encoder and decoder memory. | |
77 EXPECT_EQ(0, WebRtcCng_FreeEnc(cng_enc_inst_)); | |
78 EXPECT_EQ(0, WebRtcCng_FreeDec(cng_dec_inst_)); | |
79 } | |
80 | |
81 // Create CNG encoder, init with faulty values, free CNG encoder. | |
82 TEST_F(CngTest, CngInitFail) { | |
83 // Create encoder memory. | |
84 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); | |
85 | |
86 // Call with too few parameters. | |
87 EXPECT_EQ(-1, WebRtcCng_InitEnc(cng_enc_inst_, 8000, kSidNormalIntervalUpdate, | |
88 kCNGNumParamsLow)); | |
89 EXPECT_EQ(6130, WebRtcCng_GetErrorCodeEnc(cng_enc_inst_)); | |
90 | |
91 // Call with too many parameters. | |
92 EXPECT_EQ(-1, WebRtcCng_InitEnc(cng_enc_inst_, 8000, kSidNormalIntervalUpdate, | |
93 kCNGNumParamsTooHigh)); | |
94 EXPECT_EQ(6130, WebRtcCng_GetErrorCodeEnc(cng_enc_inst_)); | |
95 | |
96 // Free encoder memory. | |
97 EXPECT_EQ(0, WebRtcCng_FreeEnc(cng_enc_inst_)); | |
98 } | |
99 | |
100 TEST_F(CngTest, CngEncode) { | 58 TEST_F(CngTest, CngEncode) { |
101 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; | 59 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; |
102 size_t number_bytes; | |
103 | |
104 // Create encoder memory. | |
105 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); | |
106 | 60 |
107 // 8 kHz, Normal number of parameters | 61 // 8 kHz, Normal number of parameters |
108 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 8000, kSidNormalIntervalUpdate, | 62 cng_encoder_.reset(new ComfortNoiseEncoder(8000, kSidNormalIntervalUpdate, |
109 kCNGNumParamsNormal)); | 63 kCNGNumParamsNormal)); |
110 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 80, sid_data, | 64 EXPECT_EQ(0, cng_encoder_->Encode( |
111 &number_bytes, kNoSid)); | 65 rtc::ArrayView<const int16_t>(speech_data_, 80), sid_data, kNoSid)); |
112 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( | 66 EXPECT_EQ(kCNGNumParamsNormal + 1, cng_encoder_->Encode( |
113 cng_enc_inst_, speech_data_, 80, sid_data, &number_bytes, kForceSid)); | 67 rtc::ArrayView<const int16_t>(speech_data_, 80), sid_data, kForceSid)); |
114 | 68 |
115 // 16 kHz, Normal number of parameters | 69 // 16 kHz, Normal number of parameters |
116 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 16000, kSidNormalIntervalUpdate, | 70 cng_encoder_.reset(new ComfortNoiseEncoder(16000, kSidNormalIntervalUpdate, |
117 kCNGNumParamsNormal)); | 71 kCNGNumParamsNormal)); |
118 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 160, sid_data, | 72 EXPECT_EQ(0, cng_encoder_->Encode( |
119 &number_bytes, kNoSid)); | 73 rtc::ArrayView<const int16_t>(speech_data_, 160), sid_data, kNoSid)); |
120 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( | 74 EXPECT_EQ(kCNGNumParamsNormal + 1, cng_encoder_->Encode( |
121 cng_enc_inst_, speech_data_, 160, sid_data, &number_bytes, kForceSid)); | 75 rtc::ArrayView<const int16_t>(speech_data_, 160), sid_data, kForceSid)); |
122 | 76 |
123 // 32 kHz, Max number of parameters | 77 // 32 kHz, Max number of parameters |
124 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 32000, kSidNormalIntervalUpdate, | 78 cng_encoder_.reset(new ComfortNoiseEncoder(32000, kSidNormalIntervalUpdate, |
125 kCNGNumParamsHigh)); | 79 kCNGNumParamsHigh)); |
126 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 320, sid_data, | 80 EXPECT_EQ(0, cng_encoder_->Encode( |
127 &number_bytes, kNoSid)); | 81 rtc::ArrayView<const int16_t>(speech_data_, 320), sid_data, kNoSid)); |
128 EXPECT_EQ(kCNGNumParamsHigh + 1, WebRtcCng_Encode( | 82 EXPECT_EQ(kCNGNumParamsHigh + 1, cng_encoder_->Encode( |
129 cng_enc_inst_, speech_data_, 320, sid_data, &number_bytes, kForceSid)); | 83 rtc::ArrayView<const int16_t>(speech_data_, 320), sid_data, kForceSid)); |
130 | 84 |
131 // 48 kHz, Normal number of parameters | 85 // 48 kHz, Normal number of parameters |
132 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 48000, kSidNormalIntervalUpdate, | 86 cng_encoder_.reset(new ComfortNoiseEncoder(48000, kSidNormalIntervalUpdate, |
133 kCNGNumParamsNormal)); | 87 kCNGNumParamsNormal)); |
134 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 480, sid_data, | 88 EXPECT_EQ(0, cng_encoder_->Encode( |
135 &number_bytes, kNoSid)); | 89 rtc::ArrayView<const int16_t>(speech_data_, 480), sid_data, kNoSid)); |
136 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( | 90 EXPECT_EQ(kCNGNumParamsNormal + 1, cng_encoder_->Encode( |
137 cng_enc_inst_, speech_data_, 480, sid_data, &number_bytes, kForceSid)); | 91 rtc::ArrayView<const int16_t>(speech_data_, 480), sid_data, kForceSid)); |
138 | 92 |
139 // 64 kHz, Normal number of parameters | 93 // 64 kHz, Normal number of parameters |
140 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 64000, kSidNormalIntervalUpdate, | 94 cng_encoder_.reset(new ComfortNoiseEncoder(64000, kSidNormalIntervalUpdate, |
141 kCNGNumParamsNormal)); | 95 kCNGNumParamsNormal)); |
142 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 640, sid_data, | 96 EXPECT_EQ(0, cng_encoder_->Encode( |
143 &number_bytes, kNoSid)); | 97 rtc::ArrayView<const int16_t>(speech_data_, 640), sid_data, kNoSid)); |
144 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( | 98 EXPECT_EQ(kCNGNumParamsNormal + 1, cng_encoder_->Encode( |
145 cng_enc_inst_, speech_data_, 640, sid_data, &number_bytes, kForceSid)); | 99 rtc::ArrayView<const int16_t>(speech_data_, 640), sid_data, kForceSid)); |
146 | |
147 // Free encoder memory. | |
148 EXPECT_EQ(0, WebRtcCng_FreeEnc(cng_enc_inst_)); | |
149 } | 100 } |
150 | 101 |
151 // Encode Cng with too long input vector. | 102 // Encode Cng with too long input vector. |
152 TEST_F(CngTest, CngEncodeTooLong) { | 103 TEST_F(CngTest, CngEncodeTooLong) { |
153 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; | 104 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; |
154 size_t number_bytes; | |
155 | 105 |
156 // Create and init encoder memory. | 106 // Create encoder. |
157 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); | 107 cng_encoder_.reset(new ComfortNoiseEncoder(8000, kSidNormalIntervalUpdate, |
158 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 8000, kSidNormalIntervalUpdate, | 108 kCNGNumParamsNormal)); |
159 kCNGNumParamsNormal)); | |
160 | 109 |
161 // Run encoder with too much data. | 110 // Run encoder with too much data. |
162 EXPECT_EQ(-1, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 641, sid_data, | 111 EXPECT_EQ(-1, cng_encoder_->Encode( |
163 &number_bytes, kNoSid)); | 112 rtc::ArrayView<const int16_t>(speech_data_, 641), |
164 EXPECT_EQ(6140, WebRtcCng_GetErrorCodeEnc(cng_enc_inst_)); | 113 sid_data, kNoSid)); |
165 | |
166 // Free encoder memory. | |
167 EXPECT_EQ(0, WebRtcCng_FreeEnc(cng_enc_inst_)); | |
168 } | |
169 | |
170 // Call encode without calling init. | |
171 TEST_F(CngTest, CngEncodeNoInit) { | |
172 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; | |
173 size_t number_bytes; | |
174 | |
175 // Create encoder memory. | |
176 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); | |
177 | |
178 // Run encoder without calling init. | |
179 EXPECT_EQ(-1, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 640, sid_data, | |
180 &number_bytes, kNoSid)); | |
181 EXPECT_EQ(6120, WebRtcCng_GetErrorCodeEnc(cng_enc_inst_)); | |
182 | |
183 // Free encoder memory. | |
184 EXPECT_EQ(0, WebRtcCng_FreeEnc(cng_enc_inst_)); | |
185 } | 114 } |
186 | 115 |
187 // Update SID parameters, for both 9 and 16 parameters. | 116 // Update SID parameters, for both 9 and 16 parameters. |
188 TEST_F(CngTest, CngUpdateSid) { | 117 TEST_F(CngTest, CngUpdateSid) { |
189 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; | 118 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; |
190 size_t number_bytes; | |
191 | 119 |
192 // Create and initialize encoder and decoder memory. | 120 // Create and initialize encoder and decoder. |
193 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); | 121 cng_encoder_.reset(new ComfortNoiseEncoder(16000, kSidNormalIntervalUpdate, |
194 EXPECT_EQ(0, WebRtcCng_CreateDec(&cng_dec_inst_)); | 122 kCNGNumParamsNormal)); |
195 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 16000, kSidNormalIntervalUpdate, | 123 cng_decoder_.reset(new ComfortNoiseDecoder); |
196 kCNGNumParamsNormal)); | 124 cng_decoder_->Reset(); |
197 WebRtcCng_InitDec(cng_dec_inst_); | |
198 | 125 |
199 // Run normal Encode and UpdateSid. | 126 // Run normal Encode and UpdateSid. |
200 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( | 127 EXPECT_EQ(kCNGNumParamsNormal + 1, cng_encoder_->Encode( |
201 cng_enc_inst_, speech_data_, 160, sid_data, &number_bytes, kForceSid)); | 128 rtc::ArrayView<const int16_t>(speech_data_, 160), sid_data, kForceSid)); |
202 EXPECT_EQ(0, WebRtcCng_UpdateSid(cng_dec_inst_, sid_data, | 129 cng_decoder_->UpdateSid( |
203 kCNGNumParamsNormal + 1)); | 130 rtc::ArrayView<const uint8_t>(sid_data, kCNGNumParamsNormal + 1)); |
204 | 131 |
205 // Reinit with new length. | 132 // Reinit with new length. |
206 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 16000, kSidNormalIntervalUpdate, | 133 cng_encoder_->Reset(16000, kSidNormalIntervalUpdate, kCNGNumParamsHigh); |
207 kCNGNumParamsHigh)); | 134 cng_decoder_->Reset(); |
208 WebRtcCng_InitDec(cng_dec_inst_); | |
209 | 135 |
210 // Expect 0 because of unstable parameters after switching length. | 136 // Expect 0 because of unstable parameters after switching length. |
211 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 160, sid_data, | 137 EXPECT_EQ(0, cng_encoder_->Encode( |
212 &number_bytes, kForceSid)); | 138 rtc::ArrayView<const int16_t>(speech_data_, 160), |
213 EXPECT_EQ(kCNGNumParamsHigh + 1, WebRtcCng_Encode( | 139 sid_data, kForceSid)); |
214 cng_enc_inst_, speech_data_ + 160, 160, sid_data, &number_bytes, | 140 EXPECT_EQ(kCNGNumParamsHigh + 1, cng_encoder_->Encode( |
141 rtc::ArrayView<const int16_t>(speech_data_ + 160, 160), sid_data, | |
215 kForceSid)); | 142 kForceSid)); |
216 EXPECT_EQ(0, WebRtcCng_UpdateSid(cng_dec_inst_, sid_data, | 143 cng_decoder_->UpdateSid( |
217 kCNGNumParamsNormal + 1)); | 144 rtc::ArrayView<const uint8_t>(sid_data, kCNGNumParamsNormal + 1)); |
218 | |
219 // Free encoder and decoder memory. | |
220 EXPECT_EQ(0, WebRtcCng_FreeEnc(cng_enc_inst_)); | |
221 EXPECT_EQ(0, WebRtcCng_FreeDec(cng_dec_inst_)); | |
222 } | |
223 | |
224 // Update SID parameters, with wrong parameters or without calling decode. | |
225 TEST_F(CngTest, CngUpdateSidErroneous) { | |
226 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; | |
227 size_t number_bytes; | |
228 | |
229 // Create encoder and decoder memory. | |
230 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); | |
231 EXPECT_EQ(0, WebRtcCng_CreateDec(&cng_dec_inst_)); | |
232 | |
233 // Encode. | |
234 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 16000, kSidNormalIntervalUpdate, | |
235 kCNGNumParamsNormal)); | |
236 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( | |
237 cng_enc_inst_, speech_data_, 160, sid_data, &number_bytes, kForceSid)); | |
238 | |
239 // Update Sid before initializing decoder. | |
240 EXPECT_EQ(-1, WebRtcCng_UpdateSid(cng_dec_inst_, sid_data, | |
241 kCNGNumParamsNormal + 1)); | |
242 EXPECT_EQ(6220, WebRtcCng_GetErrorCodeDec(cng_dec_inst_)); | |
243 | |
244 // Initialize decoder. | |
245 WebRtcCng_InitDec(cng_dec_inst_); | |
246 | |
247 // First run with valid parameters, then with too many CNG parameters. | |
248 // The function will operate correctly by only reading the maximum number of | |
249 // parameters, skipping the extra. | |
250 EXPECT_EQ(0, WebRtcCng_UpdateSid(cng_dec_inst_, sid_data, | |
251 kCNGNumParamsNormal + 1)); | |
252 EXPECT_EQ(0, WebRtcCng_UpdateSid(cng_dec_inst_, sid_data, | |
253 kCNGNumParamsTooHigh + 1)); | |
254 | |
255 // Free encoder and decoder memory. | |
256 EXPECT_EQ(0, WebRtcCng_FreeEnc(cng_enc_inst_)); | |
257 EXPECT_EQ(0, WebRtcCng_FreeDec(cng_dec_inst_)); | |
258 } | 145 } |
259 | 146 |
260 // Test to generate cng data, by forcing SID. Both normal and faulty condition. | 147 // Test to generate cng data, by forcing SID. Both normal and faulty condition. |
261 TEST_F(CngTest, CngGenerate) { | 148 TEST_F(CngTest, CngGenerate) { |
262 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; | 149 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; |
263 int16_t out_data[640]; | 150 int16_t out_data[640]; |
264 size_t number_bytes; | |
265 | 151 |
266 // Create and initialize encoder and decoder memory. | 152 // Create and initialize encoder and decoder. |
267 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); | 153 cng_encoder_.reset(new ComfortNoiseEncoder(16000, kSidNormalIntervalUpdate, |
268 EXPECT_EQ(0, WebRtcCng_CreateDec(&cng_dec_inst_)); | 154 kCNGNumParamsNormal)); |
269 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 16000, kSidNormalIntervalUpdate, | 155 cng_decoder_.reset(new ComfortNoiseDecoder); |
270 kCNGNumParamsNormal)); | |
271 WebRtcCng_InitDec(cng_dec_inst_); | |
272 | 156 |
273 // Normal Encode. | 157 // Normal Encode. |
274 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( | 158 EXPECT_EQ(kCNGNumParamsNormal + 1, cng_encoder_->Encode( |
275 cng_enc_inst_, speech_data_, 160, sid_data, &number_bytes, kForceSid)); | 159 rtc::ArrayView<const int16_t>(speech_data_, 160), sid_data, kForceSid)); |
276 | 160 |
277 // Normal UpdateSid. | 161 // Normal UpdateSid. |
278 EXPECT_EQ(0, WebRtcCng_UpdateSid(cng_dec_inst_, sid_data, | 162 cng_decoder_->UpdateSid( |
279 kCNGNumParamsNormal + 1)); | 163 rtc::ArrayView<const uint8_t>(sid_data, kCNGNumParamsNormal + 1)); |
280 | 164 |
281 // Two normal Generate, one with new_period. | 165 // Two normal Generate, one with new_period. |
282 EXPECT_EQ(0, WebRtcCng_Generate(cng_dec_inst_, out_data, 640, 1)); | 166 EXPECT_TRUE(cng_decoder_->Generate( |
283 EXPECT_EQ(0, WebRtcCng_Generate(cng_dec_inst_, out_data, 640, 0)); | 167 rtc::ArrayView<int16_t>(out_data, 640), 1)); |
168 EXPECT_TRUE(cng_decoder_->Generate( | |
169 rtc::ArrayView<int16_t>(out_data, 640), 0)); | |
284 | 170 |
285 // Call Genereate with too much data. | 171 // Call Genereate with too much data. |
286 EXPECT_EQ(-1, WebRtcCng_Generate(cng_dec_inst_, out_data, 641, 0)); | 172 EXPECT_FALSE(cng_decoder_->Generate( |
287 EXPECT_EQ(6140, WebRtcCng_GetErrorCodeDec(cng_dec_inst_)); | 173 rtc::ArrayView<int16_t>(out_data, 641), 0)); |
288 | |
289 // Free encoder and decoder memory. | |
290 EXPECT_EQ(0, WebRtcCng_FreeEnc(cng_enc_inst_)); | |
291 EXPECT_EQ(0, WebRtcCng_FreeDec(cng_dec_inst_)); | |
292 } | 174 } |
293 | 175 |
294 // Test automatic SID. | 176 // Test automatic SID. |
295 TEST_F(CngTest, CngAutoSid) { | 177 TEST_F(CngTest, CngAutoSid) { |
296 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; | 178 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; |
297 size_t number_bytes; | |
298 | 179 |
299 // Create and initialize encoder and decoder memory. | 180 // Create and initialize encoder and decoder. |
300 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); | 181 cng_encoder_.reset(new ComfortNoiseEncoder(16000, kSidNormalIntervalUpdate, |
301 EXPECT_EQ(0, WebRtcCng_CreateDec(&cng_dec_inst_)); | 182 kCNGNumParamsNormal)); |
302 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 16000, kSidNormalIntervalUpdate, | 183 cng_decoder_.reset(new ComfortNoiseDecoder); |
303 kCNGNumParamsNormal)); | |
304 WebRtcCng_InitDec(cng_dec_inst_); | |
305 | 184 |
306 // Normal Encode, 100 msec, where no SID data should be generated. | 185 // Normal Encode, 100 msec, where no SID data should be generated. |
307 for (int i = 0; i < 10; i++) { | 186 for (int i = 0; i < 10; i++) { |
308 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 160, sid_data, | 187 EXPECT_EQ(0, cng_encoder_->Encode( |
309 &number_bytes, kNoSid)); | 188 rtc::ArrayView<const int16_t>(speech_data_, 160), sid_data, kNoSid)); |
310 } | 189 } |
311 | 190 |
312 // We have reached 100 msec, and SID data should be generated. | 191 // We have reached 100 msec, and SID data should be generated. |
313 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( | 192 EXPECT_EQ(kCNGNumParamsNormal + 1, cng_encoder_->Encode( |
314 cng_enc_inst_, speech_data_, 160, sid_data, &number_bytes, kNoSid)); | 193 rtc::ArrayView<const int16_t>(speech_data_, 160), sid_data, kNoSid)); |
315 | |
316 // Free encoder and decoder memory. | |
317 EXPECT_EQ(0, WebRtcCng_FreeEnc(cng_enc_inst_)); | |
318 EXPECT_EQ(0, WebRtcCng_FreeDec(cng_dec_inst_)); | |
319 } | 194 } |
320 | 195 |
321 // Test automatic SID, with very short interval. | 196 // Test automatic SID, with very short interval. |
322 TEST_F(CngTest, CngAutoSidShort) { | 197 TEST_F(CngTest, CngAutoSidShort) { |
323 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; | 198 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; |
324 size_t number_bytes; | |
325 | 199 |
326 // Create and initialize encoder and decoder memory. | 200 // Create and initialize encoder and decoder. |
327 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); | 201 cng_encoder_.reset(new ComfortNoiseEncoder(16000, kSidShortIntervalUpdate, |
328 EXPECT_EQ(0, WebRtcCng_CreateDec(&cng_dec_inst_)); | 202 kCNGNumParamsNormal)); |
329 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 16000, kSidShortIntervalUpdate, | 203 cng_decoder_.reset(new ComfortNoiseDecoder); |
330 kCNGNumParamsNormal)); | |
331 WebRtcCng_InitDec(cng_dec_inst_); | |
332 | 204 |
333 // First call will never generate SID, unless forced to. | 205 // First call will never generate SID, unless forced to. |
334 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 160, sid_data, | 206 EXPECT_EQ(0, cng_encoder_->Encode( |
335 &number_bytes, kNoSid)); | 207 rtc::ArrayView<const int16_t>(speech_data_, 160), sid_data, kNoSid)); |
336 | 208 |
337 // Normal Encode, 100 msec, SID data should be generated all the time. | 209 // Normal Encode, 100 msec, SID data should be generated all the time. |
338 for (int i = 0; i < 10; i++) { | 210 for (int i = 0; i < 10; i++) { |
339 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( | 211 EXPECT_EQ(kCNGNumParamsNormal + 1, cng_encoder_->Encode( |
340 cng_enc_inst_, speech_data_, 160, sid_data, &number_bytes, kNoSid)); | 212 rtc::ArrayView<const int16_t>(speech_data_, 160), sid_data, kNoSid)); |
341 } | 213 } |
342 | |
343 // Free encoder and decoder memory. | |
344 EXPECT_EQ(0, WebRtcCng_FreeEnc(cng_enc_inst_)); | |
345 EXPECT_EQ(0, WebRtcCng_FreeDec(cng_dec_inst_)); | |
346 } | 214 } |
347 | 215 |
348 } // namespace webrtc | 216 } // namespace webrtc |
OLD | NEW |