summaryrefslogtreecommitdiffstats
path: root/media/base/audio_hash.cc
diff options
context:
space:
mode:
authordalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-21 02:02:25 +0000
committerdalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-21 02:02:25 +0000
commitb71425cacfff96ab684d2b4b60264a28909c32a4 (patch)
tree995b66982c15a20497107d50de0d04a87a8feeb7 /media/base/audio_hash.cc
parent50f8cee8c56efe19ce971efaaf6c2cf014056f3a (diff)
downloadchromium_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.cc16
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 {