diff options
author | Torne (Richard Coles) <torne@google.com> | 2013-11-28 11:55:43 +0000 |
---|---|---|
committer | Torne (Richard Coles) <torne@google.com> | 2013-11-28 11:55:43 +0000 |
commit | f2477e01787aa58f445919b809d89e252beef54f (patch) | |
tree | 2db962b4af39f0db3a5f83b314373d0530c484b8 /media/base/vector_math_unittest.cc | |
parent | 7daea1dd5ff7e419322de831b642d81af3247912 (diff) | |
download | chromium_org-f2477e01787aa58f445919b809d89e252beef54f.tar.gz |
Merge from Chromium at DEPS revision 237746
This commit was generated by merge_to_master.py.
Change-Id: I8997af4cddfeb09a7c26f7e8e672c712cab461ea
Diffstat (limited to 'media/base/vector_math_unittest.cc')
-rw-r--r-- | media/base/vector_math_unittest.cc | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/media/base/vector_math_unittest.cc b/media/base/vector_math_unittest.cc index 32e5ea468c..f8278ce1b5 100644 --- a/media/base/vector_math_unittest.cc +++ b/media/base/vector_math_unittest.cc @@ -138,4 +138,248 @@ TEST_F(VectorMathTest, FMUL) { #endif } +namespace { + +class EWMATestScenario { + public: + EWMATestScenario(float initial_value, const float src[], int len, + float smoothing_factor) + : initial_value_(initial_value), + data_(static_cast<float*>( + len == 0 ? NULL : + base::AlignedAlloc(len * sizeof(float), + vector_math::kRequiredAlignment))), + data_len_(len), + smoothing_factor_(smoothing_factor), + expected_final_avg_(initial_value), + expected_max_(0.0f) { + if (data_len_ > 0) + memcpy(data_.get(), src, len * sizeof(float)); + } + + // Copy constructor and assignment operator for ::testing::Values(...). + EWMATestScenario(const EWMATestScenario& other) { *this = other; } + EWMATestScenario& operator=(const EWMATestScenario& other) { + this->initial_value_ = other.initial_value_; + this->smoothing_factor_ = other.smoothing_factor_; + if (other.data_len_ == 0) { + this->data_.reset(); + } else { + this->data_.reset(static_cast<float*>( + base::AlignedAlloc(other.data_len_ * sizeof(float), + vector_math::kRequiredAlignment))); + memcpy(this->data_.get(), other.data_.get(), + other.data_len_ * sizeof(float)); + } + this->data_len_ = other.data_len_; + this->expected_final_avg_ = other.expected_final_avg_; + this->expected_max_ = other.expected_max_; + return *this; + } + + EWMATestScenario ScaledBy(float scale) const { + EWMATestScenario result(*this); + float* p = result.data_.get(); + float* const p_end = p + result.data_len_; + for (; p < p_end; ++p) + *p *= scale; + return result; + } + + EWMATestScenario WithImpulse(float value, int offset) const { + EWMATestScenario result(*this); + result.data_.get()[offset] = value; + return result; + } + + EWMATestScenario HasExpectedResult(float final_avg_value, + float max_value) const { + EWMATestScenario result(*this); + result.expected_final_avg_ = final_avg_value; + result.expected_max_ = max_value; + return result; + } + + void RunTest() const { + { + SCOPED_TRACE("EWMAAndMaxPower"); + const std::pair<float, float>& result = vector_math::EWMAAndMaxPower( + initial_value_, data_.get(), data_len_, smoothing_factor_); + EXPECT_NEAR(expected_final_avg_, result.first, 0.0000001f); + EXPECT_NEAR(expected_max_, result.second, 0.0000001f); + } + + { + SCOPED_TRACE("EWMAAndMaxPower_C"); + const std::pair<float, float>& result = vector_math::EWMAAndMaxPower_C( + initial_value_, data_.get(), data_len_, smoothing_factor_); + EXPECT_NEAR(expected_final_avg_, result.first, 0.0000001f); + EXPECT_NEAR(expected_max_, result.second, 0.0000001f); + } + +#if defined(ARCH_CPU_X86_FAMILY) + { + ASSERT_TRUE(base::CPU().has_sse()); + SCOPED_TRACE("EWMAAndMaxPower_SSE"); + const std::pair<float, float>& result = vector_math::EWMAAndMaxPower_SSE( + initial_value_, data_.get(), data_len_, smoothing_factor_); + EXPECT_NEAR(expected_final_avg_, result.first, 0.0000001f); + EXPECT_NEAR(expected_max_, result.second, 0.0000001f); + } +#endif + +#if defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON) + { + SCOPED_TRACE("EWMAAndMaxPower_NEON"); + const std::pair<float, float>& result = vector_math::EWMAAndMaxPower_NEON( + initial_value_, data_.get(), data_len_, smoothing_factor_); + EXPECT_NEAR(expected_final_avg_, result.first, 0.0000001f); + EXPECT_NEAR(expected_max_, result.second, 0.0000001f); + } +#endif + } + + private: + float initial_value_; + scoped_ptr_malloc<float, base::ScopedPtrAlignedFree> data_; + int data_len_; + float smoothing_factor_; + float expected_final_avg_; + float expected_max_; +}; + +} // namespace + +typedef testing::TestWithParam<EWMATestScenario> VectorMathEWMAAndMaxPowerTest; + +TEST_P(VectorMathEWMAAndMaxPowerTest, Correctness) { + GetParam().RunTest(); +} + +static const float kZeros[] = { // 32 zeros + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static const float kOnes[] = { // 32 ones + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +static const float kCheckerboard[] = { // 32 alternating 0, 1 + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 +}; + +static const float kInverseCheckerboard[] = { // 32 alternating 1, 0 + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 +}; + +INSTANTIATE_TEST_CASE_P( + Scenarios, VectorMathEWMAAndMaxPowerTest, + ::testing::Values( + // Zero-length input: Result should equal initial value. + EWMATestScenario(0.0f, NULL, 0, 0.0f).HasExpectedResult(0.0f, 0.0f), + EWMATestScenario(1.0f, NULL, 0, 0.0f).HasExpectedResult(1.0f, 0.0f), + + // Smoothing factor of zero: Samples have no effect on result. + EWMATestScenario(0.0f, kOnes, 32, 0.0f).HasExpectedResult(0.0f, 1.0f), + EWMATestScenario(1.0f, kZeros, 32, 0.0f).HasExpectedResult(1.0f, 0.0f), + + // Smothing factor of one: Result = last sample squared. + EWMATestScenario(0.0f, kCheckerboard, 32, 1.0f) + .ScaledBy(2.0f) + .HasExpectedResult(4.0f, 4.0f), + EWMATestScenario(1.0f, kInverseCheckerboard, 32, 1.0f) + .ScaledBy(2.0f) + .HasExpectedResult(0.0f, 4.0f), + + // Smoothing factor of 1/4, muted signal. + EWMATestScenario(1.0f, kZeros, 1, 0.25f) + .HasExpectedResult(powf(0.75, 1.0f), 0.0f), + EWMATestScenario(1.0f, kZeros, 2, 0.25f) + .HasExpectedResult(powf(0.75, 2.0f), 0.0f), + EWMATestScenario(1.0f, kZeros, 3, 0.25f) + .HasExpectedResult(powf(0.75, 3.0f), 0.0f), + EWMATestScenario(1.0f, kZeros, 12, 0.25f) + .HasExpectedResult(powf(0.75, 12.0f), 0.0f), + EWMATestScenario(1.0f, kZeros, 13, 0.25f) + .HasExpectedResult(powf(0.75, 13.0f), 0.0f), + EWMATestScenario(1.0f, kZeros, 14, 0.25f) + .HasExpectedResult(powf(0.75, 14.0f), 0.0f), + EWMATestScenario(1.0f, kZeros, 15, 0.25f) + .HasExpectedResult(powf(0.75, 15.0f), 0.0f), + + // Smoothing factor of 1/4, constant full-amplitude signal. + EWMATestScenario(0.0f, kOnes, 1, 0.25f).HasExpectedResult(0.25f, 1.0f), + EWMATestScenario(0.0f, kOnes, 2, 0.25f) + .HasExpectedResult(0.4375f, 1.0f), + EWMATestScenario(0.0f, kOnes, 3, 0.25f) + .HasExpectedResult(0.578125f, 1.0f), + EWMATestScenario(0.0f, kOnes, 12, 0.25f) + .HasExpectedResult(0.96832365f, 1.0f), + EWMATestScenario(0.0f, kOnes, 13, 0.25f) + .HasExpectedResult(0.97624274f, 1.0f), + EWMATestScenario(0.0f, kOnes, 14, 0.25f) + .HasExpectedResult(0.98218205f, 1.0f), + EWMATestScenario(0.0f, kOnes, 15, 0.25f) + .HasExpectedResult(0.98663654f, 1.0f), + + // Smoothing factor of 1/4, checkerboard signal. + EWMATestScenario(0.0f, kCheckerboard, 1, 0.25f) + .HasExpectedResult(0.0f, 0.0f), + EWMATestScenario(0.0f, kCheckerboard, 2, 0.25f) + .HasExpectedResult(0.25f, 1.0f), + EWMATestScenario(0.0f, kCheckerboard, 3, 0.25f) + .HasExpectedResult(0.1875f, 1.0f), + EWMATestScenario(0.0f, kCheckerboard, 12, 0.25f) + .HasExpectedResult(0.55332780f, 1.0f), + EWMATestScenario(0.0f, kCheckerboard, 13, 0.25f) + .HasExpectedResult(0.41499585f, 1.0f), + EWMATestScenario(0.0f, kCheckerboard, 14, 0.25f) + .HasExpectedResult(0.56124689f, 1.0f), + EWMATestScenario(0.0f, kCheckerboard, 15, 0.25f) + .HasExpectedResult(0.42093517f, 1.0f), + + // Smoothing factor of 1/4, inverse checkerboard signal. + EWMATestScenario(0.0f, kInverseCheckerboard, 1, 0.25f) + .HasExpectedResult(0.25f, 1.0f), + EWMATestScenario(0.0f, kInverseCheckerboard, 2, 0.25f) + .HasExpectedResult(0.1875f, 1.0f), + EWMATestScenario(0.0f, kInverseCheckerboard, 3, 0.25f) + .HasExpectedResult(0.390625f, 1.0f), + EWMATestScenario(0.0f, kInverseCheckerboard, 12, 0.25f) + .HasExpectedResult(0.41499585f, 1.0f), + EWMATestScenario(0.0f, kInverseCheckerboard, 13, 0.25f) + .HasExpectedResult(0.56124689f, 1.0f), + EWMATestScenario(0.0f, kInverseCheckerboard, 14, 0.25f) + .HasExpectedResult(0.42093517f, 1.0f), + EWMATestScenario(0.0f, kInverseCheckerboard, 15, 0.25f) + .HasExpectedResult(0.56570137f, 1.0f), + + // Smoothing factor of 1/4, impluse signal. + EWMATestScenario(0.0f, kZeros, 3, 0.25f) + .WithImpulse(2.0f, 0) + .HasExpectedResult(0.562500f, 4.0f), + EWMATestScenario(0.0f, kZeros, 3, 0.25f) + .WithImpulse(2.0f, 1) + .HasExpectedResult(0.75f, 4.0f), + EWMATestScenario(0.0f, kZeros, 3, 0.25f) + .WithImpulse(2.0f, 2) + .HasExpectedResult(1.0f, 4.0f), + EWMATestScenario(0.0f, kZeros, 32, 0.25f) + .WithImpulse(2.0f, 0) + .HasExpectedResult(0.00013394f, 4.0f), + EWMATestScenario(0.0f, kZeros, 32, 0.25f) + .WithImpulse(2.0f, 1) + .HasExpectedResult(0.00017858f, 4.0f), + EWMATestScenario(0.0f, kZeros, 32, 0.25f) + .WithImpulse(2.0f, 2) + .HasExpectedResult(0.00023811f, 4.0f), + EWMATestScenario(0.0f, kZeros, 32, 0.25f) + .WithImpulse(2.0f, 3) + .HasExpectedResult(0.00031748f, 4.0f) + )); + } // namespace media |