| Index: media/base/audio_buffer_converter_unittest.cc
 | 
| diff --git a/media/base/audio_buffer_converter_unittest.cc b/media/base/audio_buffer_converter_unittest.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..80567cf990f1527e271e00c473f15600be8036c7
 | 
| --- /dev/null
 | 
| +++ b/media/base/audio_buffer_converter_unittest.cc
 | 
| @@ -0,0 +1,186 @@
 | 
| +// Copyright 2014 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#include "base/memory/scoped_ptr.h"
 | 
| +#include "media/base/audio_buffer.h"
 | 
| +#include "media/base/audio_buffer_converter.h"
 | 
| +#include "media/base/sinc_resampler.h"
 | 
| +#include "media/base/test_helpers.h"
 | 
| +#include "testing/gmock/include/gmock/gmock.h"
 | 
| +#include "testing/gtest/include/gtest/gtest.h"
 | 
| +
 | 
| +namespace media {
 | 
| +
 | 
| +const int kOutSampleRate = 44100;
 | 
| +const ChannelLayout kOutChannelLayout = CHANNEL_LAYOUT_STEREO;
 | 
| +
 | 
| +static scoped_refptr<AudioBuffer> MakeTestBuffer(int sample_rate,
 | 
| +                                                 ChannelLayout channel_layout,
 | 
| +                                                 int frames) {
 | 
| +  return MakeAudioBuffer<uint8>(kSampleFormatU8,
 | 
| +                                channel_layout,
 | 
| +                                sample_rate,
 | 
| +                                0,
 | 
| +                                1,
 | 
| +                                frames,
 | 
| +                                base::TimeDelta::FromSeconds(0),
 | 
| +                                base::TimeDelta::FromSeconds(0));
 | 
| +}
 | 
| +
 | 
| +class AudioBufferConverterTest : public ::testing::Test {
 | 
| + public:
 | 
| +  AudioBufferConverterTest()
 | 
| +      : input_frames_(0), expected_output_frames_(0.0), output_frames_(0) {
 | 
| +    AudioParameters output_params(AudioParameters::AUDIO_PCM_LOW_LATENCY,
 | 
| +                                  kOutChannelLayout,
 | 
| +                                  kOutSampleRate,
 | 
| +                                  16,
 | 
| +                                  512);
 | 
| +    audio_buffer_converter_.reset(new AudioBufferConverter(output_params));
 | 
| +  }
 | 
| +
 | 
| +  void Reset() {
 | 
| +    audio_buffer_converter_->Reset();
 | 
| +    output_frames_ = expected_output_frames_ = input_frames_ = 0;
 | 
| +  }
 | 
| +
 | 
| +  void AddInput(const scoped_refptr<AudioBuffer>& in) {
 | 
| +    if (!in->end_of_stream()) {
 | 
| +      input_frames_ += in->frame_count();
 | 
| +      expected_output_frames_ +=
 | 
| +          in->frame_count() *
 | 
| +          (static_cast<double>(kOutSampleRate) / in->sample_rate());
 | 
| +    }
 | 
| +    audio_buffer_converter_->AddInput(in);
 | 
| +  }
 | 
| +
 | 
| +  void ConsumeAllOutput() {
 | 
| +    AddInput(AudioBuffer::CreateEOSBuffer());
 | 
| +    while (audio_buffer_converter_->HasNextBuffer()) {
 | 
| +      scoped_refptr<AudioBuffer> out = audio_buffer_converter_->GetNextBuffer();
 | 
| +      if (!out->end_of_stream()) {
 | 
| +        output_frames_ += out->frame_count();
 | 
| +        EXPECT_EQ(out->sample_rate(), kOutSampleRate);
 | 
| +        EXPECT_EQ(out->channel_layout(), kOutChannelLayout);
 | 
| +      } else {
 | 
| +        EXPECT_FALSE(audio_buffer_converter_->HasNextBuffer());
 | 
| +      }
 | 
| +    }
 | 
| +    EXPECT_EQ(output_frames_, ceil(expected_output_frames_));
 | 
| +  }
 | 
| +
 | 
| + private:
 | 
| +  scoped_ptr<AudioBufferConverter> audio_buffer_converter_;
 | 
| +
 | 
| +  int input_frames_;
 | 
| +  double expected_output_frames_;
 | 
| +  int output_frames_;
 | 
| +};
 | 
| +
 | 
| +TEST_F(AudioBufferConverterTest, PassThrough) {
 | 
| +  scoped_refptr<AudioBuffer> in =
 | 
| +      MakeTestBuffer(kOutSampleRate, kOutChannelLayout, 512);
 | 
| +  AddInput(in);
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +TEST_F(AudioBufferConverterTest, Downsample) {
 | 
| +  scoped_refptr<AudioBuffer> in = MakeTestBuffer(48000, kOutChannelLayout, 512);
 | 
| +  AddInput(in);
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +TEST_F(AudioBufferConverterTest, Upsample) {
 | 
| +  scoped_refptr<AudioBuffer> in = MakeTestBuffer(8000, kOutChannelLayout, 512);
 | 
| +  AddInput(in);
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +// Test resampling a buffer smaller than the SincResampler's kernel size.
 | 
| +TEST_F(AudioBufferConverterTest, Resample_TinyBuffer) {
 | 
| +  AddInput(MakeTestBuffer(
 | 
| +      48000, CHANNEL_LAYOUT_STEREO, SincResampler::kKernelSize - 1));
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +TEST_F(AudioBufferConverterTest, Resample_DifferingBufferSizes) {
 | 
| +  const int input_sample_rate = 48000;
 | 
| +  AddInput(MakeTestBuffer(input_sample_rate, kOutChannelLayout, 100));
 | 
| +  AddInput(MakeTestBuffer(input_sample_rate, kOutChannelLayout, 200));
 | 
| +  AddInput(MakeTestBuffer(input_sample_rate, kOutChannelLayout, 300));
 | 
| +  AddInput(MakeTestBuffer(input_sample_rate, kOutChannelLayout, 400));
 | 
| +  AddInput(MakeTestBuffer(input_sample_rate, kOutChannelLayout, 500));
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +TEST_F(AudioBufferConverterTest, ChannelDownmix) {
 | 
| +  scoped_refptr<AudioBuffer> in =
 | 
| +      MakeTestBuffer(kOutSampleRate, CHANNEL_LAYOUT_MONO, 512);
 | 
| +  AddInput(in);
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +TEST_F(AudioBufferConverterTest, ChannelUpmix) {
 | 
| +  scoped_refptr<AudioBuffer> in =
 | 
| +      MakeTestBuffer(kOutSampleRate, CHANNEL_LAYOUT_5_1, 512);
 | 
| +  AddInput(in);
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +TEST_F(AudioBufferConverterTest, ResampleAndRemix) {
 | 
| +  scoped_refptr<AudioBuffer> in =
 | 
| +      MakeTestBuffer(48000, CHANNEL_LAYOUT_5_1, 512);
 | 
| +  AddInput(in);
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +TEST_F(AudioBufferConverterTest, ConfigChange_SampleRate) {
 | 
| +  AddInput(MakeTestBuffer(48000, kOutChannelLayout, 512));
 | 
| +  AddInput(MakeTestBuffer(44100, kOutChannelLayout, 512));
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +TEST_F(AudioBufferConverterTest, ConfigChange_ChannelLayout) {
 | 
| +  AddInput(MakeTestBuffer(kOutSampleRate, CHANNEL_LAYOUT_STEREO, 512));
 | 
| +  AddInput(MakeTestBuffer(kOutSampleRate, CHANNEL_LAYOUT_MONO, 512));
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +TEST_F(AudioBufferConverterTest, ConfigChange_SampleRateAndChannelLayout) {
 | 
| +  AddInput(MakeTestBuffer(44100, CHANNEL_LAYOUT_STEREO, 512));
 | 
| +  AddInput(MakeTestBuffer(48000, CHANNEL_LAYOUT_MONO, 512));
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +TEST_F(AudioBufferConverterTest, ConfigChange_Multiple) {
 | 
| +  AddInput(MakeTestBuffer(44100, CHANNEL_LAYOUT_STEREO, 512));
 | 
| +  AddInput(MakeTestBuffer(48000, CHANNEL_LAYOUT_MONO, 512));
 | 
| +  AddInput(MakeTestBuffer(44100, CHANNEL_LAYOUT_5_1, 512));
 | 
| +  AddInput(MakeTestBuffer(22050, CHANNEL_LAYOUT_STEREO, 512));
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +TEST_F(AudioBufferConverterTest, Reset) {
 | 
| +  AddInput(MakeTestBuffer(44100, CHANNEL_LAYOUT_STEREO, 512));
 | 
| +  Reset();
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +TEST_F(AudioBufferConverterTest, ResampleThenReset) {
 | 
| +  // Resampling is likely to leave some data buffered in AudioConverter's
 | 
| +  // fifo or resampler, so make sure Reset() cleans that all up.
 | 
| +  AddInput(MakeTestBuffer(48000, CHANNEL_LAYOUT_STEREO, 512));
 | 
| +  Reset();
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +TEST_F(AudioBufferConverterTest, ResetThenConvert) {
 | 
| +  AddInput(MakeTestBuffer(kOutSampleRate, kOutChannelLayout, 512));
 | 
| +  Reset();
 | 
| +  // Make sure we can keep using the AudioBufferConverter after we've Reset().
 | 
| +  AddInput(MakeTestBuffer(kOutSampleRate, kOutChannelLayout, 512));
 | 
| +  ConsumeAllOutput();
 | 
| +}
 | 
| +
 | 
| +}  // namespace media
 | 
| 
 |