summaryrefslogtreecommitdiffstats
path: root/media/base/multi_channel_resampler.cc
diff options
context:
space:
mode:
authordalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-08 22:53:28 +0000
committerdalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-08 22:53:28 +0000
commita70013babca3b661bbc3ef198ad2f58c88ec4078 (patch)
tree88f54b2897dd67430bcd97d94aee42788c6c1bf4 /media/base/multi_channel_resampler.cc
parentbfa6c1d83fc19226ad8c2ffd3bb958955b26279a (diff)
downloadchromium_src-a70013babca3b661bbc3ef198ad2f58c88ec4078.zip
chromium_src-a70013babca3b661bbc3ef198ad2f58c88ec4078.tar.gz
chromium_src-a70013babca3b661bbc3ef198ad2f58c88ec4078.tar.bz2
Reduce jitter from uneven SincResampler buffer size requests.
Ensures all buffer requests are for the same size. Reduces jitter by allowing clients with specific buffer size requirements to avoid overreading. BUG=none TEST=media_unittests. R=crogers@google.com, henrika@chromium.org, sergeyu@chromium.org Review URL: https://codereview.chromium.org/14189035 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@199032 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base/multi_channel_resampler.cc')
-rw-r--r--media/base/multi_channel_resampler.cc23
1 files changed, 16 insertions, 7 deletions
diff --git a/media/base/multi_channel_resampler.cc b/media/base/multi_channel_resampler.cc
index 9aa00d8..a9aa8d6 100644
--- a/media/base/multi_channel_resampler.cc
+++ b/media/base/multi_channel_resampler.cc
@@ -13,6 +13,7 @@ namespace media {
MultiChannelResampler::MultiChannelResampler(int channels,
double io_sample_rate_ratio,
+ size_t request_size,
const ReadCB& read_cb)
: last_frame_count_(0),
read_cb_(read_cb),
@@ -20,23 +21,30 @@ MultiChannelResampler::MultiChannelResampler(int channels,
// Allocate each channel's resampler.
resamplers_.reserve(channels);
for (int i = 0; i < channels; ++i) {
- resamplers_.push_back(new SincResampler(io_sample_rate_ratio, base::Bind(
- &MultiChannelResampler::ProvideInput, base::Unretained(this), i)));
+ resamplers_.push_back(new SincResampler(
+ io_sample_rate_ratio, request_size, base::Bind(
+ &MultiChannelResampler::ProvideInput, base::Unretained(this), i)));
}
}
MultiChannelResampler::~MultiChannelResampler() {}
-void MultiChannelResampler::Resample(AudioBus* audio_bus, int frames) {
+void MultiChannelResampler::Resample(int frames, AudioBus* audio_bus) {
DCHECK_EQ(static_cast<size_t>(audio_bus->channels()), resamplers_.size());
+ // Optimize the single channel case to avoid the chunking process below.
+ if (audio_bus->channels() == 1) {
+ resamplers_[0]->Resample(frames, audio_bus->channel(0));
+ return;
+ }
+
// We need to ensure that SincResampler only calls ProvideInput once for each
// channel. To ensure this, we chunk the number of requested frames into
// SincResampler::ChunkSize() sized chunks. SincResampler guarantees it will
// only call ProvideInput() once when we resample this way.
output_frames_ready_ = 0;
- int chunk_size = resamplers_[0]->ChunkSize();
while (output_frames_ready_ < frames) {
+ int chunk_size = resamplers_[0]->ChunkSize();
int frames_this_time = std::min(frames - output_frames_ready_, chunk_size);
// Resample each channel.
@@ -50,15 +58,16 @@ void MultiChannelResampler::Resample(AudioBus* audio_bus, int frames) {
// since they all buffer in the same way and are processing the same
// number of frames.
resamplers_[i]->Resample(
- audio_bus->channel(i) + output_frames_ready_, frames_this_time);
+ frames_this_time, audio_bus->channel(i) + output_frames_ready_);
}
output_frames_ready_ += frames_this_time;
}
}
-void MultiChannelResampler::ProvideInput(int channel, float* destination,
- int frames) {
+void MultiChannelResampler::ProvideInput(int channel,
+ int frames,
+ float* destination) {
// Get the data from the multi-channel provider when the first channel asks
// for it. For subsequent channels, we can just dish out the channel data
// from that (stored in |resampler_audio_bus_|).