diff options
author | dalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-21 02:02:25 +0000 |
---|---|---|
committer | dalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-21 02:02:25 +0000 |
commit | b71425cacfff96ab684d2b4b60264a28909c32a4 (patch) | |
tree | 995b66982c15a20497107d50de0d04a87a8feeb7 /media/base/audio_hash.cc | |
parent | 50f8cee8c56efe19ce971efaaf6c2cf014056f3a (diff) | |
download | chromium_src-b71425cacfff96ab684d2b4b60264a28909c32a4.zip chromium_src-b71425cacfff96ab684d2b4b60264a28909c32a4.tar.gz chromium_src-b71425cacfff96ab684d2b4b60264a28909c32a4.tar.bz2 |
Ensure audio hash handles H([0,1]) == H(0) -> H(1).
Found by valgrind when NullAudioSink recieved varying amounts of frames
due to tooling overhead slowing down the decode stage.
BUG=168204, 222490
TEST=new unittest. passes valgrind.
Review URL: https://codereview.chromium.org/12966005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@189494 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base/audio_hash.cc')
-rw-r--r-- | media/base/audio_hash.cc | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/media/base/audio_hash.cc b/media/base/audio_hash.cc index 5cea0c3..7f86a04 100644 --- a/media/base/audio_hash.cc +++ b/media/base/audio_hash.cc @@ -15,30 +15,32 @@ namespace media { AudioHash::AudioHash() : audio_hash_(), - hash_count_(0) { + sample_count_(0) { COMPILE_ASSERT(arraysize(audio_hash_) == kHashBuckets, audio_hash_size_error); } AudioHash::~AudioHash() {} void AudioHash::Update(const AudioBus* audio_bus, int frames) { - for (int ch = 0; ch < audio_bus->channels(); ++ch) { + // Use uint32 to ensure overflow is a defined operation. + for (uint32 ch = 0; ch < static_cast<uint32>(audio_bus->channels()); ++ch) { const float* channel = audio_bus->channel(ch); - for (int i = 0; i < frames; ++i) { - const int kHashIndex = - (i * (ch + 1) + hash_count_) % arraysize(audio_hash_); + for (uint32 i = 0; i < static_cast<uint32>(frames); ++i) { + const uint32 kSampleIndex = sample_count_ + i; + const uint32 kHashIndex = (kSampleIndex * (ch + 1)) % kHashBuckets; // Mix in a sine wave with the result so we ensure that sequences of empty // buffers don't result in an empty hash. if (ch == 0) { - audio_hash_[kHashIndex] += channel[i] + sin(2.0 * M_PI * M_PI * i); + audio_hash_[kHashIndex] += + channel[i] + sin(2.0 * M_PI * M_PI * kSampleIndex); } else { audio_hash_[kHashIndex] += channel[i]; } } } - ++hash_count_; + sample_count_ += static_cast<uint32>(frames); } std::string AudioHash::ToString() const { |