| Index: media/base/audio_block_fifo_unittest.cc
|
| diff --git a/media/base/audio_block_fifo_unittest.cc b/media/base/audio_block_fifo_unittest.cc
|
| index 8e8b5e071521896dfc2e0ef953ef1f1e02125165..e12167cf4fd1beec8d7d6df30d79887a7e1ab197 100644
|
| --- a/media/base/audio_block_fifo_unittest.cc
|
| +++ b/media/base/audio_block_fifo_unittest.cc
|
| @@ -2,6 +2,8 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include "base/time/time.h"
|
| +#include "media/audio/audio_power_monitor.h"
|
| #include "media/base/audio_block_fifo.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -14,14 +16,9 @@ class AudioBlockFifoTest : public testing::Test {
|
|
|
| void PushAndVerify(AudioBlockFifo* fifo, int frames_to_push,
|
| int channels, int block_frames, int max_frames) {
|
| - const int bytes_per_sample = 2;
|
| - const int data_byte_size = bytes_per_sample * channels * frames_to_push;
|
| - scoped_ptr<uint8[]> data(new uint8[data_byte_size]);
|
| - memset(data.get(), 0, data_byte_size);
|
| -
|
| for (int filled_frames = max_frames - fifo->GetUnfilledFrames();
|
| filled_frames + frames_to_push <= max_frames;) {
|
| - fifo->Push(data.get(), frames_to_push, bytes_per_sample);
|
| + Push(fifo, frames_to_push, channels);
|
| filled_frames += frames_to_push;
|
| EXPECT_EQ(max_frames - filled_frames, fifo->GetUnfilledFrames());
|
| EXPECT_EQ(static_cast<int>(filled_frames / block_frames),
|
| @@ -29,6 +26,28 @@ class AudioBlockFifoTest : public testing::Test {
|
| }
|
| }
|
|
|
| + void Push(AudioBlockFifo* fifo, int frames_to_push, int channels) {
|
| + DCHECK_LE(frames_to_push, fifo->GetUnfilledFrames());
|
| + const int bytes_per_sample = 2;
|
| + const int data_byte_size = bytes_per_sample * channels * frames_to_push;
|
| + scoped_ptr<uint8[]> data(new uint8[data_byte_size]);
|
| + memset(data.get(), 1, data_byte_size);
|
| + fifo->Push(data.get(), frames_to_push, bytes_per_sample);
|
| + }
|
| +
|
| + void ConsumeAndVerify(AudioBlockFifo* fifo, int expected_unfilled_frames,
|
| + int expected_available_blocks) {
|
| + const AudioBus* bus = fifo->Consume();
|
| + EXPECT_EQ(fifo->GetUnfilledFrames(), expected_unfilled_frames);
|
| + EXPECT_EQ(fifo->available_blocks(), expected_available_blocks);
|
| +
|
| + // Verify the audio data is not 0.
|
| + for (int i = 0; i < bus->channels(); ++i) {
|
| + EXPECT_GT(bus->channel(i)[0], 0.0f);
|
| + EXPECT_GT(bus->channel(i)[bus->frames() - 1], 0.0f);
|
| + }
|
| + }
|
| +
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(AudioBlockFifoTest);
|
| };
|
| @@ -146,4 +165,62 @@ TEST_F(AudioBlockFifoTest, PushAndConsumeOneBlockFifo) {
|
| EXPECT_TRUE(fifo.GetUnfilledFrames() == frames);
|
| }
|
|
|
| +// Dynamically increase the capacity of FIFO and verify buffers are correct.
|
| +TEST_F(AudioBlockFifoTest, DynamicallyIncreaseCapacity) {
|
| + // Create a FIFO with default blocks of buffers.
|
| + const int channels = 2;
|
| + const int frames = 441;
|
| + const int default_blocks = 2;
|
| + AudioBlockFifo fifo(channels, frames, default_blocks);
|
| + Push(&fifo, frames, channels);
|
| + int expected_unfilled_frames = frames;
|
| + int expected_available_blocks = 1;
|
| + EXPECT_EQ(expected_unfilled_frames, fifo.GetUnfilledFrames());
|
| + EXPECT_EQ(expected_available_blocks, fifo.available_blocks());
|
| +
|
| + // Increase the capacity dynamically for the first time.
|
| + const int new_blocks_1 = 3;
|
| + fifo.IncreaseCapacity(new_blocks_1);
|
| + expected_unfilled_frames += new_blocks_1 * frames;
|
| + EXPECT_EQ(fifo.GetUnfilledFrames(), expected_unfilled_frames);
|
| + EXPECT_EQ(fifo.available_blocks(), expected_available_blocks);
|
| +
|
| + // Verify the previous buffer is not affected by the dynamic capacity
|
| + // increment.
|
| + expected_unfilled_frames += frames;
|
| + expected_available_blocks -= 1;
|
| + ConsumeAndVerify(&fifo, expected_unfilled_frames, expected_available_blocks);
|
| +
|
| + // Fill another |new_blocks_1 + 0.5| blocks of data to the FIFO.
|
| + const int frames_to_push = static_cast<int>((new_blocks_1 + 0.5) * frames);
|
| + int max_frames = frames * (default_blocks + new_blocks_1);
|
| + Push(&fifo, frames_to_push, channels);
|
| + expected_unfilled_frames = max_frames - frames_to_push;
|
| + expected_available_blocks = new_blocks_1;
|
| + EXPECT_EQ(fifo.GetUnfilledFrames(), expected_unfilled_frames);
|
| + EXPECT_EQ(fifo.available_blocks(), expected_available_blocks);
|
| +
|
| + // Increase the capacity dynamically for the second time.
|
| + const int new_blocks_2 = 2;
|
| + fifo.IncreaseCapacity(new_blocks_2);
|
| + max_frames += new_blocks_2 * frames;
|
| + expected_unfilled_frames += new_blocks_2 * frames;
|
| + EXPECT_EQ(fifo.GetUnfilledFrames(), expected_unfilled_frames);
|
| + EXPECT_EQ(fifo.available_blocks(), expected_available_blocks);
|
| +
|
| + // Verify the previous buffers are not affected by the dynamic capacity
|
| + // increment.
|
| + while (fifo.available_blocks()) {
|
| + expected_unfilled_frames += frames;
|
| + expected_available_blocks -= 1;
|
| + ConsumeAndVerify(&fifo, expected_unfilled_frames,
|
| + expected_available_blocks);
|
| + }
|
| +
|
| + // Fill up one block of buffer and consume it, FIFO should then be empty.
|
| + const int available_frames = max_frames - expected_unfilled_frames;
|
| + Push(&fifo, frames - available_frames, channels);
|
| + ConsumeAndVerify(&fifo, max_frames, 0);
|
| +}
|
| +
|
| } // namespace media
|
|
|