Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(204)

Side by Side Diff: remoting/codec/audio_encoder_opus.cc

Issue 14189035: Reduce jitter from uneven SincResampler buffer size requests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixes. Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/codec/audio_encoder_opus.h" 5 #include "remoting/codec/audio_encoder_opus.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/time.h" 9 #include "base/time.h"
10 #include "media/base/audio_bus.h" 10 #include "media/base/audio_bus.h"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 73
74 frame_size_ = sampling_rate_ * kFrameSizeMs / 74 frame_size_ = sampling_rate_ * kFrameSizeMs /
75 base::Time::kMillisecondsPerSecond; 75 base::Time::kMillisecondsPerSecond;
76 76
77 if (sampling_rate_ != kOpusSamplingRate) { 77 if (sampling_rate_ != kOpusSamplingRate) {
78 resample_buffer_.reset( 78 resample_buffer_.reset(
79 new char[kFrameSamples * kBytesPerSample * channels_]); 79 new char[kFrameSamples * kBytesPerSample * channels_]);
80 resampler_.reset(new media::MultiChannelResampler( 80 resampler_.reset(new media::MultiChannelResampler(
81 channels_, 81 channels_,
82 static_cast<double>(sampling_rate_) / kOpusSamplingRate, 82 static_cast<double>(sampling_rate_) / kOpusSamplingRate,
83 media::SincResampler::kDefaultRequestSize,
83 base::Bind(&AudioEncoderOpus::FetchBytesToResample, 84 base::Bind(&AudioEncoderOpus::FetchBytesToResample,
84 base::Unretained(this)))); 85 base::Unretained(this))));
85 resampler_bus_ = media::AudioBus::Create(channels_, kFrameSamples); 86 resampler_bus_ = media::AudioBus::Create(channels_, kFrameSamples);
86 } 87 }
87 88
88 // Drop leftover data because it's for different sampling rate. 89 // Drop leftover data because it's for different sampling rate.
89 leftover_samples_ = 0; 90 leftover_samples_ = 0;
90 leftover_buffer_size_ = 91 leftover_buffer_size_ =
91 frame_size_ + media::SincResampler::kMaximumLookAheadSize; 92 frame_size_ + media::SincResampler::kDefaultRequestSize;
92 leftover_buffer_.reset( 93 leftover_buffer_.reset(
93 new int16[leftover_buffer_size_ * channels_]); 94 new int16[leftover_buffer_size_ * channels_]);
94 } 95 }
95 96
96 void AudioEncoderOpus::DestroyEncoder() { 97 void AudioEncoderOpus::DestroyEncoder() {
97 if (encoder_) { 98 if (encoder_) {
98 opus_encoder_destroy(encoder_); 99 opus_encoder_destroy(encoder_);
99 encoder_ = NULL; 100 encoder_ = NULL;
100 } 101 }
101 102
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 const int16* next_sample = 153 const int16* next_sample =
153 reinterpret_cast<const int16*>(packet->data(0).data()); 154 reinterpret_cast<const int16*>(packet->data(0).data());
154 155
155 // Create a new packet of encoded data. 156 // Create a new packet of encoded data.
156 scoped_ptr<AudioPacket> encoded_packet(new AudioPacket()); 157 scoped_ptr<AudioPacket> encoded_packet(new AudioPacket());
157 encoded_packet->set_encoding(AudioPacket::ENCODING_OPUS); 158 encoded_packet->set_encoding(AudioPacket::ENCODING_OPUS);
158 encoded_packet->set_sampling_rate(kOpusSamplingRate); 159 encoded_packet->set_sampling_rate(kOpusSamplingRate);
159 encoded_packet->set_channels(channels_); 160 encoded_packet->set_channels(channels_);
160 161
161 int prefetch_samples = 162 int prefetch_samples =
162 resampler_.get() ? media::SincResampler::kMaximumLookAheadSize : 0; 163 resampler_.get() ? media::SincResampler::kDefaultRequestSize : 0;
163 int samples_wanted = frame_size_ + prefetch_samples; 164 int samples_wanted = frame_size_ + prefetch_samples;
164 165
165 while (leftover_samples_ + samples_in_packet >= samples_wanted) { 166 while (leftover_samples_ + samples_in_packet >= samples_wanted) {
166 const int16* pcm_buffer = NULL; 167 const int16* pcm_buffer = NULL;
167 168
168 // Combine the packet with the leftover samples, if any. 169 // Combine the packet with the leftover samples, if any.
169 if (leftover_samples_ > 0) { 170 if (leftover_samples_ > 0) {
170 pcm_buffer = leftover_buffer_.get(); 171 pcm_buffer = leftover_buffer_.get();
171 int samples_to_copy = samples_wanted - leftover_samples_; 172 int samples_to_copy = samples_wanted - leftover_samples_;
172 memcpy(leftover_buffer_.get() + leftover_samples_ * channels_, 173 memcpy(leftover_buffer_.get() + leftover_samples_ * channels_,
173 next_sample, samples_to_copy * kBytesPerSample * channels_); 174 next_sample, samples_to_copy * kBytesPerSample * channels_);
174 } else { 175 } else {
175 pcm_buffer = next_sample; 176 pcm_buffer = next_sample;
176 } 177 }
177 178
178 // Resample data if necessary. 179 // Resample data if necessary.
179 int samples_consumed = 0; 180 int samples_consumed = 0;
180 if (resampler_.get()) { 181 if (resampler_.get()) {
181 resampling_data_ = reinterpret_cast<const char*>(pcm_buffer); 182 resampling_data_ = reinterpret_cast<const char*>(pcm_buffer);
182 resampling_data_pos_ = 0; 183 resampling_data_pos_ = 0;
183 resampling_data_size_ = samples_wanted * channels_ * kBytesPerSample; 184 resampling_data_size_ = samples_wanted * channels_ * kBytesPerSample;
184 resampler_->Resample(resampler_bus_.get(), kFrameSamples); 185 resampler_->Resample(kFrameSamples, resampler_bus_.get());
185 resampling_data_ = NULL; 186 resampling_data_ = NULL;
186 samples_consumed = resampling_data_pos_ / channels_ / kBytesPerSample; 187 samples_consumed = resampling_data_pos_ / channels_ / kBytesPerSample;
187 188
188 resampler_bus_->ToInterleaved(kFrameSamples, kBytesPerSample, 189 resampler_bus_->ToInterleaved(kFrameSamples, kBytesPerSample,
189 resample_buffer_.get()); 190 resample_buffer_.get());
190 pcm_buffer = reinterpret_cast<int16*>(resample_buffer_.get()); 191 pcm_buffer = reinterpret_cast<int16*>(resample_buffer_.get());
191 } else { 192 } else {
192 samples_consumed = frame_size_; 193 samples_consumed = frame_size_;
193 } 194 }
194 195
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 } 233 }
233 234
234 // Return NULL if there's nothing in the packet. 235 // Return NULL if there's nothing in the packet.
235 if (encoded_packet->data_size() == 0) 236 if (encoded_packet->data_size() == 0)
236 return scoped_ptr<AudioPacket>(); 237 return scoped_ptr<AudioPacket>();
237 238
238 return encoded_packet.Pass(); 239 return encoded_packet.Pass();
239 } 240 }
240 241
241 } // namespace remoting 242 } // namespace remoting
OLDNEW
« media/base/sinc_resampler.cc ('K') | « media/base/sinc_resampler_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698