summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/renderer/pepper/content_decryptor_delegate.cc1
-rw-r--r--media/base/audio_buffer.cc13
-rw-r--r--media/base/audio_buffer.h4
-rw-r--r--media/base/audio_buffer_converter.cc1
-rw-r--r--media/base/audio_buffer_converter_unittest.cc96
-rw-r--r--media/base/audio_buffer_queue_unittest.cc3
-rw-r--r--media/base/audio_buffer_unittest.cc29
-rw-r--r--media/base/audio_splicer.cc2
-rw-r--r--media/base/audio_splicer_unittest.cc2
-rw-r--r--media/base/test_helpers.cc6
-rw-r--r--media/base/test_helpers.h1
-rw-r--r--media/filters/audio_renderer_algorithm_unittest.cc57
-rw-r--r--media/filters/audio_renderer_impl_unittest.cc2
-rw-r--r--media/filters/decrypting_audio_decoder_unittest.cc9
-rw-r--r--media/filters/ffmpeg_audio_decoder.cc1
-rw-r--r--media/filters/opus_audio_decoder.cc10
16 files changed, 167 insertions, 70 deletions
diff --git a/content/renderer/pepper/content_decryptor_delegate.cc b/content/renderer/pepper/content_decryptor_delegate.cc
index 27ff3c82..aea22ba 100644
--- a/content/renderer/pepper/content_decryptor_delegate.cc
+++ b/content/renderer/pepper/content_decryptor_delegate.cc
@@ -1024,6 +1024,7 @@ bool ContentDecryptorDelegate::DeserializeAudioFrames(
scoped_refptr<media::AudioBuffer> frame = media::AudioBuffer::CopyFrom(
sample_format,
audio_channel_layout_,
+ audio_channel_count_,
audio_samples_per_second_,
frame_count,
&channel_ptrs[0],
diff --git a/media/base/audio_buffer.cc b/media/base/audio_buffer.cc
index eba658b..4b972b9 100644
--- a/media/base/audio_buffer.cc
+++ b/media/base/audio_buffer.cc
@@ -13,6 +13,7 @@ namespace media {
AudioBuffer::AudioBuffer(SampleFormat sample_format,
ChannelLayout channel_layout,
+ int channel_count,
int sample_rate,
int frame_count,
bool create_buffer,
@@ -21,7 +22,7 @@ AudioBuffer::AudioBuffer(SampleFormat sample_format,
const base::TimeDelta duration)
: sample_format_(sample_format),
channel_layout_(channel_layout),
- channel_count_(ChannelLayoutToChannelCount(channel_layout)),
+ channel_count_(channel_count),
sample_rate_(sample_rate),
adjusted_frame_count_(frame_count),
trim_start_(0),
@@ -31,6 +32,9 @@ AudioBuffer::AudioBuffer(SampleFormat sample_format,
CHECK_GE(channel_count_, 0);
CHECK_LE(channel_count_, limits::kMaxChannels);
CHECK_GE(frame_count, 0);
+ DCHECK(channel_layout == CHANNEL_LAYOUT_DISCRETE ||
+ ChannelLayoutToChannelCount(channel_layout) == channel_count);
+
int bytes_per_channel = SampleFormatToBytesPerChannel(sample_format);
DCHECK_LE(bytes_per_channel, kChannelAlignment);
int data_size = frame_count * bytes_per_channel;
@@ -83,6 +87,7 @@ AudioBuffer::~AudioBuffer() {}
scoped_refptr<AudioBuffer> AudioBuffer::CopyFrom(
SampleFormat sample_format,
ChannelLayout channel_layout,
+ int channel_count,
int sample_rate,
int frame_count,
const uint8* const* data,
@@ -93,6 +98,7 @@ scoped_refptr<AudioBuffer> AudioBuffer::CopyFrom(
CHECK(data[0]);
return make_scoped_refptr(new AudioBuffer(sample_format,
channel_layout,
+ channel_count,
sample_rate,
frame_count,
true,
@@ -105,11 +111,13 @@ scoped_refptr<AudioBuffer> AudioBuffer::CopyFrom(
scoped_refptr<AudioBuffer> AudioBuffer::CreateBuffer(
SampleFormat sample_format,
ChannelLayout channel_layout,
+ int channel_count,
int sample_rate,
int frame_count) {
CHECK_GT(frame_count, 0); // Otherwise looks like an EOF buffer.
return make_scoped_refptr(new AudioBuffer(sample_format,
channel_layout,
+ channel_count,
sample_rate,
frame_count,
true,
@@ -121,6 +129,7 @@ scoped_refptr<AudioBuffer> AudioBuffer::CreateBuffer(
// static
scoped_refptr<AudioBuffer> AudioBuffer::CreateEmptyBuffer(
ChannelLayout channel_layout,
+ int channel_count,
int sample_rate,
int frame_count,
const base::TimeDelta timestamp,
@@ -129,6 +138,7 @@ scoped_refptr<AudioBuffer> AudioBuffer::CreateEmptyBuffer(
// Since data == NULL, format doesn't matter.
return make_scoped_refptr(new AudioBuffer(kSampleFormatF32,
channel_layout,
+ channel_count,
sample_rate,
frame_count,
false,
@@ -143,6 +153,7 @@ scoped_refptr<AudioBuffer> AudioBuffer::CreateEOSBuffer() {
CHANNEL_LAYOUT_NONE,
0,
0,
+ 0,
false,
NULL,
kNoTimestamp(),
diff --git a/media/base/audio_buffer.h b/media/base/audio_buffer.h
index cd2047d..902407f 100644
--- a/media/base/audio_buffer.h
+++ b/media/base/audio_buffer.h
@@ -38,6 +38,7 @@ class MEDIA_EXPORT AudioBuffer
// TODO(jrummell): Compute duration rather than pass it in.
static scoped_refptr<AudioBuffer> CopyFrom(SampleFormat sample_format,
ChannelLayout channel_layout,
+ int channel_count,
int sample_rate,
int frame_count,
const uint8* const* data,
@@ -48,12 +49,14 @@ class MEDIA_EXPORT AudioBuffer
// not initialized. Timestamp and duration are set to kNoTimestamp().
static scoped_refptr<AudioBuffer> CreateBuffer(SampleFormat sample_format,
ChannelLayout channel_layout,
+ int channel_count,
int sample_rate,
int frame_count);
// Create an empty AudioBuffer with |frame_count| frames.
static scoped_refptr<AudioBuffer> CreateEmptyBuffer(
ChannelLayout channel_layout,
+ int channel_count,
int sample_rate,
int frame_count,
const base::TimeDelta timestamp,
@@ -123,6 +126,7 @@ class MEDIA_EXPORT AudioBuffer
// copied to).
AudioBuffer(SampleFormat sample_format,
ChannelLayout channel_layout,
+ int channel_count,
int sample_rate,
int frame_count,
bool create_buffer,
diff --git a/media/base/audio_buffer_converter.cc b/media/base/audio_buffer_converter.cc
index fd4ef43..e479b12 100644
--- a/media/base/audio_buffer_converter.cc
+++ b/media/base/audio_buffer_converter.cc
@@ -188,6 +188,7 @@ void AudioBufferConverter::ConvertIfPossible() {
scoped_refptr<AudioBuffer> output_buffer =
AudioBuffer::CreateBuffer(kSampleFormatPlanarF32,
output_params_.channel_layout(),
+ output_params_.channels(),
output_params_.sample_rate(),
request_frames);
scoped_ptr<AudioBus> output_bus =
diff --git a/media/base/audio_buffer_converter_unittest.cc b/media/base/audio_buffer_converter_unittest.cc
index 80567cf..032702e 100644
--- a/media/base/audio_buffer_converter_unittest.cc
+++ b/media/base/audio_buffer_converter_unittest.cc
@@ -14,12 +14,15 @@ namespace media {
const int kOutSampleRate = 44100;
const ChannelLayout kOutChannelLayout = CHANNEL_LAYOUT_STEREO;
+const int kOutChannelCount = 2;
static scoped_refptr<AudioBuffer> MakeTestBuffer(int sample_rate,
ChannelLayout channel_layout,
+ int channel_count,
int frames) {
return MakeAudioBuffer<uint8>(kSampleFormatU8,
channel_layout,
+ channel_count,
sample_rate,
0,
1,
@@ -37,7 +40,7 @@ class AudioBufferConverterTest : public ::testing::Test {
kOutSampleRate,
16,
512);
- audio_buffer_converter_.reset(new AudioBufferConverter(output_params));
+ ResetConverter(output_params);
}
void Reset() {
@@ -61,8 +64,9 @@ class AudioBufferConverterTest : public ::testing::Test {
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);
+ EXPECT_EQ(out->sample_rate(), out_sample_rate_);
+ EXPECT_EQ(out->channel_layout(), out_channel_layout_);
+ EXPECT_EQ(out->channel_count(), out_channel_count_);
} else {
EXPECT_FALSE(audio_buffer_converter_->HasNextBuffer());
}
@@ -70,29 +74,42 @@ class AudioBufferConverterTest : public ::testing::Test {
EXPECT_EQ(output_frames_, ceil(expected_output_frames_));
}
+ void ResetConverter(AudioParameters out_params) {
+ audio_buffer_converter_.reset(new AudioBufferConverter(out_params));
+ out_channel_layout_ = out_params.channel_layout();
+ out_channel_count_ = out_params.channels();
+ out_sample_rate_ = out_params.sample_rate();
+ }
+
private:
scoped_ptr<AudioBufferConverter> audio_buffer_converter_;
int input_frames_;
double expected_output_frames_;
int output_frames_;
+
+ int out_sample_rate_;
+ ChannelLayout out_channel_layout_;
+ int out_channel_count_;
};
TEST_F(AudioBufferConverterTest, PassThrough) {
scoped_refptr<AudioBuffer> in =
- MakeTestBuffer(kOutSampleRate, kOutChannelLayout, 512);
+ MakeTestBuffer(kOutSampleRate, kOutChannelLayout, kOutChannelCount, 512);
AddInput(in);
ConsumeAllOutput();
}
TEST_F(AudioBufferConverterTest, Downsample) {
- scoped_refptr<AudioBuffer> in = MakeTestBuffer(48000, kOutChannelLayout, 512);
+ scoped_refptr<AudioBuffer> in =
+ MakeTestBuffer(48000, kOutChannelLayout, kOutChannelCount, 512);
AddInput(in);
ConsumeAllOutput();
}
TEST_F(AudioBufferConverterTest, Upsample) {
- scoped_refptr<AudioBuffer> in = MakeTestBuffer(8000, kOutChannelLayout, 512);
+ scoped_refptr<AudioBuffer> in =
+ MakeTestBuffer(8000, kOutChannelLayout, kOutChannelCount, 512);
AddInput(in);
ConsumeAllOutput();
}
@@ -100,69 +117,74 @@ TEST_F(AudioBufferConverterTest, Upsample) {
// 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));
+ 48000, CHANNEL_LAYOUT_STEREO, 2, 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));
+ AddInput(MakeTestBuffer(
+ input_sample_rate, kOutChannelLayout, kOutChannelCount, 100));
+ AddInput(MakeTestBuffer(
+ input_sample_rate, kOutChannelLayout, kOutChannelCount, 200));
+ AddInput(MakeTestBuffer(
+ input_sample_rate, kOutChannelLayout, kOutChannelCount, 300));
+ AddInput(MakeTestBuffer(
+ input_sample_rate, kOutChannelLayout, kOutChannelCount, 400));
+ AddInput(MakeTestBuffer(
+ input_sample_rate, kOutChannelLayout, kOutChannelCount, 500));
ConsumeAllOutput();
}
TEST_F(AudioBufferConverterTest, ChannelDownmix) {
scoped_refptr<AudioBuffer> in =
- MakeTestBuffer(kOutSampleRate, CHANNEL_LAYOUT_MONO, 512);
+ MakeTestBuffer(kOutSampleRate, CHANNEL_LAYOUT_MONO, 1, 512);
AddInput(in);
ConsumeAllOutput();
}
TEST_F(AudioBufferConverterTest, ChannelUpmix) {
scoped_refptr<AudioBuffer> in =
- MakeTestBuffer(kOutSampleRate, CHANNEL_LAYOUT_5_1, 512);
+ MakeTestBuffer(kOutSampleRate, CHANNEL_LAYOUT_5_1, 6, 512);
AddInput(in);
ConsumeAllOutput();
}
TEST_F(AudioBufferConverterTest, ResampleAndRemix) {
scoped_refptr<AudioBuffer> in =
- MakeTestBuffer(48000, CHANNEL_LAYOUT_5_1, 512);
+ MakeTestBuffer(48000, CHANNEL_LAYOUT_5_1, 6, 512);
AddInput(in);
ConsumeAllOutput();
}
TEST_F(AudioBufferConverterTest, ConfigChange_SampleRate) {
- AddInput(MakeTestBuffer(48000, kOutChannelLayout, 512));
- AddInput(MakeTestBuffer(44100, kOutChannelLayout, 512));
+ AddInput(MakeTestBuffer(48000, kOutChannelLayout, kOutChannelCount, 512));
+ AddInput(MakeTestBuffer(44100, kOutChannelLayout, kOutChannelCount, 512));
ConsumeAllOutput();
}
TEST_F(AudioBufferConverterTest, ConfigChange_ChannelLayout) {
- AddInput(MakeTestBuffer(kOutSampleRate, CHANNEL_LAYOUT_STEREO, 512));
- AddInput(MakeTestBuffer(kOutSampleRate, CHANNEL_LAYOUT_MONO, 512));
+ AddInput(MakeTestBuffer(kOutSampleRate, CHANNEL_LAYOUT_STEREO, 2, 512));
+ AddInput(MakeTestBuffer(kOutSampleRate, CHANNEL_LAYOUT_MONO, 1, 512));
ConsumeAllOutput();
}
TEST_F(AudioBufferConverterTest, ConfigChange_SampleRateAndChannelLayout) {
- AddInput(MakeTestBuffer(44100, CHANNEL_LAYOUT_STEREO, 512));
- AddInput(MakeTestBuffer(48000, CHANNEL_LAYOUT_MONO, 512));
+ AddInput(MakeTestBuffer(44100, CHANNEL_LAYOUT_STEREO, 2, 512));
+ AddInput(MakeTestBuffer(48000, CHANNEL_LAYOUT_MONO, 1, 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));
+ AddInput(MakeTestBuffer(44100, CHANNEL_LAYOUT_STEREO, 2, 512));
+ AddInput(MakeTestBuffer(48000, CHANNEL_LAYOUT_MONO, 1, 512));
+ AddInput(MakeTestBuffer(44100, CHANNEL_LAYOUT_5_1, 6, 512));
+ AddInput(MakeTestBuffer(22050, CHANNEL_LAYOUT_STEREO, 2, 512));
ConsumeAllOutput();
}
TEST_F(AudioBufferConverterTest, Reset) {
- AddInput(MakeTestBuffer(44100, CHANNEL_LAYOUT_STEREO, 512));
+ AddInput(MakeTestBuffer(44100, CHANNEL_LAYOUT_STEREO, 2, 512));
Reset();
ConsumeAllOutput();
}
@@ -170,16 +192,32 @@ TEST_F(AudioBufferConverterTest, Reset) {
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));
+ AddInput(MakeTestBuffer(48000, CHANNEL_LAYOUT_STEREO, 2, 512));
Reset();
ConsumeAllOutput();
}
TEST_F(AudioBufferConverterTest, ResetThenConvert) {
- AddInput(MakeTestBuffer(kOutSampleRate, kOutChannelLayout, 512));
+ AddInput(
+ MakeTestBuffer(kOutSampleRate, kOutChannelLayout, kOutChannelCount, 512));
Reset();
// Make sure we can keep using the AudioBufferConverter after we've Reset().
- AddInput(MakeTestBuffer(kOutSampleRate, kOutChannelLayout, 512));
+ AddInput(
+ MakeTestBuffer(kOutSampleRate, kOutChannelLayout, kOutChannelCount, 512));
+ ConsumeAllOutput();
+}
+
+TEST_F(AudioBufferConverterTest, DiscreteChannelLayout) {
+ AudioParameters output_params(AudioParameters::AUDIO_PCM_LOW_LATENCY,
+ CHANNEL_LAYOUT_DISCRETE,
+ 2,
+ 0,
+ kOutSampleRate,
+ 16,
+ 512,
+ 0);
+ ResetConverter(output_params);
+ AddInput(MakeTestBuffer(kOutSampleRate, CHANNEL_LAYOUT_STEREO, 2, 512));
ConsumeAllOutput();
}
diff --git a/media/base/audio_buffer_queue_unittest.cc b/media/base/audio_buffer_queue_unittest.cc
index adbac75..fc04857 100644
--- a/media/base/audio_buffer_queue_unittest.cc
+++ b/media/base/audio_buffer_queue_unittest.cc
@@ -39,6 +39,7 @@ static scoped_refptr<AudioBuffer> MakeTestBuffer(SampleFormat format,
const base::TimeDelta kNoTime = kNoTimestamp();
return MakeAudioBuffer<T>(format,
channel_layout,
+ ChannelLayoutToChannelCount(channel_layout),
kSampleRate,
start,
end,
@@ -388,6 +389,7 @@ TEST(AudioBufferQueueTest, Time) {
// second: start=30s, duration=10s
buffer.Append(MakeAudioBuffer<int16>(kSampleFormatS16,
channel_layout,
+ channels,
kSampleRate,
1,
1,
@@ -412,6 +414,7 @@ TEST(AudioBufferQueueTest, Time) {
// Add second buffer for more data.
buffer.Append(MakeAudioBuffer<int16>(kSampleFormatS16,
channel_layout,
+ channels,
kSampleRate,
1,
1,
diff --git a/media/base/audio_buffer_unittest.cc b/media/base/audio_buffer_unittest.cc
index 55a67c8..c40c076 100644
--- a/media/base/audio_buffer_unittest.cc
+++ b/media/base/audio_buffer_unittest.cc
@@ -30,14 +30,16 @@ TEST(AudioBufferTest, CopyFrom) {
const int frames = 8;
const base::TimeDelta start_time;
const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames);
- scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<uint8>(kSampleFormatU8,
- channel_layout,
- kSampleRate,
- 1,
- 1,
- frames,
- start_time,
- duration);
+ scoped_refptr<AudioBuffer> buffer =
+ MakeAudioBuffer<uint8>(kSampleFormatU8,
+ channel_layout,
+ ChannelLayoutToChannelCount(channel_layout),
+ kSampleRate,
+ 1,
+ 1,
+ frames,
+ start_time,
+ duration);
EXPECT_EQ(frames, buffer->frame_count());
EXPECT_EQ(buffer->timestamp(), start_time);
EXPECT_EQ(buffer->duration().InSeconds(), frames);
@@ -60,6 +62,7 @@ TEST(AudioBufferTest, FrameSize) {
scoped_refptr<AudioBuffer> buffer =
AudioBuffer::CopyFrom(kSampleFormatU8,
CHANNEL_LAYOUT_STEREO,
+ 2,
kSampleRate,
16,
data,
@@ -69,6 +72,7 @@ TEST(AudioBufferTest, FrameSize) {
buffer = AudioBuffer::CopyFrom(kSampleFormatF32,
CHANNEL_LAYOUT_4_0,
+ 4,
kSampleRate,
2,
data,
@@ -85,6 +89,7 @@ TEST(AudioBufferTest, ReadU8) {
const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames);
scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<uint8>(kSampleFormatU8,
channel_layout,
+ channels,
kSampleRate,
128,
1,
@@ -112,6 +117,7 @@ TEST(AudioBufferTest, ReadS16) {
const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames);
scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<int16>(kSampleFormatS16,
channel_layout,
+ channels,
kSampleRate,
1,
1,
@@ -144,6 +150,7 @@ TEST(AudioBufferTest, ReadS32) {
const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames);
scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<int32>(kSampleFormatS32,
channel_layout,
+ channels,
kSampleRate,
1,
1,
@@ -174,6 +181,7 @@ TEST(AudioBufferTest, ReadF32) {
const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames);
scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<float>(kSampleFormatF32,
channel_layout,
+ channels,
kSampleRate,
1.0f,
1.0f,
@@ -204,6 +212,7 @@ TEST(AudioBufferTest, ReadS16Planar) {
scoped_refptr<AudioBuffer> buffer =
MakeAudioBuffer<int16>(kSampleFormatPlanarS16,
channel_layout,
+ channels,
kSampleRate,
1,
1,
@@ -245,6 +254,7 @@ TEST(AudioBufferTest, ReadF32Planar) {
scoped_refptr<AudioBuffer> buffer =
MakeAudioBuffer<float>(kSampleFormatPlanarF32,
channel_layout,
+ channels,
kSampleRate,
1.0f,
1.0f,
@@ -278,7 +288,7 @@ TEST(AudioBufferTest, EmptyBuffer) {
const base::TimeDelta start_time;
const base::TimeDelta duration = base::TimeDelta::FromSeconds(frames);
scoped_refptr<AudioBuffer> buffer = AudioBuffer::CreateEmptyBuffer(
- channel_layout, kSampleRate, frames, start_time, duration);
+ channel_layout, channels, kSampleRate, frames, start_time, duration);
EXPECT_EQ(frames, buffer->frame_count());
EXPECT_EQ(start_time, buffer->timestamp());
EXPECT_EQ(frames, buffer->duration().InSeconds());
@@ -302,6 +312,7 @@ TEST(AudioBufferTest, Trim) {
scoped_refptr<AudioBuffer> buffer =
MakeAudioBuffer<float>(kSampleFormatPlanarF32,
channel_layout,
+ channels,
kSampleRate,
1.0f,
1.0f,
diff --git a/media/base/audio_splicer.cc b/media/base/audio_splicer.cc
index e5dc312..1a56fa4 100644
--- a/media/base/audio_splicer.cc
+++ b/media/base/audio_splicer.cc
@@ -182,6 +182,7 @@ bool AudioStreamSanitizer::AddInput(const scoped_refptr<AudioBuffer>& input) {
// add it to the output buffer.
scoped_refptr<AudioBuffer> gap = AudioBuffer::CreateEmptyBuffer(
input->channel_layout(),
+ input->channel_count(),
input->sample_rate(),
frames_to_fill,
expected_timestamp,
@@ -433,6 +434,7 @@ scoped_ptr<AudioBus> AudioSplicer::ExtractCrossfadeFromPreSplice(
// Allocate output buffer for crossfade.
*crossfade_buffer = AudioBuffer::CreateBuffer(kSampleFormatPlanarF32,
preroll->channel_layout(),
+ preroll->channel_count(),
preroll->sample_rate(),
frames_to_crossfade);
}
diff --git a/media/base/audio_splicer_unittest.cc b/media/base/audio_splicer_unittest.cc
index ba2d6e8..481178e 100644
--- a/media/base/audio_splicer_unittest.cc
+++ b/media/base/audio_splicer_unittest.cc
@@ -38,6 +38,7 @@ class AudioSplicerTest : public ::testing::Test {
scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<float>(
kSampleFormat,
kChannelLayout,
+ kChannels,
kDefaultSampleRate,
value,
0.0f,
@@ -130,6 +131,7 @@ class AudioSplicerTest : public ::testing::Test {
? AudioBuffer::CreateEOSBuffer()
: AudioBuffer::CopyFrom(kSampleFormat,
input->channel_layout(),
+ input->channel_count(),
input->sample_rate(),
input->frame_count(),
&input->channel_data()[0],
diff --git a/media/base/test_helpers.cc b/media/base/test_helpers.cc
index 6cd0690..fd571dd 100644
--- a/media/base/test_helpers.cc
+++ b/media/base/test_helpers.cc
@@ -151,6 +151,7 @@ gfx::Size TestVideoConfig::LargeCodedSize() {
template <class T>
scoped_refptr<AudioBuffer> MakeAudioBuffer(SampleFormat format,
ChannelLayout channel_layout,
+ int channel_count,
int sample_rate,
T start,
T increment,
@@ -158,8 +159,8 @@ scoped_refptr<AudioBuffer> MakeAudioBuffer(SampleFormat format,
base::TimeDelta timestamp,
base::TimeDelta duration) {
int channels = ChannelLayoutToChannelCount(channel_layout);
- scoped_refptr<AudioBuffer> output =
- AudioBuffer::CreateBuffer(format, channel_layout, sample_rate, frames);
+ scoped_refptr<AudioBuffer> output = AudioBuffer::CreateBuffer(
+ format, channel_layout, channel_count, sample_rate, frames);
output->set_timestamp(timestamp);
output->set_duration(duration);
@@ -198,6 +199,7 @@ scoped_refptr<AudioBuffer> MakeAudioBuffer(SampleFormat format,
template scoped_refptr<AudioBuffer> MakeAudioBuffer<type>( \
SampleFormat format, \
ChannelLayout channel_layout, \
+ int channel_count, \
int sample_rate, \
type start, \
type increment, \
diff --git a/media/base/test_helpers.h b/media/base/test_helpers.h
index eb5b1f5..f342af4 100644
--- a/media/base/test_helpers.h
+++ b/media/base/test_helpers.h
@@ -114,6 +114,7 @@ class TestVideoConfig {
template <class T>
scoped_refptr<AudioBuffer> MakeAudioBuffer(SampleFormat format,
ChannelLayout channel_layout,
+ int channel_count,
int sample_rate,
T start,
T increment,
diff --git a/media/filters/audio_renderer_algorithm_unittest.cc b/media/filters/audio_renderer_algorithm_unittest.cc
index bde07a2..13fa28b 100644
--- a/media/filters/audio_renderer_algorithm_unittest.cc
+++ b/media/filters/audio_renderer_algorithm_unittest.cc
@@ -105,34 +105,40 @@ class AudioRendererAlgorithmTest : public testing::Test {
while (!algorithm_.IsQueueFull()) {
switch (sample_format_) {
case kSampleFormatU8:
- buffer = MakeAudioBuffer<uint8>(sample_format_,
- channel_layout_,
- samples_per_second_,
- 1,
- 1,
- kFrameSize,
- kNoTimestamp(),
- kNoTimestamp());
+ buffer = MakeAudioBuffer<uint8>(
+ sample_format_,
+ channel_layout_,
+ ChannelLayoutToChannelCount(channel_layout_),
+ samples_per_second_,
+ 1,
+ 1,
+ kFrameSize,
+ kNoTimestamp(),
+ kNoTimestamp());
break;
case kSampleFormatS16:
- buffer = MakeAudioBuffer<int16>(sample_format_,
- channel_layout_,
- samples_per_second_,
- 1,
- 1,
- kFrameSize,
- kNoTimestamp(),
- kNoTimestamp());
+ buffer = MakeAudioBuffer<int16>(
+ sample_format_,
+ channel_layout_,
+ ChannelLayoutToChannelCount(channel_layout_),
+ samples_per_second_,
+ 1,
+ 1,
+ kFrameSize,
+ kNoTimestamp(),
+ kNoTimestamp());
break;
case kSampleFormatS32:
- buffer = MakeAudioBuffer<int32>(sample_format_,
- channel_layout_,
- samples_per_second_,
- 1,
- 1,
- kFrameSize,
- kNoTimestamp(),
- kNoTimestamp());
+ buffer = MakeAudioBuffer<int32>(
+ sample_format_,
+ channel_layout_,
+ ChannelLayoutToChannelCount(channel_layout_),
+ samples_per_second_,
+ 1,
+ 1,
+ kFrameSize,
+ kNoTimestamp(),
+ kNoTimestamp());
break;
default:
NOTREACHED() << "Unrecognized format " << sample_format_;
@@ -232,7 +238,7 @@ class AudioRendererAlgorithmTest : public testing::Test {
void WsolaTest(float playback_rate) {
const int kSampleRateHz = 48000;
- const media::ChannelLayout kChannelLayout = CHANNEL_LAYOUT_STEREO;
+ const ChannelLayout kChannelLayout = CHANNEL_LAYOUT_STEREO;
const int kBytesPerSample = 2;
const int kNumFrames = kSampleRateHz / 100; // 10 milliseconds.
@@ -252,6 +258,7 @@ class AudioRendererAlgorithmTest : public testing::Test {
scoped_refptr<AudioBuffer> input =
AudioBuffer::CreateBuffer(kSampleFormatPlanarF32,
kChannelLayout,
+ channels_,
kSampleRateHz,
kPulseWidthSamples);
diff --git a/media/filters/audio_renderer_impl_unittest.cc b/media/filters/audio_renderer_impl_unittest.cc
index c4fb6ac..7cccdfc 100644
--- a/media/filters/audio_renderer_impl_unittest.cc
+++ b/media/filters/audio_renderer_impl_unittest.cc
@@ -34,6 +34,7 @@ namespace media {
static AudioCodec kCodec = kCodecVorbis;
static SampleFormat kSampleFormat = kSampleFormatPlanarF32;
static ChannelLayout kChannelLayout = CHANNEL_LAYOUT_STEREO;
+static int kChannelCount = 2;
static int kChannels = ChannelLayoutToChannelCount(kChannelLayout);
static int kSamplesPerSecond = 44100;
@@ -297,6 +298,7 @@ class AudioRendererImplTest : public ::testing::Test {
scoped_refptr<AudioBuffer> buffer =
MakeAudioBuffer<float>(kSampleFormat,
kChannelLayout,
+ kChannelCount,
kSamplesPerSecond,
kPlayingAudio,
0.0f,
diff --git a/media/filters/decrypting_audio_decoder_unittest.cc b/media/filters/decrypting_audio_decoder_unittest.cc
index 777db6f..c711cbd 100644
--- a/media/filters/decrypting_audio_decoder_unittest.cc
+++ b/media/filters/decrypting_audio_decoder_unittest.cc
@@ -94,7 +94,14 @@ class DecryptingAudioDecoderTest : public testing::Test {
void InitializeAndExpectStatus(const AudioDecoderConfig& config,
PipelineStatus status) {
+ // Initialize data now that the config is known. Since the code uses
+ // invalid values (that CreateEmptyBuffer() doesn't support), tweak them
+ // just for CreateEmptyBuffer().
+ int channels = ChannelLayoutToChannelCount(config.channel_layout());
+ if (channels < 0)
+ channels = 0;
decoded_frame_ = AudioBuffer::CreateEmptyBuffer(config.channel_layout(),
+ channels,
kSampleRate,
kFakeAudioFrameSize,
kNoTimestamp(),
@@ -353,12 +360,14 @@ TEST_F(DecryptingAudioDecoderTest, DecryptAndDecode_MultipleFrames) {
scoped_refptr<AudioBuffer> frame_a = AudioBuffer::CreateEmptyBuffer(
config_.channel_layout(),
+ ChannelLayoutToChannelCount(config_.channel_layout()),
kSampleRate,
kFakeAudioFrameSize,
kNoTimestamp(),
kNoTimestamp());
scoped_refptr<AudioBuffer> frame_b = AudioBuffer::CreateEmptyBuffer(
config_.channel_layout(),
+ ChannelLayoutToChannelCount(config_.channel_layout()),
kSampleRate,
kFakeAudioFrameSize,
kNoTimestamp(),
diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc
index c8f8f50..3cb69c0 100644
--- a/media/filters/ffmpeg_audio_decoder.cc
+++ b/media/filters/ffmpeg_audio_decoder.cc
@@ -92,6 +92,7 @@ static int GetAudioBuffer(struct AVCodecContext* s, AVFrame* frame, int flags) {
scoped_refptr<AudioBuffer> buffer = AudioBuffer::CreateBuffer(
sample_format,
ChannelLayoutToChromeChannelLayout(s->channel_layout, s->channels),
+ channels,
s->sample_rate,
frames_required);
diff --git a/media/filters/opus_audio_decoder.cc b/media/filters/opus_audio_decoder.cc
index 161d0c8..3fd28f4 100644
--- a/media/filters/opus_audio_decoder.cc
+++ b/media/filters/opus_audio_decoder.cc
@@ -464,10 +464,12 @@ void OpusAudioDecoder::ResetTimestampState() {
bool OpusAudioDecoder::Decode(const scoped_refptr<DecoderBuffer>& input,
scoped_refptr<AudioBuffer>* output_buffer) {
// Allocate a buffer for the output samples.
- *output_buffer = AudioBuffer::CreateBuffer(config_.sample_format(),
- config_.channel_layout(),
- config_.samples_per_second(),
- kMaxOpusOutputPacketSizeSamples);
+ *output_buffer = AudioBuffer::CreateBuffer(
+ config_.sample_format(),
+ config_.channel_layout(),
+ ChannelLayoutToChannelCount(config_.channel_layout()),
+ config_.samples_per_second(),
+ kMaxOpusOutputPacketSizeSamples);
const int buffer_size =
output_buffer->get()->channel_count() *
output_buffer->get()->frame_count() *