opus_unittest.cc revision 8f8503d947e820cce35fa3d0f2b25b6b893cf141
1/* 2 * Copyright (c) 2013 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#include <string> 11 12#include "testing/gtest/include/gtest/gtest.h" 13#include "webrtc/modules/audio_coding/codecs/opus/interface/opus_interface.h" 14#include "webrtc/test/testsupport/fileutils.h" 15 16struct WebRtcOpusEncInst; 17struct WebRtcOpusDecInst; 18 19namespace webrtc { 20 21// Number of samples in a 60 ms stereo frame, sampled at 48 kHz. 22const int kOpusMaxFrameSamples = 48 * 60 * 2; 23// Maximum number of bytes in output bitstream. 24const size_t kMaxBytes = 1000; 25// Number of samples-per-channel in a 20 ms frame, sampled at 48 kHz. 26const int kOpus20msFrameSamples = 48 * 20; 27// Number of samples-per-channel in a 10 ms frame, sampled at 48 kHz. 28const int kOpus10msFrameSamples = 48 * 10; 29 30class OpusTest : public ::testing::Test { 31 protected: 32 OpusTest(); 33 virtual void SetUp(); 34 35 WebRtcOpusEncInst* opus_mono_encoder_; 36 WebRtcOpusEncInst* opus_stereo_encoder_; 37 WebRtcOpusDecInst* opus_mono_decoder_; 38 WebRtcOpusDecInst* opus_mono_decoder_new_; 39 WebRtcOpusDecInst* opus_stereo_decoder_; 40 WebRtcOpusDecInst* opus_stereo_decoder_new_; 41 42 int16_t speech_data_[kOpusMaxFrameSamples]; 43 int16_t output_data_[kOpusMaxFrameSamples]; 44 uint8_t bitstream_[kMaxBytes]; 45}; 46 47OpusTest::OpusTest() 48 : opus_mono_encoder_(NULL), 49 opus_stereo_encoder_(NULL), 50 opus_mono_decoder_(NULL), 51 opus_mono_decoder_new_(NULL), 52 opus_stereo_decoder_(NULL), 53 opus_stereo_decoder_new_(NULL) { 54} 55 56void OpusTest::SetUp() { 57 FILE* input_file; 58 const std::string file_name = 59 webrtc::test::ResourcePath("audio_coding/speech_mono_32_48kHz", "pcm"); 60 input_file = fopen(file_name.c_str(), "rb"); 61 ASSERT_TRUE(input_file != NULL); 62 ASSERT_EQ(kOpusMaxFrameSamples, 63 static_cast<int32_t>(fread(speech_data_, sizeof(int16_t), 64 kOpusMaxFrameSamples, input_file))); 65 fclose(input_file); 66 input_file = NULL; 67} 68 69// Test failing Create. 70TEST_F(OpusTest, OpusCreateFail) { 71 // Test to see that an invalid pointer is caught. 72 EXPECT_EQ(-1, WebRtcOpus_EncoderCreate(NULL, 1)); 73 EXPECT_EQ(-1, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 3)); 74 EXPECT_EQ(-1, WebRtcOpus_DecoderCreate(NULL, 1)); 75 EXPECT_EQ(-1, WebRtcOpus_DecoderCreate(&opus_mono_decoder_, 3)); 76} 77 78// Test failing Free. 79TEST_F(OpusTest, OpusFreeFail) { 80 // Test to see that an invalid pointer is caught. 81 EXPECT_EQ(-1, WebRtcOpus_EncoderFree(NULL)); 82 EXPECT_EQ(-1, WebRtcOpus_DecoderFree(NULL)); 83} 84 85// Test normal Create and Free. 86TEST_F(OpusTest, OpusCreateFree) { 87 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1)); 88 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_mono_decoder_, 1)); 89 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2)); 90 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_, 2)); 91 EXPECT_TRUE(opus_mono_encoder_ != NULL); 92 EXPECT_TRUE(opus_mono_decoder_ != NULL); 93 EXPECT_TRUE(opus_stereo_encoder_ != NULL); 94 EXPECT_TRUE(opus_stereo_decoder_ != NULL); 95 // Free encoder and decoder memory. 96 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_)); 97 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_mono_decoder_)); 98 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_)); 99 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_)); 100} 101 102TEST_F(OpusTest, OpusEncodeDecodeMono) { 103 // Create encoder memory. 104 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1)); 105 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_mono_decoder_, 1)); 106 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_mono_decoder_new_, 1)); 107 108 // Set bitrate. 109 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_mono_encoder_, 32000)); 110 111 // Check number of channels for decoder. 112 EXPECT_EQ(1, WebRtcOpus_DecoderChannels(opus_mono_decoder_)); 113 EXPECT_EQ(1, WebRtcOpus_DecoderChannels(opus_mono_decoder_new_)); 114 115 // Encode & decode. 116 int16_t encoded_bytes; 117 int16_t audio_type; 118 int16_t output_data_decode_new[kOpusMaxFrameSamples]; 119 int16_t output_data_decode[kOpusMaxFrameSamples]; 120 int16_t* coded = reinterpret_cast<int16_t*>(bitstream_); 121 encoded_bytes = WebRtcOpus_Encode(opus_mono_encoder_, speech_data_, 122 kOpus20msFrameSamples, kMaxBytes, 123 bitstream_); 124 EXPECT_EQ(kOpus20msFrameSamples, 125 WebRtcOpus_DecodeNew(opus_mono_decoder_new_, bitstream_, 126 encoded_bytes, output_data_decode_new, 127 &audio_type)); 128 EXPECT_EQ(kOpus20msFrameSamples, 129 WebRtcOpus_Decode(opus_mono_decoder_, coded, 130 encoded_bytes, output_data_decode, 131 &audio_type)); 132 133 // Data in |output_data_decode_new| should be the same as in 134 // |output_data_decode|. 135 for (int i = 0; i < kOpus20msFrameSamples; i++) { 136 EXPECT_EQ(output_data_decode_new[i], output_data_decode[i]); 137 } 138 139 // Free memory. 140 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_)); 141 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_mono_decoder_)); 142 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_mono_decoder_new_)); 143} 144 145TEST_F(OpusTest, OpusEncodeDecodeStereo) { 146 // Create encoder memory. 147 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2)); 148 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_, 2)); 149 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_new_, 2)); 150 151 // Set bitrate. 152 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_stereo_encoder_, 64000)); 153 154 // Check number of channels for decoder. 155 EXPECT_EQ(2, WebRtcOpus_DecoderChannels(opus_stereo_decoder_)); 156 EXPECT_EQ(2, WebRtcOpus_DecoderChannels(opus_stereo_decoder_new_)); 157 158 // Encode & decode. 159 int16_t encoded_bytes; 160 int16_t audio_type; 161 int16_t output_data_decode_new[kOpusMaxFrameSamples]; 162 int16_t output_data_decode[kOpusMaxFrameSamples]; 163 int16_t output_data_decode_slave[kOpusMaxFrameSamples]; 164 int16_t* coded = reinterpret_cast<int16_t*>(bitstream_); 165 encoded_bytes = WebRtcOpus_Encode(opus_stereo_encoder_, speech_data_, 166 kOpus20msFrameSamples, kMaxBytes, 167 bitstream_); 168 EXPECT_EQ(kOpus20msFrameSamples, 169 WebRtcOpus_DecodeNew(opus_stereo_decoder_new_, bitstream_, 170 encoded_bytes, output_data_decode_new, 171 &audio_type)); 172 EXPECT_EQ(kOpus20msFrameSamples, 173 WebRtcOpus_Decode(opus_stereo_decoder_, coded, 174 encoded_bytes, output_data_decode, 175 &audio_type)); 176 EXPECT_EQ(kOpus20msFrameSamples, 177 WebRtcOpus_DecodeSlave(opus_stereo_decoder_, coded, 178 encoded_bytes, output_data_decode_slave, 179 &audio_type)); 180 181 // Data in |output_data_decode_new| should be the same as in 182 // |output_data_decode| and |output_data_decode_slave| interleaved to a 183 // stereo signal. 184 for (int i = 0; i < kOpus20msFrameSamples; i++) { 185 EXPECT_EQ(output_data_decode_new[i * 2], output_data_decode[i]); 186 EXPECT_EQ(output_data_decode_new[i * 2 + 1], output_data_decode_slave[i]); 187 } 188 189 // Free memory. 190 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_)); 191 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_)); 192 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_new_)); 193} 194 195TEST_F(OpusTest, OpusSetBitRate) { 196 // Test without creating encoder memory. 197 EXPECT_EQ(-1, WebRtcOpus_SetBitRate(opus_mono_encoder_, 60000)); 198 EXPECT_EQ(-1, WebRtcOpus_SetBitRate(opus_stereo_encoder_, 60000)); 199 200 // Create encoder memory, try with different bitrates. 201 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1)); 202 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2)); 203 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_mono_encoder_, 30000)); 204 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_stereo_encoder_, 60000)); 205 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_mono_encoder_, 300000)); 206 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_stereo_encoder_, 600000)); 207 208 // Free memory. 209 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_)); 210 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_)); 211} 212 213TEST_F(OpusTest, OpusSetComplexity) { 214 // Test without creating encoder memory. 215 EXPECT_EQ(-1, WebRtcOpus_SetComplexity(opus_mono_encoder_, 9)); 216 EXPECT_EQ(-1, WebRtcOpus_SetComplexity(opus_stereo_encoder_, 9)); 217 218 // Create encoder memory, try with different complexities. 219 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1)); 220 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2)); 221 222 EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_mono_encoder_, 0)); 223 EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_stereo_encoder_, 0)); 224 EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_mono_encoder_, 10)); 225 EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_stereo_encoder_, 10)); 226 EXPECT_EQ(-1, WebRtcOpus_SetComplexity(opus_mono_encoder_, 11)); 227 EXPECT_EQ(-1, WebRtcOpus_SetComplexity(opus_stereo_encoder_, 11)); 228 229 // Free memory. 230 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_)); 231 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_)); 232} 233 234// Encode and decode one frame (stereo), initialize the decoder and 235// decode once more. 236TEST_F(OpusTest, OpusDecodeInit) { 237 // Create encoder memory. 238 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2)); 239 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_, 2)); 240 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_new_, 2)); 241 242 // Encode & decode. 243 int16_t encoded_bytes; 244 int16_t audio_type; 245 int16_t output_data_decode_new[kOpusMaxFrameSamples]; 246 int16_t output_data_decode[kOpusMaxFrameSamples]; 247 int16_t output_data_decode_slave[kOpusMaxFrameSamples]; 248 int16_t* coded = reinterpret_cast<int16_t*>(bitstream_); 249 encoded_bytes = WebRtcOpus_Encode(opus_stereo_encoder_, speech_data_, 250 kOpus20msFrameSamples, kMaxBytes, 251 bitstream_); 252 EXPECT_EQ(kOpus20msFrameSamples, 253 WebRtcOpus_DecodeNew(opus_stereo_decoder_new_, bitstream_, 254 encoded_bytes, output_data_decode_new, 255 &audio_type)); 256 EXPECT_EQ(kOpus20msFrameSamples, 257 WebRtcOpus_Decode(opus_stereo_decoder_, coded, 258 encoded_bytes, output_data_decode, 259 &audio_type)); 260 EXPECT_EQ(kOpus20msFrameSamples, 261 WebRtcOpus_DecodeSlave(opus_stereo_decoder_, coded, 262 encoded_bytes, output_data_decode_slave, 263 &audio_type)); 264 265 // Data in |output_data_decode_new| should be the same as in 266 // |output_data_decode| and |output_data_decode_slave| interleaved to a 267 // stereo signal. 268 for (int i = 0; i < kOpus20msFrameSamples; i++) { 269 EXPECT_EQ(output_data_decode_new[i * 2], output_data_decode[i]); 270 EXPECT_EQ(output_data_decode_new[i * 2 + 1], output_data_decode_slave[i]); 271 } 272 273 EXPECT_EQ(0, WebRtcOpus_DecoderInitNew(opus_stereo_decoder_new_)); 274 EXPECT_EQ(0, WebRtcOpus_DecoderInit(opus_stereo_decoder_)); 275 EXPECT_EQ(0, WebRtcOpus_DecoderInitSlave(opus_stereo_decoder_)); 276 277 EXPECT_EQ(kOpus20msFrameSamples, 278 WebRtcOpus_DecodeNew(opus_stereo_decoder_new_, bitstream_, 279 encoded_bytes, output_data_decode_new, 280 &audio_type)); 281 EXPECT_EQ(kOpus20msFrameSamples, 282 WebRtcOpus_Decode(opus_stereo_decoder_, coded, 283 encoded_bytes, output_data_decode, 284 &audio_type)); 285 EXPECT_EQ(kOpus20msFrameSamples, 286 WebRtcOpus_DecodeSlave(opus_stereo_decoder_, coded, 287 encoded_bytes, output_data_decode_slave, 288 &audio_type)); 289 290 // Data in |output_data_decode_new| should be the same as in 291 // |output_data_decode| and |output_data_decode_slave| interleaved to a 292 // stereo signal. 293 for (int i = 0; i < kOpus20msFrameSamples; i++) { 294 EXPECT_EQ(output_data_decode_new[i * 2], output_data_decode[i]); 295 EXPECT_EQ(output_data_decode_new[i * 2 + 1], output_data_decode_slave[i]); 296 } 297 298 // Free memory. 299 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_)); 300 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_)); 301 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_new_)); 302} 303 304TEST_F(OpusTest, OpusEnableDisableFec) { 305 // Test without creating encoder memory. 306 EXPECT_EQ(-1, WebRtcOpus_EnableFec(opus_mono_encoder_)); 307 EXPECT_EQ(-1, WebRtcOpus_DisableFec(opus_stereo_encoder_)); 308 309 // Create encoder memory, try with different bitrates. 310 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1)); 311 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2)); 312 313 EXPECT_EQ(0, WebRtcOpus_EnableFec(opus_mono_encoder_)); 314 EXPECT_EQ(0, WebRtcOpus_EnableFec(opus_stereo_encoder_)); 315 EXPECT_EQ(0, WebRtcOpus_DisableFec(opus_mono_encoder_)); 316 EXPECT_EQ(0, WebRtcOpus_DisableFec(opus_stereo_encoder_)); 317 318 // Free memory. 319 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_)); 320 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_)); 321} 322 323TEST_F(OpusTest, OpusSetPacketLossRate) { 324 // Test without creating encoder memory. 325 EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_mono_encoder_, 50)); 326 EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_stereo_encoder_, 50)); 327 328 // Create encoder memory, try with different bitrates. 329 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1)); 330 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2)); 331 332 EXPECT_EQ(0, WebRtcOpus_SetPacketLossRate(opus_mono_encoder_, 50)); 333 EXPECT_EQ(0, WebRtcOpus_SetPacketLossRate(opus_stereo_encoder_, 50)); 334 EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_mono_encoder_, -1)); 335 EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_stereo_encoder_, -1)); 336 EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_mono_encoder_, 101)); 337 EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_stereo_encoder_, 101)); 338 339 // Free memory. 340 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_)); 341 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_)); 342} 343 344 345// PLC in mono mode. 346TEST_F(OpusTest, OpusDecodePlcMono) { 347 // Create encoder memory. 348 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1)); 349 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_mono_decoder_, 1)); 350 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_mono_decoder_new_, 1)); 351 352 // Set bitrate. 353 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_mono_encoder_, 32000)); 354 355 // Check number of channels for decoder. 356 EXPECT_EQ(1, WebRtcOpus_DecoderChannels(opus_mono_decoder_)); 357 EXPECT_EQ(1, WebRtcOpus_DecoderChannels(opus_mono_decoder_new_)); 358 359 // Encode & decode. 360 int16_t encoded_bytes; 361 int16_t audio_type; 362 int16_t output_data_decode_new[kOpusMaxFrameSamples]; 363 int16_t output_data_decode[kOpusMaxFrameSamples]; 364 int16_t* coded = reinterpret_cast<int16_t*>(bitstream_); 365 encoded_bytes = WebRtcOpus_Encode(opus_mono_encoder_, speech_data_, 366 kOpus20msFrameSamples, kMaxBytes, 367 bitstream_); 368 EXPECT_EQ(kOpus20msFrameSamples, 369 WebRtcOpus_DecodeNew(opus_mono_decoder_new_, bitstream_, 370 encoded_bytes, output_data_decode_new, 371 &audio_type)); 372 EXPECT_EQ(kOpus20msFrameSamples, 373 WebRtcOpus_Decode(opus_mono_decoder_, coded, 374 encoded_bytes, output_data_decode, 375 &audio_type)); 376 377 // Call decoder PLC for both versions of the decoder. 378 int16_t plc_buffer[kOpusMaxFrameSamples]; 379 int16_t plc_buffer_new[kOpusMaxFrameSamples]; 380 EXPECT_EQ(kOpus20msFrameSamples, 381 WebRtcOpus_DecodePlcMaster(opus_mono_decoder_, plc_buffer, 1)); 382 EXPECT_EQ(kOpus20msFrameSamples, 383 WebRtcOpus_DecodePlc(opus_mono_decoder_new_, plc_buffer_new, 1)); 384 385 // Data in |plc_buffer| should be the same as in |plc_buffer_new|. 386 for (int i = 0; i < kOpus20msFrameSamples; i++) { 387 EXPECT_EQ(plc_buffer[i], plc_buffer_new[i]); 388 } 389 390 // Free memory. 391 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_)); 392 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_mono_decoder_)); 393 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_mono_decoder_new_)); 394} 395 396// PLC in stereo mode. 397TEST_F(OpusTest, OpusDecodePlcStereo) { 398 // Create encoder memory. 399 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2)); 400 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_, 2)); 401 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_new_, 2)); 402 403 // Set bitrate. 404 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_stereo_encoder_, 64000)); 405 406 // Check number of channels for decoder. 407 EXPECT_EQ(2, WebRtcOpus_DecoderChannels(opus_stereo_decoder_)); 408 EXPECT_EQ(2, WebRtcOpus_DecoderChannels(opus_stereo_decoder_new_)); 409 410 // Encode & decode. 411 int16_t encoded_bytes; 412 int16_t audio_type; 413 int16_t output_data_decode_new[kOpusMaxFrameSamples]; 414 int16_t output_data_decode[kOpusMaxFrameSamples]; 415 int16_t output_data_decode_slave[kOpusMaxFrameSamples]; 416 int16_t* coded = reinterpret_cast<int16_t*>(bitstream_); 417 encoded_bytes = WebRtcOpus_Encode(opus_stereo_encoder_, speech_data_, 418 kOpus20msFrameSamples, kMaxBytes, 419 bitstream_); 420 EXPECT_EQ(kOpus20msFrameSamples, 421 WebRtcOpus_DecodeNew(opus_stereo_decoder_new_, bitstream_, 422 encoded_bytes, output_data_decode_new, 423 &audio_type)); 424 EXPECT_EQ(kOpus20msFrameSamples, 425 WebRtcOpus_Decode(opus_stereo_decoder_, coded, 426 encoded_bytes, output_data_decode, 427 &audio_type)); 428 EXPECT_EQ(kOpus20msFrameSamples, 429 WebRtcOpus_DecodeSlave(opus_stereo_decoder_, coded, 430 encoded_bytes, 431 output_data_decode_slave, 432 &audio_type)); 433 434 // Call decoder PLC for both versions of the decoder. 435 int16_t plc_buffer_left[kOpusMaxFrameSamples]; 436 int16_t plc_buffer_right[kOpusMaxFrameSamples]; 437 int16_t plc_buffer_new[kOpusMaxFrameSamples]; 438 EXPECT_EQ(kOpus20msFrameSamples, 439 WebRtcOpus_DecodePlcMaster(opus_stereo_decoder_, 440 plc_buffer_left, 1)); 441 EXPECT_EQ(kOpus20msFrameSamples, 442 WebRtcOpus_DecodePlcSlave(opus_stereo_decoder_, 443 plc_buffer_right, 1)); 444 EXPECT_EQ(kOpus20msFrameSamples, 445 WebRtcOpus_DecodePlc(opus_stereo_decoder_new_, plc_buffer_new, 1)); 446 // Data in |plc_buffer_left| and |plc_buffer_right|should be the same as the 447 // interleaved samples in |plc_buffer_new|. 448 for (int i = 0, j = 0; i < kOpus20msFrameSamples; i++) { 449 EXPECT_EQ(plc_buffer_left[i], plc_buffer_new[j++]); 450 EXPECT_EQ(plc_buffer_right[i], plc_buffer_new[j++]); 451 } 452 453 // Free memory. 454 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_)); 455 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_)); 456 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_new_)); 457} 458 459// Duration estimation. 460TEST_F(OpusTest, OpusDurationEstimation) { 461 // Create. 462 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2)); 463 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_, 2)); 464 465 int16_t encoded_bytes; 466 467 // 10 ms. 468 encoded_bytes = WebRtcOpus_Encode(opus_stereo_encoder_, speech_data_, 469 kOpus10msFrameSamples, kMaxBytes, 470 bitstream_); 471 EXPECT_EQ(kOpus10msFrameSamples, 472 WebRtcOpus_DurationEst(opus_stereo_decoder_, bitstream_, 473 encoded_bytes)); 474 475 // 20 ms 476 encoded_bytes = WebRtcOpus_Encode(opus_stereo_encoder_, speech_data_, 477 kOpus20msFrameSamples, kMaxBytes, 478 bitstream_); 479 EXPECT_EQ(kOpus20msFrameSamples, 480 WebRtcOpus_DurationEst(opus_stereo_decoder_, bitstream_, 481 encoded_bytes)); 482 483 // Free memory. 484 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_)); 485 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_)); 486} 487 488} // namespace webrtc 489