| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <memory> |
| 6 |
| 5 #include "base/logging.h" | 7 #include "base/logging.h" |
| 6 #include "base/macros.h" | 8 #include "base/macros.h" |
| 7 #include "media/base/audio_bus.h" | 9 #include "media/base/audio_bus.h" |
| 8 #include "media/base/audio_hash.h" | 10 #include "media/base/audio_hash.h" |
| 9 #include "media/base/fake_audio_render_callback.h" | 11 #include "media/base/fake_audio_render_callback.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 11 | 13 |
| 12 namespace media { | 14 namespace media { |
| 13 | 15 |
| 14 static const int kChannelCount = 2; | 16 static const int kChannelCount = 2; |
| 15 static const int kFrameCount = 1024; | 17 static const int kFrameCount = 1024; |
| 16 | 18 |
| 17 class AudioHashTest : public testing::Test { | 19 class AudioHashTest : public testing::Test { |
| 18 public: | 20 public: |
| 19 AudioHashTest() | 21 AudioHashTest() |
| 20 : bus_one_(AudioBus::Create(kChannelCount, kFrameCount)), | 22 : bus_one_(AudioBus::Create(kChannelCount, kFrameCount)), |
| 21 bus_two_(AudioBus::Create(kChannelCount, kFrameCount)), | 23 bus_two_(AudioBus::Create(kChannelCount, kFrameCount)), |
| 22 fake_callback_(0.01) { | 24 fake_callback_(0.01) { |
| 23 | 25 |
| 24 // Fill each channel in each bus with unique data. | 26 // Fill each channel in each bus with unique data. |
| 25 GenerateUniqueChannels(bus_one_.get()); | 27 GenerateUniqueChannels(bus_one_.get()); |
| 26 GenerateUniqueChannels(bus_two_.get()); | 28 GenerateUniqueChannels(bus_two_.get()); |
| 27 } | 29 } |
| 28 | 30 |
| 29 void GenerateUniqueChannels(AudioBus* audio_bus) { | 31 void GenerateUniqueChannels(AudioBus* audio_bus) { |
| 30 // Use an AudioBus wrapper to avoid an extra memcpy when filling channels. | 32 // Use an AudioBus wrapper to avoid an extra memcpy when filling channels. |
| 31 scoped_ptr<AudioBus> wrapped_bus = AudioBus::CreateWrapper(1); | 33 std::unique_ptr<AudioBus> wrapped_bus = AudioBus::CreateWrapper(1); |
| 32 wrapped_bus->set_frames(audio_bus->frames()); | 34 wrapped_bus->set_frames(audio_bus->frames()); |
| 33 | 35 |
| 34 // Since FakeAudioRenderCallback generates only a single channel of unique | 36 // Since FakeAudioRenderCallback generates only a single channel of unique |
| 35 // audio data, we need to fill each channel manually. | 37 // audio data, we need to fill each channel manually. |
| 36 for (int ch = 0; ch < audio_bus->channels(); ++ch) { | 38 for (int ch = 0; ch < audio_bus->channels(); ++ch) { |
| 37 wrapped_bus->SetChannelData(0, audio_bus->channel(ch)); | 39 wrapped_bus->SetChannelData(0, audio_bus->channel(ch)); |
| 38 fake_callback_.Render(wrapped_bus.get(), 0, 0); | 40 fake_callback_.Render(wrapped_bus.get(), 0, 0); |
| 39 } | 41 } |
| 40 } | 42 } |
| 41 | 43 |
| 42 ~AudioHashTest() override {} | 44 ~AudioHashTest() override {} |
| 43 | 45 |
| 44 protected: | 46 protected: |
| 45 scoped_ptr<AudioBus> bus_one_; | 47 std::unique_ptr<AudioBus> bus_one_; |
| 46 scoped_ptr<AudioBus> bus_two_; | 48 std::unique_ptr<AudioBus> bus_two_; |
| 47 FakeAudioRenderCallback fake_callback_; | 49 FakeAudioRenderCallback fake_callback_; |
| 48 | 50 |
| 49 DISALLOW_COPY_AND_ASSIGN(AudioHashTest); | 51 DISALLOW_COPY_AND_ASSIGN(AudioHashTest); |
| 50 }; | 52 }; |
| 51 | 53 |
| 52 // Ensure the same data hashes the same. | 54 // Ensure the same data hashes the same. |
| 53 TEST_F(AudioHashTest, Equivalence) { | 55 TEST_F(AudioHashTest, Equivalence) { |
| 54 AudioHash hash_one; | 56 AudioHash hash_one; |
| 55 hash_one.Update(bus_one_.get(), bus_one_->frames()); | 57 hash_one.Update(bus_one_.get(), bus_one_->frames()); |
| 56 | 58 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 74 EXPECT_NE(original_hash.ToString(), swapped_hash.ToString()); | 76 EXPECT_NE(original_hash.ToString(), swapped_hash.ToString()); |
| 75 } | 77 } |
| 76 | 78 |
| 77 // Ensure channel order matters to the hash. | 79 // Ensure channel order matters to the hash. |
| 78 TEST_F(AudioHashTest, ChannelOrder) { | 80 TEST_F(AudioHashTest, ChannelOrder) { |
| 79 AudioHash original_hash; | 81 AudioHash original_hash; |
| 80 original_hash.Update(bus_one_.get(), bus_one_->frames()); | 82 original_hash.Update(bus_one_.get(), bus_one_->frames()); |
| 81 | 83 |
| 82 // Reverse channel order for the same sample data. | 84 // Reverse channel order for the same sample data. |
| 83 const int channels = bus_one_->channels(); | 85 const int channels = bus_one_->channels(); |
| 84 scoped_ptr<AudioBus> swapped_ch_bus = AudioBus::CreateWrapper(channels); | 86 std::unique_ptr<AudioBus> swapped_ch_bus = AudioBus::CreateWrapper(channels); |
| 85 swapped_ch_bus->set_frames(bus_one_->frames()); | 87 swapped_ch_bus->set_frames(bus_one_->frames()); |
| 86 for (int i = channels - 1; i >= 0; --i) | 88 for (int i = channels - 1; i >= 0; --i) |
| 87 swapped_ch_bus->SetChannelData(channels - (i + 1), bus_one_->channel(i)); | 89 swapped_ch_bus->SetChannelData(channels - (i + 1), bus_one_->channel(i)); |
| 88 | 90 |
| 89 AudioHash swapped_hash; | 91 AudioHash swapped_hash; |
| 90 swapped_hash.Update(swapped_ch_bus.get(), swapped_ch_bus->frames()); | 92 swapped_hash.Update(swapped_ch_bus.get(), swapped_ch_bus->frames()); |
| 91 | 93 |
| 92 EXPECT_NE(original_hash.ToString(), swapped_hash.ToString()); | 94 EXPECT_NE(original_hash.ToString(), swapped_hash.ToString()); |
| 93 } | 95 } |
| 94 | 96 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 125 TEST_F(AudioHashTest, HashIgnoresUpdateOrder) { | 127 TEST_F(AudioHashTest, HashIgnoresUpdateOrder) { |
| 126 AudioHash full_hash; | 128 AudioHash full_hash; |
| 127 full_hash.Update(bus_one_.get(), bus_one_->frames()); | 129 full_hash.Update(bus_one_.get(), bus_one_->frames()); |
| 128 | 130 |
| 129 AudioHash half_hash; | 131 AudioHash half_hash; |
| 130 half_hash.Update(bus_one_.get(), bus_one_->frames() / 2); | 132 half_hash.Update(bus_one_.get(), bus_one_->frames() / 2); |
| 131 | 133 |
| 132 // Create a new bus representing the second half of |bus_one_|. | 134 // Create a new bus representing the second half of |bus_one_|. |
| 133 const int half_frames = bus_one_->frames() / 2; | 135 const int half_frames = bus_one_->frames() / 2; |
| 134 const int channels = bus_one_->channels(); | 136 const int channels = bus_one_->channels(); |
| 135 scoped_ptr<AudioBus> half_bus = AudioBus::CreateWrapper(channels); | 137 std::unique_ptr<AudioBus> half_bus = AudioBus::CreateWrapper(channels); |
| 136 half_bus->set_frames(half_frames); | 138 half_bus->set_frames(half_frames); |
| 137 for (int i = 0; i < channels; ++i) | 139 for (int i = 0; i < channels; ++i) |
| 138 half_bus->SetChannelData(i, bus_one_->channel(i) + half_frames); | 140 half_bus->SetChannelData(i, bus_one_->channel(i) + half_frames); |
| 139 | 141 |
| 140 half_hash.Update(half_bus.get(), half_bus->frames()); | 142 half_hash.Update(half_bus.get(), half_bus->frames()); |
| 141 EXPECT_EQ(full_hash.ToString(), half_hash.ToString()); | 143 EXPECT_EQ(full_hash.ToString(), half_hash.ToString()); |
| 142 } | 144 } |
| 143 | 145 |
| 144 // Ensure approximate hashes pass verification. | 146 // Ensure approximate hashes pass verification. |
| 145 TEST_F(AudioHashTest, VerifySimilarHash) { | 147 TEST_F(AudioHashTest, VerifySimilarHash) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 159 // Twiddle the values too much... | 161 // Twiddle the values too much... |
| 160 for (int i = 0; i < bus_one_->frames(); ++i) | 162 for (int i = 0; i < bus_one_->frames(); ++i) |
| 161 channel[i] += 0.0001f; | 163 channel[i] += 0.0001f; |
| 162 | 164 |
| 163 AudioHash hash_three; | 165 AudioHash hash_three; |
| 164 hash_three.Update(bus_one_.get(), bus_one_->frames()); | 166 hash_three.Update(bus_one_.get(), bus_one_->frames()); |
| 165 EXPECT_NE(hash_one.ToString(), hash_three.ToString()); | 167 EXPECT_NE(hash_one.ToString(), hash_three.ToString()); |
| 166 } | 168 } |
| 167 | 169 |
| 168 } // namespace media | 170 } // namespace media |
| OLD | NEW |