| Index: media/filters/audio_clock_unittest.cc
|
| diff --git a/media/filters/audio_clock_unittest.cc b/media/filters/audio_clock_unittest.cc
|
| index 303e8e34573bfe8eec4043de6fa804bcef542c7f..312ba61d73ddd651511ad6f4fcd3958f75936e37 100644
|
| --- a/media/filters/audio_clock_unittest.cc
|
| +++ b/media/filters/audio_clock_unittest.cc
|
| @@ -3,6 +3,7 @@
|
| // found in the LICENSE file.
|
|
|
| #include "base/macros.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| #include "media/base/audio_timestamp_helper.h"
|
| #include "media/filters/audio_clock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| @@ -11,8 +12,7 @@ namespace media {
|
|
|
| class AudioClockTest : public testing::Test {
|
| public:
|
| - AudioClockTest()
|
| - : sample_rate_(10), clock_(base::TimeDelta(), sample_rate_) {}
|
| + AudioClockTest() { SetupClock(base::TimeDelta(), 10); }
|
|
|
| ~AudioClockTest() override {}
|
|
|
| @@ -20,45 +20,51 @@ class AudioClockTest : public testing::Test {
|
| int frames_requested,
|
| int delay_frames,
|
| double playback_rate) {
|
| - clock_.WroteAudio(
|
| - frames_written, frames_requested, delay_frames, playback_rate);
|
| + clock_->WroteAudio(frames_written, frames_requested, delay_frames,
|
| + playback_rate);
|
| }
|
|
|
| - int FrontTimestampInDays() { return clock_.front_timestamp().InDays(); }
|
| + void SetupClock(base::TimeDelta start_time, int sample_rate) {
|
| + sample_rate_ = sample_rate;
|
| + clock_.reset(new AudioClock(start_time, sample_rate_));
|
| + }
|
| +
|
| + int FrontTimestampInDays() { return clock_->front_timestamp().InDays(); }
|
|
|
| int FrontTimestampInMilliseconds() {
|
| - return clock_.front_timestamp().InMilliseconds();
|
| + return clock_->front_timestamp().InMilliseconds();
|
| }
|
|
|
| int BackTimestampInMilliseconds() {
|
| - return clock_.back_timestamp().InMilliseconds();
|
| + return clock_->back_timestamp().InMilliseconds();
|
| }
|
|
|
| int TimeUntilPlaybackInMilliseconds(int timestamp_ms) {
|
| - return clock_.TimeUntilPlayback(base::TimeDelta::FromMilliseconds(
|
| - timestamp_ms)).InMilliseconds();
|
| + return clock_
|
| + ->TimeUntilPlayback(base::TimeDelta::FromMilliseconds(timestamp_ms))
|
| + .InMilliseconds();
|
| }
|
|
|
| int ContiguousAudioDataBufferedInDays() {
|
| base::TimeDelta total, same_rate_total;
|
| - clock_.ContiguousAudioDataBufferedForTesting(&total, &same_rate_total);
|
| + clock_->ContiguousAudioDataBufferedForTesting(&total, &same_rate_total);
|
| return total.InDays();
|
| }
|
|
|
| int ContiguousAudioDataBufferedInMilliseconds() {
|
| base::TimeDelta total, same_rate_total;
|
| - clock_.ContiguousAudioDataBufferedForTesting(&total, &same_rate_total);
|
| + clock_->ContiguousAudioDataBufferedForTesting(&total, &same_rate_total);
|
| return total.InMilliseconds();
|
| }
|
|
|
| int ContiguousAudioDataBufferedAtSameRateInMilliseconds() {
|
| base::TimeDelta total, same_rate_total;
|
| - clock_.ContiguousAudioDataBufferedForTesting(&total, &same_rate_total);
|
| + clock_->ContiguousAudioDataBufferedForTesting(&total, &same_rate_total);
|
| return same_rate_total.InMilliseconds();
|
| }
|
|
|
| - const int sample_rate_;
|
| - AudioClock clock_;
|
| + int sample_rate_;
|
| + scoped_ptr<AudioClock> clock_;
|
|
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(AudioClockTest);
|
| @@ -337,8 +343,8 @@ TEST_F(AudioClockTest, CompensateForSuspendedWrites) {
|
| // Elapsing frames less than we have buffered should do nothing.
|
| const int kDelayFrames = 2;
|
| for (int i = 1000; i <= kBaseTimeMs; i += 1000) {
|
| - clock_.CompensateForSuspendedWrites(base::TimeDelta::FromMilliseconds(i),
|
| - kDelayFrames);
|
| + clock_->CompensateForSuspendedWrites(base::TimeDelta::FromMilliseconds(i),
|
| + kDelayFrames);
|
| EXPECT_EQ(kBaseTimeMs - (i - 1000), TimeUntilPlaybackInMilliseconds(0));
|
|
|
| // Write silence to simulate maintaining a 7s output buffer.
|
| @@ -347,9 +353,26 @@ TEST_F(AudioClockTest, CompensateForSuspendedWrites) {
|
|
|
| // Exhausting all frames should advance timestamps and prime the buffer with
|
| // our delay frames value.
|
| - clock_.CompensateForSuspendedWrites(base::TimeDelta::FromMilliseconds(7000),
|
| - kDelayFrames);
|
| + clock_->CompensateForSuspendedWrites(base::TimeDelta::FromMilliseconds(7000),
|
| + kDelayFrames);
|
| EXPECT_EQ(kDelayFrames * 100, TimeUntilPlaybackInMilliseconds(1000));
|
| }
|
|
|
| +TEST_F(AudioClockTest, FramesToTimePrecision) {
|
| + SetupClock(base::TimeDelta(), 48000);
|
| + double micros_per_frame = base::Time::kMicrosecondsPerSecond / 48000.0;
|
| + int frames_written = 0;
|
| +
|
| + // Write ~2 hours of data to clock to give any error a significant chance to
|
| + // accumulate.
|
| + while (clock_->back_timestamp() <= base::TimeDelta::FromHours(2)) {
|
| + frames_written += 1024;
|
| + WroteAudio(1024, 1024, 0, 1);
|
| + }
|
| +
|
| + // Verify no error accumulated.
|
| + EXPECT_EQ(std::round(frames_written * micros_per_frame),
|
| + clock_->back_timestamp().InMicroseconds());
|
| +}
|
| +
|
| } // namespace media
|
|
|