Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Side by Side Diff: webrtc/modules/audio_coding/codecs/cng/cng_unittest.cc

Issue 1868143002: Convert CNG into C++ and remove it from AudioDecoder (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Addressed issues from comments. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 const size_t kCNGNumParamsLow = 0;
25 kCNGNumParamsLow = 0, 26 const size_t kCNGNumParamsNormal = 8;
26 kCNGNumParamsNormal = 8, 27 const size_t kCNGNumParamsHigh = WEBRTC_CNG_MAX_LPC_ORDER;
27 kCNGNumParamsHigh = WEBRTC_CNG_MAX_LPC_ORDER, 28 const size_t kCNGNumParamsTooHigh = WEBRTC_CNG_MAX_LPC_ORDER + 1;
28 kCNGNumParamsTooHigh = WEBRTC_CNG_MAX_LPC_ORDER + 1
29 };
30 29
31 enum { 30 enum {
32 kNoSid, 31 kNoSid,
33 kForceSid 32 kForceSid
34 }; 33 };
35 34
36 class CngTest : public ::testing::Test { 35 class CngTest : public ::testing::Test {
37 protected: 36 protected:
38 CngTest();
39 virtual void SetUp(); 37 virtual void SetUp();
40 38
41 CNG_enc_inst* cng_enc_inst_;
42 CNG_dec_inst* cng_dec_inst_;
43 int16_t speech_data_[640]; // Max size of CNG internal buffers. 39 int16_t speech_data_[640]; // Max size of CNG internal buffers.
44 }; 40 };
45 41
46 CngTest::CngTest()
47 : cng_enc_inst_(NULL),
48 cng_dec_inst_(NULL) {
49 }
50
51 void CngTest::SetUp() { 42 void CngTest::SetUp() {
52 FILE* input_file; 43 FILE* input_file;
53 const std::string file_name = 44 const std::string file_name =
54 webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"); 45 webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
55 input_file = fopen(file_name.c_str(), "rb"); 46 input_file = fopen(file_name.c_str(), "rb");
56 ASSERT_TRUE(input_file != NULL); 47 ASSERT_TRUE(input_file != NULL);
57 ASSERT_EQ(640, static_cast<int32_t>(fread(speech_data_, sizeof(int16_t), 48 ASSERT_EQ(640, static_cast<int32_t>(fread(speech_data_, sizeof(int16_t),
58 640, input_file))); 49 640, input_file)));
59 fclose(input_file); 50 fclose(input_file);
60 input_file = NULL; 51 input_file = NULL;
61 } 52 }
62 53
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. 54 // Create CNG encoder, init with faulty values, free CNG encoder.
82 TEST_F(CngTest, CngInitFail) { 55 TEST_F(CngTest, CngInitFail) {
hlundin-webrtc 2016/04/14 15:20:51 You should encapsulate death tests in #if GTEST_HA
ossu 2016/04/15 11:56:10 Acknowledged.
83 // Create encoder memory.
84 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_));
85
86 // Call with too few parameters. 56 // Call with too few parameters.
87 EXPECT_EQ(-1, WebRtcCng_InitEnc(cng_enc_inst_, 8000, kSidNormalIntervalUpdate, 57 EXPECT_DEATH({ ComfortNoiseEncoder(8000, kSidNormalIntervalUpdate,
88 kCNGNumParamsLow)); 58 kCNGNumParamsLow); }, "");
89 EXPECT_EQ(6130, WebRtcCng_GetErrorCodeEnc(cng_enc_inst_));
90
91 // Call with too many parameters. 59 // Call with too many parameters.
92 EXPECT_EQ(-1, WebRtcCng_InitEnc(cng_enc_inst_, 8000, kSidNormalIntervalUpdate, 60 EXPECT_DEATH({ ComfortNoiseEncoder(8000, kSidNormalIntervalUpdate,
93 kCNGNumParamsTooHigh)); 61 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 } 62 }
99 63
100 TEST_F(CngTest, CngEncode) { 64 TEST_F(CngTest, CngEncode) {
hlundin-webrtc 2016/04/14 15:20:51 Now you can consolidate these 5 test cases. Make a
ossu 2016/04/15 11:56:09 Acknowledged.
101 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; 65 rtc::Buffer sid_data;
102 size_t number_bytes;
103
104 // Create encoder memory.
105 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_));
106 66
107 // 8 kHz, Normal number of parameters 67 // 8 kHz, Normal number of parameters
108 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 8000, kSidNormalIntervalUpdate, 68 ComfortNoiseEncoder cng_encoder(8000, kSidNormalIntervalUpdate,
109 kCNGNumParamsNormal)); 69 kCNGNumParamsNormal);
110 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 80, sid_data, 70 EXPECT_EQ(0U,
111 &number_bytes, kNoSid)); 71 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 80),
112 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( 72 kNoSid, &sid_data));
113 cng_enc_inst_, speech_data_, 80, sid_data, &number_bytes, kForceSid)); 73 EXPECT_EQ(kCNGNumParamsNormal + 1,
74 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 80),
75 kForceSid, &sid_data));
114 76
115 // 16 kHz, Normal number of parameters 77 // 16 kHz, Normal number of parameters
116 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 16000, kSidNormalIntervalUpdate, 78 cng_encoder.Reset(16000, kSidNormalIntervalUpdate, kCNGNumParamsNormal);
117 kCNGNumParamsNormal)); 79 EXPECT_EQ(0U,
118 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 160, sid_data, 80 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 160),
119 &number_bytes, kNoSid)); 81 kNoSid, &sid_data));
120 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( 82 EXPECT_EQ(kCNGNumParamsNormal + 1,
121 cng_enc_inst_, speech_data_, 160, sid_data, &number_bytes, kForceSid)); 83 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 160),
84 kForceSid, &sid_data));
122 85
123 // 32 kHz, Max number of parameters 86 // 32 kHz, Max number of parameters
124 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 32000, kSidNormalIntervalUpdate, 87 cng_encoder.Reset(32000, kSidNormalIntervalUpdate, kCNGNumParamsHigh);
125 kCNGNumParamsHigh)); 88 EXPECT_EQ(0U,
126 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 320, sid_data, 89 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 320),
127 &number_bytes, kNoSid)); 90 kNoSid, &sid_data));
128 EXPECT_EQ(kCNGNumParamsHigh + 1, WebRtcCng_Encode( 91 EXPECT_EQ(kCNGNumParamsHigh + 1,
129 cng_enc_inst_, speech_data_, 320, sid_data, &number_bytes, kForceSid)); 92 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 320),
93 kForceSid, &sid_data));
130 94
131 // 48 kHz, Normal number of parameters 95 // 48 kHz, Normal number of parameters
132 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 48000, kSidNormalIntervalUpdate, 96 cng_encoder.Reset(48000, kSidNormalIntervalUpdate, kCNGNumParamsNormal);
133 kCNGNumParamsNormal)); 97 EXPECT_EQ(0U,
134 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 480, sid_data, 98 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 480),
135 &number_bytes, kNoSid)); 99 kNoSid, &sid_data));
136 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( 100 EXPECT_EQ(kCNGNumParamsNormal + 1,
137 cng_enc_inst_, speech_data_, 480, sid_data, &number_bytes, kForceSid)); 101 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 480),
102 kForceSid, &sid_data));
138 103
139 // 64 kHz, Normal number of parameters 104 // 64 kHz, Normal number of parameters
140 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 64000, kSidNormalIntervalUpdate, 105 cng_encoder.Reset(64000, kSidNormalIntervalUpdate, kCNGNumParamsNormal);
141 kCNGNumParamsNormal)); 106 EXPECT_EQ(0U,
142 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 640, sid_data, 107 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 640),
143 &number_bytes, kNoSid)); 108 kNoSid, &sid_data));
144 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( 109 EXPECT_EQ(kCNGNumParamsNormal + 1,
145 cng_enc_inst_, speech_data_, 640, sid_data, &number_bytes, kForceSid)); 110 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 640),
146 111 kForceSid, &sid_data));
147 // Free encoder memory.
148 EXPECT_EQ(0, WebRtcCng_FreeEnc(cng_enc_inst_));
149 } 112 }
150 113
151 // Encode Cng with too long input vector. 114 // Encode Cng with too long input vector.
152 TEST_F(CngTest, CngEncodeTooLong) { 115 TEST_F(CngTest, CngEncodeTooLong) {
153 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; 116 rtc::Buffer sid_data;
154 size_t number_bytes;
155 117
156 // Create and init encoder memory. 118 // Create encoder.
157 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); 119 ComfortNoiseEncoder cng_encoder(8000, kSidNormalIntervalUpdate,
158 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 8000, kSidNormalIntervalUpdate, 120 kCNGNumParamsNormal);
159 kCNGNumParamsNormal));
160
161 // Run encoder with too much data. 121 // Run encoder with too much data.
162 EXPECT_EQ(-1, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 641, sid_data, 122 EXPECT_DEATH(
163 &number_bytes, kNoSid)); 123 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 641),
164 EXPECT_EQ(6140, WebRtcCng_GetErrorCodeEnc(cng_enc_inst_)); 124 kNoSid, &sid_data),
165 125 "");
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 } 126 }
186 127
187 // Update SID parameters, for both 9 and 16 parameters. 128 // Update SID parameters, for both 9 and 16 parameters.
188 TEST_F(CngTest, CngUpdateSid) { 129 TEST_F(CngTest, CngUpdateSid) {
189 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; 130 rtc::Buffer sid_data;
190 size_t number_bytes;
191 131
192 // Create and initialize encoder and decoder memory. 132 // Create and initialize encoder and decoder.
193 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); 133 ComfortNoiseEncoder cng_encoder(16000, kSidNormalIntervalUpdate,
194 EXPECT_EQ(0, WebRtcCng_CreateDec(&cng_dec_inst_)); 134 kCNGNumParamsNormal);
195 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 16000, kSidNormalIntervalUpdate, 135 ComfortNoiseDecoder cng_decoder;
196 kCNGNumParamsNormal));
197 WebRtcCng_InitDec(cng_dec_inst_);
198 136
199 // Run normal Encode and UpdateSid. 137 // Run normal Encode and UpdateSid.
200 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( 138 EXPECT_EQ(kCNGNumParamsNormal + 1,
201 cng_enc_inst_, speech_data_, 160, sid_data, &number_bytes, kForceSid)); 139 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 160),
202 EXPECT_EQ(0, WebRtcCng_UpdateSid(cng_dec_inst_, sid_data, 140 kForceSid, &sid_data));
203 kCNGNumParamsNormal + 1)); 141 cng_decoder.UpdateSid(sid_data);
204 142
205 // Reinit with new length. 143 // Reinit with new length.
206 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 16000, kSidNormalIntervalUpdate, 144 cng_encoder.Reset(16000, kSidNormalIntervalUpdate, kCNGNumParamsHigh);
207 kCNGNumParamsHigh)); 145 cng_decoder.Reset();
208 WebRtcCng_InitDec(cng_dec_inst_);
209 146
210 // Expect 0 because of unstable parameters after switching length. 147 // Expect 0 because of unstable parameters after switching length.
211 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 160, sid_data, 148 EXPECT_EQ(0U,
212 &number_bytes, kForceSid)); 149 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 160),
213 EXPECT_EQ(kCNGNumParamsHigh + 1, WebRtcCng_Encode( 150 kForceSid, &sid_data));
214 cng_enc_inst_, speech_data_ + 160, 160, sid_data, &number_bytes, 151 EXPECT_EQ(
215 kForceSid)); 152 kCNGNumParamsHigh + 1,
216 EXPECT_EQ(0, WebRtcCng_UpdateSid(cng_dec_inst_, sid_data, 153 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_ + 160, 160),
217 kCNGNumParamsNormal + 1)); 154 kForceSid, &sid_data));
218 155 cng_decoder.UpdateSid(
219 // Free encoder and decoder memory. 156 rtc::ArrayView<const uint8_t>(sid_data.data(), kCNGNumParamsNormal + 1));
220 EXPECT_EQ(0, WebRtcCng_FreeEnc(cng_enc_inst_));
221 EXPECT_EQ(0, WebRtcCng_FreeDec(cng_dec_inst_));
222 } 157 }
223 158
224 // Update SID parameters, with wrong parameters or without calling decode. 159 // Update SID parameters, with wrong parameters or without calling decode.
225 TEST_F(CngTest, CngUpdateSidErroneous) { 160 TEST_F(CngTest, CngUpdateSidErroneous) {
hlundin-webrtc 2016/04/14 15:20:51 So you're testing Sid Erroneous – why not Sid Vici
ossu 2016/04/15 11:56:09 Yeah, I put it back. I guess it still makes sense.
226 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; 161 rtc::Buffer sid_data;
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 162
233 // Encode. 163 // Encode.
234 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 16000, kSidNormalIntervalUpdate, 164 ComfortNoiseEncoder cng_encoder(16000, kSidNormalIntervalUpdate,
235 kCNGNumParamsNormal)); 165 kCNGNumParamsNormal);
236 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( 166 ComfortNoiseDecoder cng_decoder;
237 cng_enc_inst_, speech_data_, 160, sid_data, &number_bytes, kForceSid)); 167 EXPECT_EQ(kCNGNumParamsNormal + 1,
238 168 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 160),
239 // Update Sid before initializing decoder. 169 kForceSid, &sid_data));
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 170
247 // First run with valid parameters, then with too many CNG parameters. 171 // First run with valid parameters, then with too many CNG parameters.
248 // The function will operate correctly by only reading the maximum number of 172 // The function will operate correctly by only reading the maximum number of
249 // parameters, skipping the extra. 173 // parameters, skipping the extra.
250 EXPECT_EQ(0, WebRtcCng_UpdateSid(cng_dec_inst_, sid_data, 174 cng_decoder.UpdateSid(
251 kCNGNumParamsNormal + 1)); 175 rtc::ArrayView<const uint8_t>(sid_data.data(), kCNGNumParamsNormal + 1));
252 EXPECT_EQ(0, WebRtcCng_UpdateSid(cng_dec_inst_, sid_data, 176 cng_decoder.UpdateSid(
253 kCNGNumParamsTooHigh + 1)); 177 rtc::ArrayView<const uint8_t>(sid_data.data(), 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 } 178 }
259 179
260 // Test to generate cng data, by forcing SID. Both normal and faulty condition. 180 // Test to generate cng data, by forcing SID. Both normal and faulty condition.
261 TEST_F(CngTest, CngGenerate) { 181 TEST_F(CngTest, CngGenerate) {
262 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; 182 rtc::Buffer sid_data;
263 int16_t out_data[640]; 183 int16_t out_data[640];
264 size_t number_bytes;
265 184
266 // Create and initialize encoder and decoder memory. 185 // Create and initialize encoder and decoder.
267 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); 186 ComfortNoiseEncoder cng_encoder(16000, kSidNormalIntervalUpdate,
268 EXPECT_EQ(0, WebRtcCng_CreateDec(&cng_dec_inst_)); 187 kCNGNumParamsNormal);
269 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 16000, kSidNormalIntervalUpdate, 188 ComfortNoiseDecoder cng_decoder;
270 kCNGNumParamsNormal));
271 WebRtcCng_InitDec(cng_dec_inst_);
272 189
273 // Normal Encode. 190 // Normal Encode.
274 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( 191 EXPECT_EQ(kCNGNumParamsNormal + 1,
275 cng_enc_inst_, speech_data_, 160, sid_data, &number_bytes, kForceSid)); 192 cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 160),
193 kForceSid, &sid_data));
276 194
277 // Normal UpdateSid. 195 // Normal UpdateSid.
278 EXPECT_EQ(0, WebRtcCng_UpdateSid(cng_dec_inst_, sid_data, 196 cng_decoder.UpdateSid(sid_data);
279 kCNGNumParamsNormal + 1));
280 197
281 // Two normal Generate, one with new_period. 198 // Two normal Generate, one with new_period.
282 EXPECT_EQ(0, WebRtcCng_Generate(cng_dec_inst_, out_data, 640, 1)); 199 EXPECT_TRUE(cng_decoder.Generate(rtc::ArrayView<int16_t>(out_data, 640), 1));
283 EXPECT_EQ(0, WebRtcCng_Generate(cng_dec_inst_, out_data, 640, 0)); 200 EXPECT_TRUE(cng_decoder.Generate(rtc::ArrayView<int16_t>(out_data, 640), 0));
284 201
285 // Call Genereate with too much data. 202 // Call Genereate with too much data.
286 EXPECT_EQ(-1, WebRtcCng_Generate(cng_dec_inst_, out_data, 641, 0)); 203 EXPECT_FALSE(cng_decoder.Generate(rtc::ArrayView<int16_t>(out_data, 641), 0));
287 EXPECT_EQ(6140, WebRtcCng_GetErrorCodeDec(cng_dec_inst_));
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 } 204 }
293 205
294 // Test automatic SID. 206 // Test automatic SID.
295 TEST_F(CngTest, CngAutoSid) { 207 TEST_F(CngTest, CngAutoSid) {
296 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; 208 rtc::Buffer sid_data;
297 size_t number_bytes;
298 209
299 // Create and initialize encoder and decoder memory. 210 // Create and initialize encoder and decoder.
300 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); 211 ComfortNoiseEncoder cng_encoder(16000, kSidNormalIntervalUpdate,
301 EXPECT_EQ(0, WebRtcCng_CreateDec(&cng_dec_inst_)); 212 kCNGNumParamsNormal);
302 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 16000, kSidNormalIntervalUpdate, 213 ComfortNoiseDecoder cng_decoder;
303 kCNGNumParamsNormal));
304 WebRtcCng_InitDec(cng_dec_inst_);
305 214
306 // Normal Encode, 100 msec, where no SID data should be generated. 215 // Normal Encode, 100 msec, where no SID data should be generated.
307 for (int i = 0; i < 10; i++) { 216 for (int i = 0; i < 10; i++) {
308 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 160, sid_data, 217 EXPECT_EQ(0U, cng_encoder.Encode(
309 &number_bytes, kNoSid)); 218 rtc::ArrayView<const int16_t>(speech_data_, 160), kNoSid, &sid_data));
310 } 219 }
311 220
312 // We have reached 100 msec, and SID data should be generated. 221 // We have reached 100 msec, and SID data should be generated.
313 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( 222 EXPECT_EQ(kCNGNumParamsNormal + 1, cng_encoder.Encode(
314 cng_enc_inst_, speech_data_, 160, sid_data, &number_bytes, kNoSid)); 223 rtc::ArrayView<const int16_t>(speech_data_, 160), kNoSid, &sid_data));
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 } 224 }
320 225
321 // Test automatic SID, with very short interval. 226 // Test automatic SID, with very short interval.
322 TEST_F(CngTest, CngAutoSidShort) { 227 TEST_F(CngTest, CngAutoSidShort) {
323 uint8_t sid_data[WEBRTC_CNG_MAX_LPC_ORDER + 1]; 228 rtc::Buffer sid_data;
324 size_t number_bytes;
325 229
326 // Create and initialize encoder and decoder memory. 230 // Create and initialize encoder and decoder.
327 EXPECT_EQ(0, WebRtcCng_CreateEnc(&cng_enc_inst_)); 231 ComfortNoiseEncoder cng_encoder(16000, kSidShortIntervalUpdate,
328 EXPECT_EQ(0, WebRtcCng_CreateDec(&cng_dec_inst_)); 232 kCNGNumParamsNormal);
329 EXPECT_EQ(0, WebRtcCng_InitEnc(cng_enc_inst_, 16000, kSidShortIntervalUpdate, 233 ComfortNoiseDecoder cng_decoder;
330 kCNGNumParamsNormal));
331 WebRtcCng_InitDec(cng_dec_inst_);
332 234
333 // First call will never generate SID, unless forced to. 235 // First call will never generate SID, unless forced to.
334 EXPECT_EQ(0, WebRtcCng_Encode(cng_enc_inst_, speech_data_, 160, sid_data, 236 EXPECT_EQ(0U, cng_encoder.Encode(
335 &number_bytes, kNoSid)); 237 rtc::ArrayView<const int16_t>(speech_data_, 160), kNoSid, &sid_data));
336 238
337 // Normal Encode, 100 msec, SID data should be generated all the time. 239 // Normal Encode, 100 msec, SID data should be generated all the time.
338 for (int i = 0; i < 10; i++) { 240 for (int i = 0; i < 10; i++) {
339 EXPECT_EQ(kCNGNumParamsNormal + 1, WebRtcCng_Encode( 241 EXPECT_EQ(kCNGNumParamsNormal + 1, cng_encoder.Encode(
340 cng_enc_inst_, speech_data_, 160, sid_data, &number_bytes, kNoSid)); 242 rtc::ArrayView<const int16_t>(speech_data_, 160), kNoSid, &sid_data));
341 } 243 }
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 } 244 }
347 245
348 } // namespace webrtc 246 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698