| /* |
| * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #include "webrtc/modules/audio_processing/transient/dyadic_decimator.h" |
| |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace webrtc { |
| |
| static const size_t kEvenBufferLength = 6; |
| static const size_t kOddBufferLength = 5; |
| static const size_t kOutBufferLength = 3; |
| |
| int16_t const test_buffer_even_len[] = {0, 1, 2, 3, 4, 5}; |
| int16_t const test_buffer_odd_len[] = {0, 1, 2, 3, 4}; |
| int16_t test_buffer_out[kOutBufferLength]; |
| |
| TEST(DyadicDecimatorTest, GetOutLengthToDyadicDecimate) { |
| EXPECT_EQ(3u, GetOutLengthToDyadicDecimate(6, false)); |
| EXPECT_EQ(3u, GetOutLengthToDyadicDecimate(6, true)); |
| EXPECT_EQ(3u, GetOutLengthToDyadicDecimate(5, false)); |
| EXPECT_EQ(2u, GetOutLengthToDyadicDecimate(5, true)); |
| } |
| |
| |
| TEST(DyadicDecimatorTest, DyadicDecimateErrorValues) { |
| size_t out_samples = 0; |
| |
| out_samples = DyadicDecimate(static_cast<int16_t*>(NULL), |
| kEvenBufferLength, |
| false, // Even sequence. |
| test_buffer_out, |
| kOutBufferLength); |
| EXPECT_EQ(0u, out_samples); |
| |
| out_samples = DyadicDecimate(test_buffer_even_len, |
| kEvenBufferLength, |
| false, // Even sequence. |
| static_cast<int16_t*>(NULL), |
| kOutBufferLength); |
| EXPECT_EQ(0u, out_samples); |
| |
| // Less than required |out_length|. |
| out_samples = DyadicDecimate(test_buffer_even_len, |
| kEvenBufferLength, |
| false, // Even sequence. |
| test_buffer_out, |
| 2); |
| EXPECT_EQ(0u, out_samples); |
| } |
| |
| TEST(DyadicDecimatorTest, DyadicDecimateEvenLengthEvenSequence) { |
| size_t expected_out_samples = |
| GetOutLengthToDyadicDecimate(kEvenBufferLength, false); |
| |
| size_t out_samples = DyadicDecimate(test_buffer_even_len, |
| kEvenBufferLength, |
| false, // Even sequence. |
| test_buffer_out, |
| kOutBufferLength); |
| |
| EXPECT_EQ(expected_out_samples, out_samples); |
| |
| EXPECT_EQ(0, test_buffer_out[0]); |
| EXPECT_EQ(2, test_buffer_out[1]); |
| EXPECT_EQ(4, test_buffer_out[2]); |
| } |
| |
| TEST(DyadicDecimatorTest, DyadicDecimateEvenLengthOddSequence) { |
| size_t expected_out_samples = |
| GetOutLengthToDyadicDecimate(kEvenBufferLength, true); |
| |
| size_t out_samples = DyadicDecimate(test_buffer_even_len, |
| kEvenBufferLength, |
| true, // Odd sequence. |
| test_buffer_out, |
| kOutBufferLength); |
| |
| EXPECT_EQ(expected_out_samples, out_samples); |
| |
| EXPECT_EQ(1, test_buffer_out[0]); |
| EXPECT_EQ(3, test_buffer_out[1]); |
| EXPECT_EQ(5, test_buffer_out[2]); |
| } |
| |
| TEST(DyadicDecimatorTest, DyadicDecimateOddLengthEvenSequence) { |
| size_t expected_out_samples = |
| GetOutLengthToDyadicDecimate(kOddBufferLength, false); |
| |
| size_t out_samples = DyadicDecimate(test_buffer_odd_len, |
| kOddBufferLength, |
| false, // Even sequence. |
| test_buffer_out, |
| kOutBufferLength); |
| |
| EXPECT_EQ(expected_out_samples, out_samples); |
| |
| EXPECT_EQ(0, test_buffer_out[0]); |
| EXPECT_EQ(2, test_buffer_out[1]); |
| EXPECT_EQ(4, test_buffer_out[2]); |
| } |
| |
| TEST(DyadicDecimatorTest, DyadicDecimateOddLengthOddSequence) { |
| size_t expected_out_samples = |
| GetOutLengthToDyadicDecimate(kOddBufferLength, true); |
| |
| size_t out_samples = DyadicDecimate(test_buffer_odd_len, |
| kOddBufferLength, |
| true, // Odd sequence. |
| test_buffer_out, |
| kOutBufferLength); |
| |
| EXPECT_EQ(expected_out_samples, out_samples); |
| |
| EXPECT_EQ(1, test_buffer_out[0]); |
| EXPECT_EQ(3, test_buffer_out[1]); |
| } |
| |
| } // namespace webrtc |