1c55a96383497a772a307b346368133960b02ad03Eric Laurent/* 2c55a96383497a772a307b346368133960b02ad03Eric Laurent * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3c55a96383497a772a307b346368133960b02ad03Eric Laurent * 4c55a96383497a772a307b346368133960b02ad03Eric Laurent * Use of this source code is governed by a BSD-style license 5c55a96383497a772a307b346368133960b02ad03Eric Laurent * that can be found in the LICENSE file in the root of the source 6c55a96383497a772a307b346368133960b02ad03Eric Laurent * tree. An additional intellectual property rights grant can be found 7c55a96383497a772a307b346368133960b02ad03Eric Laurent * in the file PATENTS. All contributing project authors may 8c55a96383497a772a307b346368133960b02ad03Eric Laurent * be found in the AUTHORS file in the root of the source tree. 9c55a96383497a772a307b346368133960b02ad03Eric Laurent */ 10c55a96383497a772a307b346368133960b02ad03Eric Laurent 11c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "gtest/gtest.h" 12c55a96383497a772a307b346368133960b02ad03Eric Laurent 13c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "common_audio/resampler/include/resampler.h" 14c55a96383497a772a307b346368133960b02ad03Eric Laurent 15c55a96383497a772a307b346368133960b02ad03Eric Laurent// TODO(andrew): this is a work-in-progress. Many more tests are needed. 16c55a96383497a772a307b346368133960b02ad03Eric Laurent 17c55a96383497a772a307b346368133960b02ad03Eric Laurentnamespace webrtc { 18c55a96383497a772a307b346368133960b02ad03Eric Laurentnamespace { 19c55a96383497a772a307b346368133960b02ad03Eric Laurentconst ResamplerType kTypes[] = { 20c55a96383497a772a307b346368133960b02ad03Eric Laurent kResamplerSynchronous, 21c55a96383497a772a307b346368133960b02ad03Eric Laurent kResamplerAsynchronous, 22c55a96383497a772a307b346368133960b02ad03Eric Laurent kResamplerSynchronousStereo, 23c55a96383497a772a307b346368133960b02ad03Eric Laurent kResamplerAsynchronousStereo 24c55a96383497a772a307b346368133960b02ad03Eric Laurent // kResamplerInvalid excluded 25c55a96383497a772a307b346368133960b02ad03Eric Laurent}; 26c55a96383497a772a307b346368133960b02ad03Eric Laurentconst size_t kTypesSize = sizeof(kTypes) / sizeof(*kTypes); 27c55a96383497a772a307b346368133960b02ad03Eric Laurent 28c55a96383497a772a307b346368133960b02ad03Eric Laurent// Rates we must support. 29c55a96383497a772a307b346368133960b02ad03Eric Laurentconst int kMaxRate = 96000; 30c55a96383497a772a307b346368133960b02ad03Eric Laurentconst int kRates[] = { 31c55a96383497a772a307b346368133960b02ad03Eric Laurent 8000, 32c55a96383497a772a307b346368133960b02ad03Eric Laurent 16000, 33c55a96383497a772a307b346368133960b02ad03Eric Laurent 32000, 34c55a96383497a772a307b346368133960b02ad03Eric Laurent 44000, 35c55a96383497a772a307b346368133960b02ad03Eric Laurent 48000, 36c55a96383497a772a307b346368133960b02ad03Eric Laurent kMaxRate 37c55a96383497a772a307b346368133960b02ad03Eric Laurent}; 38c55a96383497a772a307b346368133960b02ad03Eric Laurentconst size_t kRatesSize = sizeof(kRates) / sizeof(*kRates); 39c55a96383497a772a307b346368133960b02ad03Eric Laurentconst int kMaxChannels = 2; 40c55a96383497a772a307b346368133960b02ad03Eric Laurentconst size_t kDataSize = static_cast<size_t> (kMaxChannels * kMaxRate / 100); 41c55a96383497a772a307b346368133960b02ad03Eric Laurent 42c55a96383497a772a307b346368133960b02ad03Eric Laurent// TODO(andrew): should we be supporting these combinations? 43c55a96383497a772a307b346368133960b02ad03Eric Laurentbool ValidRates(int in_rate, int out_rate) { 44c55a96383497a772a307b346368133960b02ad03Eric Laurent // Not the most compact notation, for clarity. 45c55a96383497a772a307b346368133960b02ad03Eric Laurent if ((in_rate == 44000 && (out_rate == 48000 || out_rate == 96000)) || 46c55a96383497a772a307b346368133960b02ad03Eric Laurent (out_rate == 44000 && (in_rate == 48000 || in_rate == 96000))) { 47c55a96383497a772a307b346368133960b02ad03Eric Laurent return false; 48c55a96383497a772a307b346368133960b02ad03Eric Laurent } 49c55a96383497a772a307b346368133960b02ad03Eric Laurent 50c55a96383497a772a307b346368133960b02ad03Eric Laurent return true; 51c55a96383497a772a307b346368133960b02ad03Eric Laurent} 52c55a96383497a772a307b346368133960b02ad03Eric Laurent 53c55a96383497a772a307b346368133960b02ad03Eric Laurentclass ResamplerTest : public testing::Test { 54c55a96383497a772a307b346368133960b02ad03Eric Laurent protected: 55c55a96383497a772a307b346368133960b02ad03Eric Laurent ResamplerTest(); 56c55a96383497a772a307b346368133960b02ad03Eric Laurent virtual void SetUp(); 57c55a96383497a772a307b346368133960b02ad03Eric Laurent virtual void TearDown(); 58c55a96383497a772a307b346368133960b02ad03Eric Laurent 59c55a96383497a772a307b346368133960b02ad03Eric Laurent Resampler rs_; 60c55a96383497a772a307b346368133960b02ad03Eric Laurent int16_t data_in_[kDataSize]; 61c55a96383497a772a307b346368133960b02ad03Eric Laurent int16_t data_out_[kDataSize]; 62c55a96383497a772a307b346368133960b02ad03Eric Laurent}; 63c55a96383497a772a307b346368133960b02ad03Eric Laurent 64c55a96383497a772a307b346368133960b02ad03Eric LaurentResamplerTest::ResamplerTest() {} 65c55a96383497a772a307b346368133960b02ad03Eric Laurent 66c55a96383497a772a307b346368133960b02ad03Eric Laurentvoid ResamplerTest::SetUp() { 67c55a96383497a772a307b346368133960b02ad03Eric Laurent // Initialize input data with anything. The tests are content independent. 68c55a96383497a772a307b346368133960b02ad03Eric Laurent memset(data_in_, 1, sizeof(data_in_)); 69c55a96383497a772a307b346368133960b02ad03Eric Laurent} 70c55a96383497a772a307b346368133960b02ad03Eric Laurent 71c55a96383497a772a307b346368133960b02ad03Eric Laurentvoid ResamplerTest::TearDown() {} 72c55a96383497a772a307b346368133960b02ad03Eric Laurent 73c55a96383497a772a307b346368133960b02ad03Eric LaurentTEST_F(ResamplerTest, Reset) { 74c55a96383497a772a307b346368133960b02ad03Eric Laurent // The only failure mode for the constructor is if Reset() fails. For the 75c55a96383497a772a307b346368133960b02ad03Eric Laurent // time being then (until an Init function is added), we rely on Reset() 76c55a96383497a772a307b346368133960b02ad03Eric Laurent // to test the constructor. 77c55a96383497a772a307b346368133960b02ad03Eric Laurent 78c55a96383497a772a307b346368133960b02ad03Eric Laurent // Check that all required combinations are supported. 79c55a96383497a772a307b346368133960b02ad03Eric Laurent for (size_t i = 0; i < kRatesSize; ++i) { 80c55a96383497a772a307b346368133960b02ad03Eric Laurent for (size_t j = 0; j < kRatesSize; ++j) { 81c55a96383497a772a307b346368133960b02ad03Eric Laurent for (size_t k = 0; k < kTypesSize; ++k) { 82c55a96383497a772a307b346368133960b02ad03Eric Laurent std::ostringstream ss; 83c55a96383497a772a307b346368133960b02ad03Eric Laurent ss << "Input rate: " << kRates[i] << ", output rate: " << kRates[j] 84c55a96383497a772a307b346368133960b02ad03Eric Laurent << ", type: " << kTypes[k]; 85c55a96383497a772a307b346368133960b02ad03Eric Laurent SCOPED_TRACE(ss.str()); 86c55a96383497a772a307b346368133960b02ad03Eric Laurent if (ValidRates(kRates[i], kRates[j])) 87c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(0, rs_.Reset(kRates[i], kRates[j], kTypes[k])); 88c55a96383497a772a307b346368133960b02ad03Eric Laurent else 89c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(-1, rs_.Reset(kRates[i], kRates[j], kTypes[k])); 90c55a96383497a772a307b346368133960b02ad03Eric Laurent } 91c55a96383497a772a307b346368133960b02ad03Eric Laurent } 92c55a96383497a772a307b346368133960b02ad03Eric Laurent } 93c55a96383497a772a307b346368133960b02ad03Eric Laurent} 94c55a96383497a772a307b346368133960b02ad03Eric Laurent 95c55a96383497a772a307b346368133960b02ad03Eric Laurent// TODO(tlegrand): Replace code inside the two tests below with a function 96c55a96383497a772a307b346368133960b02ad03Eric Laurent// with number of channels and ResamplerType as input. 97c55a96383497a772a307b346368133960b02ad03Eric LaurentTEST_F(ResamplerTest, Synchronous) { 98c55a96383497a772a307b346368133960b02ad03Eric Laurent for (size_t i = 0; i < kRatesSize; ++i) { 99c55a96383497a772a307b346368133960b02ad03Eric Laurent for (size_t j = 0; j < kRatesSize; ++j) { 100c55a96383497a772a307b346368133960b02ad03Eric Laurent std::ostringstream ss; 101c55a96383497a772a307b346368133960b02ad03Eric Laurent ss << "Input rate: " << kRates[i] << ", output rate: " << kRates[j]; 102c55a96383497a772a307b346368133960b02ad03Eric Laurent SCOPED_TRACE(ss.str()); 103c55a96383497a772a307b346368133960b02ad03Eric Laurent 104c55a96383497a772a307b346368133960b02ad03Eric Laurent if (ValidRates(kRates[i], kRates[j])) { 105c55a96383497a772a307b346368133960b02ad03Eric Laurent int in_length = kRates[i] / 100; 106c55a96383497a772a307b346368133960b02ad03Eric Laurent int out_length = 0; 107c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(0, rs_.Reset(kRates[i], kRates[j], kResamplerSynchronous)); 108c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(0, rs_.Push(data_in_, in_length, data_out_, kDataSize, 109c55a96383497a772a307b346368133960b02ad03Eric Laurent out_length)); 110c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(kRates[j] / 100, out_length); 111c55a96383497a772a307b346368133960b02ad03Eric Laurent } else { 112c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(-1, rs_.Reset(kRates[i], kRates[j], kResamplerSynchronous)); 113c55a96383497a772a307b346368133960b02ad03Eric Laurent } 114c55a96383497a772a307b346368133960b02ad03Eric Laurent } 115c55a96383497a772a307b346368133960b02ad03Eric Laurent } 116c55a96383497a772a307b346368133960b02ad03Eric Laurent} 117c55a96383497a772a307b346368133960b02ad03Eric Laurent 118c55a96383497a772a307b346368133960b02ad03Eric LaurentTEST_F(ResamplerTest, SynchronousStereo) { 119c55a96383497a772a307b346368133960b02ad03Eric Laurent // Number of channels is 2, stereo mode. 120c55a96383497a772a307b346368133960b02ad03Eric Laurent const int kChannels = 2; 121c55a96383497a772a307b346368133960b02ad03Eric Laurent for (size_t i = 0; i < kRatesSize; ++i) { 122c55a96383497a772a307b346368133960b02ad03Eric Laurent for (size_t j = 0; j < kRatesSize; ++j) { 123c55a96383497a772a307b346368133960b02ad03Eric Laurent std::ostringstream ss; 124c55a96383497a772a307b346368133960b02ad03Eric Laurent ss << "Input rate: " << kRates[i] << ", output rate: " << kRates[j]; 125c55a96383497a772a307b346368133960b02ad03Eric Laurent SCOPED_TRACE(ss.str()); 126c55a96383497a772a307b346368133960b02ad03Eric Laurent 127c55a96383497a772a307b346368133960b02ad03Eric Laurent if (ValidRates(kRates[i], kRates[j])) { 128c55a96383497a772a307b346368133960b02ad03Eric Laurent int in_length = kChannels * kRates[i] / 100; 129c55a96383497a772a307b346368133960b02ad03Eric Laurent int out_length = 0; 130c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(0, rs_.Reset(kRates[i], kRates[j], 131c55a96383497a772a307b346368133960b02ad03Eric Laurent kResamplerSynchronousStereo)); 132c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(0, rs_.Push(data_in_, in_length, data_out_, kDataSize, 133c55a96383497a772a307b346368133960b02ad03Eric Laurent out_length)); 134c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(kChannels * kRates[j] / 100, out_length); 135c55a96383497a772a307b346368133960b02ad03Eric Laurent } else { 136c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(-1, rs_.Reset(kRates[i], kRates[j], 137c55a96383497a772a307b346368133960b02ad03Eric Laurent kResamplerSynchronousStereo)); 138c55a96383497a772a307b346368133960b02ad03Eric Laurent } 139c55a96383497a772a307b346368133960b02ad03Eric Laurent } 140c55a96383497a772a307b346368133960b02ad03Eric Laurent } 141c55a96383497a772a307b346368133960b02ad03Eric Laurent} 142c55a96383497a772a307b346368133960b02ad03Eric Laurent} // namespace 143c55a96383497a772a307b346368133960b02ad03Eric Laurent} // namespace webrtc 144