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

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: Cleanup. 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::kDefaultBlockSize,
Sergey Ulanov 2013/04/29 06:23:37 I think it would be better to mach default frame s
Sergey Ulanov 2013/04/29 07:16:54 Sorry, just realized that kFrameSamples is already
DaleCurtis 2013/04/29 22:12:31 kFrameSamples appears to refer to the output sampl
Sergey Ulanov 2013/05/01 02:06:25 Oh, right. Then it should be frame_size_, which is
DaleCurtis 2013/05/07 23:49:41 Hmm, I'm not sure about this, so I've just kept th
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::kDefaultBlockSize;
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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 int samples_in_packet = packet->data(0).size() / kBytesPerSample / channels_; 152 int samples_in_packet = packet->data(0).size() / kBytesPerSample / channels_;
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 =
Sergey Ulanov 2013/05/01 02:06:25 Not sure if prefetching is still required. If not
162 resampler_.get() ? media::SincResampler::kMaximumLookAheadSize : 0; 163 resampler_.get() ? media::SincResampler::kDefaultBlockSize : 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_,
(...skipping 59 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