Chromium Code Reviews| 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 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 |
| OLD | NEW |