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