OLD | NEW |
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/time.h" | 9 #include "base/time/time.h" |
10 #include "media/base/audio_bus.h" | 10 #include "media/base/audio_bus.h" |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 media::SincResampler::kDefaultRequestSize, | 79 media::SincResampler::kDefaultRequestSize, |
80 base::Bind(&AudioEncoderOpus::FetchBytesToResample, | 80 base::Bind(&AudioEncoderOpus::FetchBytesToResample, |
81 base::Unretained(this)))); | 81 base::Unretained(this)))); |
82 resampler_bus_ = media::AudioBus::Create(channels_, kFrameSamples); | 82 resampler_bus_ = media::AudioBus::Create(channels_, kFrameSamples); |
83 } | 83 } |
84 | 84 |
85 // Drop leftover data because it's for different sampling rate. | 85 // Drop leftover data because it's for different sampling rate. |
86 leftover_samples_ = 0; | 86 leftover_samples_ = 0; |
87 leftover_buffer_size_ = | 87 leftover_buffer_size_ = |
88 frame_size_ + media::SincResampler::kDefaultRequestSize; | 88 frame_size_ + media::SincResampler::kDefaultRequestSize; |
89 leftover_buffer_.reset( | 89 leftover_buffer_.reset(new int16_t[leftover_buffer_size_ * channels_]); |
90 new int16[leftover_buffer_size_ * channels_]); | |
91 } | 90 } |
92 | 91 |
93 void AudioEncoderOpus::DestroyEncoder() { | 92 void AudioEncoderOpus::DestroyEncoder() { |
94 if (encoder_) { | 93 if (encoder_) { |
95 opus_encoder_destroy(encoder_); | 94 opus_encoder_destroy(encoder_); |
96 encoder_ = nullptr; | 95 encoder_ = nullptr; |
97 } | 96 } |
98 | 97 |
99 resampler_.reset(); | 98 resampler_.reset(); |
100 } | 99 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 DCHECK_EQ(AudioPacket::ENCODING_RAW, packet->encoding()); | 142 DCHECK_EQ(AudioPacket::ENCODING_RAW, packet->encoding()); |
144 DCHECK_EQ(1, packet->data_size()); | 143 DCHECK_EQ(1, packet->data_size()); |
145 DCHECK_EQ(kBytesPerSample, packet->bytes_per_sample()); | 144 DCHECK_EQ(kBytesPerSample, packet->bytes_per_sample()); |
146 | 145 |
147 if (!ResetForPacket(packet.get())) { | 146 if (!ResetForPacket(packet.get())) { |
148 LOG(ERROR) << "Encoder initialization failed"; | 147 LOG(ERROR) << "Encoder initialization failed"; |
149 return nullptr; | 148 return nullptr; |
150 } | 149 } |
151 | 150 |
152 int samples_in_packet = packet->data(0).size() / kBytesPerSample / channels_; | 151 int samples_in_packet = packet->data(0).size() / kBytesPerSample / channels_; |
153 const int16* next_sample = | 152 const int16_t* next_sample = |
154 reinterpret_cast<const int16*>(packet->data(0).data()); | 153 reinterpret_cast<const int16_t*>(packet->data(0).data()); |
155 | 154 |
156 // Create a new packet of encoded data. | 155 // Create a new packet of encoded data. |
157 scoped_ptr<AudioPacket> encoded_packet(new AudioPacket()); | 156 scoped_ptr<AudioPacket> encoded_packet(new AudioPacket()); |
158 encoded_packet->set_encoding(AudioPacket::ENCODING_OPUS); | 157 encoded_packet->set_encoding(AudioPacket::ENCODING_OPUS); |
159 encoded_packet->set_sampling_rate(kOpusSamplingRate); | 158 encoded_packet->set_sampling_rate(kOpusSamplingRate); |
160 encoded_packet->set_channels(channels_); | 159 encoded_packet->set_channels(channels_); |
161 | 160 |
162 int prefetch_samples = | 161 int prefetch_samples = |
163 resampler_.get() ? media::SincResampler::kDefaultRequestSize : 0; | 162 resampler_.get() ? media::SincResampler::kDefaultRequestSize : 0; |
164 int samples_wanted = frame_size_ + prefetch_samples; | 163 int samples_wanted = frame_size_ + prefetch_samples; |
165 | 164 |
166 while (leftover_samples_ + samples_in_packet >= samples_wanted) { | 165 while (leftover_samples_ + samples_in_packet >= samples_wanted) { |
167 const int16* pcm_buffer = nullptr; | 166 const int16_t* pcm_buffer = nullptr; |
168 | 167 |
169 // Combine the packet with the leftover samples, if any. | 168 // Combine the packet with the leftover samples, if any. |
170 if (leftover_samples_ > 0) { | 169 if (leftover_samples_ > 0) { |
171 pcm_buffer = leftover_buffer_.get(); | 170 pcm_buffer = leftover_buffer_.get(); |
172 int samples_to_copy = samples_wanted - leftover_samples_; | 171 int samples_to_copy = samples_wanted - leftover_samples_; |
173 memcpy(leftover_buffer_.get() + leftover_samples_ * channels_, | 172 memcpy(leftover_buffer_.get() + leftover_samples_ * channels_, |
174 next_sample, samples_to_copy * kBytesPerSample * channels_); | 173 next_sample, samples_to_copy * kBytesPerSample * channels_); |
175 } else { | 174 } else { |
176 pcm_buffer = next_sample; | 175 pcm_buffer = next_sample; |
177 } | 176 } |
178 | 177 |
179 // Resample data if necessary. | 178 // Resample data if necessary. |
180 int samples_consumed = 0; | 179 int samples_consumed = 0; |
181 if (resampler_.get()) { | 180 if (resampler_.get()) { |
182 resampling_data_ = reinterpret_cast<const char*>(pcm_buffer); | 181 resampling_data_ = reinterpret_cast<const char*>(pcm_buffer); |
183 resampling_data_pos_ = 0; | 182 resampling_data_pos_ = 0; |
184 resampling_data_size_ = samples_wanted * channels_ * kBytesPerSample; | 183 resampling_data_size_ = samples_wanted * channels_ * kBytesPerSample; |
185 resampler_->Resample(kFrameSamples, resampler_bus_.get()); | 184 resampler_->Resample(kFrameSamples, resampler_bus_.get()); |
186 resampling_data_ = nullptr; | 185 resampling_data_ = nullptr; |
187 samples_consumed = resampling_data_pos_ / channels_ / kBytesPerSample; | 186 samples_consumed = resampling_data_pos_ / channels_ / kBytesPerSample; |
188 | 187 |
189 resampler_bus_->ToInterleaved(kFrameSamples, kBytesPerSample, | 188 resampler_bus_->ToInterleaved(kFrameSamples, kBytesPerSample, |
190 resample_buffer_.get()); | 189 resample_buffer_.get()); |
191 pcm_buffer = reinterpret_cast<int16*>(resample_buffer_.get()); | 190 pcm_buffer = reinterpret_cast<int16_t*>(resample_buffer_.get()); |
192 } else { | 191 } else { |
193 samples_consumed = frame_size_; | 192 samples_consumed = frame_size_; |
194 } | 193 } |
195 | 194 |
196 // Initialize output buffer. | 195 // Initialize output buffer. |
197 std::string* data = encoded_packet->add_data(); | 196 std::string* data = encoded_packet->add_data(); |
198 data->resize(kFrameSamples * kBytesPerSample * channels_); | 197 data->resize(kFrameSamples * kBytesPerSample * channels_); |
199 | 198 |
200 // Encode. | 199 // Encode. |
201 unsigned char* buffer = | 200 unsigned char* buffer = |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 } | 232 } |
234 | 233 |
235 // Return nullptr if there's nothing in the packet. | 234 // Return nullptr if there's nothing in the packet. |
236 if (encoded_packet->data_size() == 0) | 235 if (encoded_packet->data_size() == 0) |
237 return nullptr; | 236 return nullptr; |
238 | 237 |
239 return encoded_packet.Pass(); | 238 return encoded_packet.Pass(); |
240 } | 239 } |
241 | 240 |
242 } // namespace remoting | 241 } // namespace remoting |
OLD | NEW |