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

Side by Side Diff: webrtc/modules/audio_processing/audio_buffer.cc

Issue 1227213002: Update audio code to use size_t more correctly, webrtc/modules/audio_processing/ (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Created 5 years, 5 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
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include "webrtc/modules/audio_processing/audio_buffer.h" 11 #include "webrtc/modules/audio_processing/audio_buffer.h"
12 12
13 #include "webrtc/common_audio/include/audio_util.h" 13 #include "webrtc/common_audio/include/audio_util.h"
14 #include "webrtc/common_audio/resampler/push_sinc_resampler.h" 14 #include "webrtc/common_audio/resampler/push_sinc_resampler.h"
15 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar y.h" 15 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar y.h"
16 #include "webrtc/common_audio/channel_buffer.h" 16 #include "webrtc/common_audio/channel_buffer.h"
17 #include "webrtc/modules/audio_processing/common.h" 17 #include "webrtc/modules/audio_processing/common.h"
18 18
19 namespace webrtc { 19 namespace webrtc {
20 namespace { 20 namespace {
21 21
22 const int kSamplesPer16kHzChannel = 160; 22 const size_t kSamplesPer16kHzChannel = 160;
23 const int kSamplesPer32kHzChannel = 320; 23 const size_t kSamplesPer32kHzChannel = 320;
24 const int kSamplesPer48kHzChannel = 480; 24 const size_t kSamplesPer48kHzChannel = 480;
25 25
26 bool HasKeyboardChannel(AudioProcessing::ChannelLayout layout) { 26 bool HasKeyboardChannel(AudioProcessing::ChannelLayout layout) {
27 switch (layout) { 27 switch (layout) {
28 case AudioProcessing::kMono: 28 case AudioProcessing::kMono:
29 case AudioProcessing::kStereo: 29 case AudioProcessing::kStereo:
30 return false; 30 return false;
31 case AudioProcessing::kMonoAndKeyboard: 31 case AudioProcessing::kMonoAndKeyboard:
32 case AudioProcessing::kStereoAndKeyboard: 32 case AudioProcessing::kStereoAndKeyboard:
33 return true; 33 return true;
34 } 34 }
(...skipping 11 matching lines...) Expand all
46 return 1; 46 return 1;
47 case AudioProcessing::kStereoAndKeyboard: 47 case AudioProcessing::kStereoAndKeyboard:
48 return 2; 48 return 2;
49 } 49 }
50 assert(false); 50 assert(false);
51 return -1; 51 return -1;
52 } 52 }
53 53
54 template <typename T> 54 template <typename T>
55 void StereoToMono(const T* left, const T* right, T* out, 55 void StereoToMono(const T* left, const T* right, T* out,
56 int num_frames) { 56 size_t num_frames) {
57 for (int i = 0; i < num_frames; ++i) 57 for (size_t i = 0; i < num_frames; ++i)
58 out[i] = (left[i] + right[i]) / 2; 58 out[i] = (left[i] + right[i]) / 2;
59 } 59 }
60 60
61 int NumBandsFromSamplesPerChannel(int num_frames) { 61 size_t NumBandsFromSamplesPerChannel(size_t num_frames) {
62 int num_bands = 1; 62 size_t num_bands = 1;
63 if (num_frames == kSamplesPer32kHzChannel || 63 if (num_frames == kSamplesPer32kHzChannel ||
64 num_frames == kSamplesPer48kHzChannel) { 64 num_frames == kSamplesPer48kHzChannel) {
65 num_bands = rtc::CheckedDivExact(num_frames, 65 num_bands = rtc::CheckedDivExact(num_frames, kSamplesPer16kHzChannel);
66 static_cast<int>(kSamplesPer16kHzChannel));
67 } 66 }
68 return num_bands; 67 return num_bands;
69 } 68 }
70 69
71 } // namespace 70 } // namespace
72 71
73 AudioBuffer::AudioBuffer(int input_num_frames, 72 AudioBuffer::AudioBuffer(size_t input_num_frames,
74 int num_input_channels, 73 int num_input_channels,
75 int process_num_frames, 74 size_t process_num_frames,
76 int num_process_channels, 75 int num_process_channels,
77 int output_num_frames) 76 size_t output_num_frames)
78 : input_num_frames_(input_num_frames), 77 : input_num_frames_(input_num_frames),
79 num_input_channels_(num_input_channels), 78 num_input_channels_(num_input_channels),
80 proc_num_frames_(process_num_frames), 79 proc_num_frames_(process_num_frames),
81 num_proc_channels_(num_process_channels), 80 num_proc_channels_(num_process_channels),
82 output_num_frames_(output_num_frames), 81 output_num_frames_(output_num_frames),
83 num_channels_(num_process_channels), 82 num_channels_(num_process_channels),
84 num_bands_(NumBandsFromSamplesPerChannel(proc_num_frames_)), 83 num_bands_(NumBandsFromSamplesPerChannel(proc_num_frames_)),
85 num_split_frames_(rtc::CheckedDivExact(proc_num_frames_, num_bands_)), 84 num_split_frames_(rtc::CheckedDivExact(proc_num_frames_, num_bands_)),
86 mixed_low_pass_valid_(false), 85 mixed_low_pass_valid_(false),
87 reference_copied_(false), 86 reference_copied_(false),
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 num_bands_)); 122 num_bands_));
124 splitting_filter_.reset(new SplittingFilter(num_proc_channels_, 123 splitting_filter_.reset(new SplittingFilter(num_proc_channels_,
125 num_bands_, 124 num_bands_,
126 proc_num_frames_)); 125 proc_num_frames_));
127 } 126 }
128 } 127 }
129 128
130 AudioBuffer::~AudioBuffer() {} 129 AudioBuffer::~AudioBuffer() {}
131 130
132 void AudioBuffer::CopyFrom(const float* const* data, 131 void AudioBuffer::CopyFrom(const float* const* data,
133 int num_frames, 132 size_t num_frames,
134 AudioProcessing::ChannelLayout layout) { 133 AudioProcessing::ChannelLayout layout) {
135 assert(num_frames == input_num_frames_); 134 assert(num_frames == input_num_frames_);
136 assert(ChannelsFromLayout(layout) == num_input_channels_); 135 assert(ChannelsFromLayout(layout) == num_input_channels_);
137 InitForNewData(); 136 InitForNewData();
138 // Initialized lazily because there's a different condition in 137 // Initialized lazily because there's a different condition in
139 // DeinterleaveFrom. 138 // DeinterleaveFrom.
140 if ((num_input_channels_ == 2 && num_proc_channels_ == 1) && !input_buffer_) { 139 if ((num_input_channels_ == 2 && num_proc_channels_ == 1) && !input_buffer_) {
141 input_buffer_.reset( 140 input_buffer_.reset(
142 new IFChannelBuffer(input_num_frames_, num_proc_channels_)); 141 new IFChannelBuffer(input_num_frames_, num_proc_channels_));
143 } 142 }
(...skipping 24 matching lines...) Expand all
168 } 167 }
169 168
170 // Convert to the S16 range. 169 // Convert to the S16 range.
171 for (int i = 0; i < num_proc_channels_; ++i) { 170 for (int i = 0; i < num_proc_channels_; ++i) {
172 FloatToFloatS16(data_ptr[i], 171 FloatToFloatS16(data_ptr[i],
173 proc_num_frames_, 172 proc_num_frames_,
174 data_->fbuf()->channels()[i]); 173 data_->fbuf()->channels()[i]);
175 } 174 }
176 } 175 }
177 176
178 void AudioBuffer::CopyTo(int num_frames, 177 void AudioBuffer::CopyTo(size_t num_frames,
179 AudioProcessing::ChannelLayout layout, 178 AudioProcessing::ChannelLayout layout,
180 float* const* data) { 179 float* const* data) {
181 assert(num_frames == output_num_frames_); 180 assert(num_frames == output_num_frames_);
182 assert(ChannelsFromLayout(layout) == num_channels_); 181 assert(ChannelsFromLayout(layout) == num_channels_);
183 182
184 // Convert to the float range. 183 // Convert to the float range.
185 float* const* data_ptr = data; 184 float* const* data_ptr = data;
186 if (output_num_frames_ != proc_num_frames_) { 185 if (output_num_frames_ != proc_num_frames_) {
187 // Convert to an intermediate buffer for subsequent resampling. 186 // Convert to an intermediate buffer for subsequent resampling.
188 data_ptr = process_buffer_->channels(); 187 data_ptr = process_buffer_->channels();
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 } 368 }
370 369
371 int AudioBuffer::num_channels() const { 370 int AudioBuffer::num_channels() const {
372 return num_channels_; 371 return num_channels_;
373 } 372 }
374 373
375 void AudioBuffer::set_num_channels(int num_channels) { 374 void AudioBuffer::set_num_channels(int num_channels) {
376 num_channels_ = num_channels; 375 num_channels_ = num_channels;
377 } 376 }
378 377
379 int AudioBuffer::num_frames() const { 378 size_t AudioBuffer::num_frames() const {
380 return proc_num_frames_; 379 return proc_num_frames_;
381 } 380 }
382 381
383 int AudioBuffer::num_frames_per_band() const { 382 size_t AudioBuffer::num_frames_per_band() const {
384 return num_split_frames_; 383 return num_split_frames_;
385 } 384 }
386 385
387 int AudioBuffer::num_keyboard_frames() const { 386 size_t AudioBuffer::num_keyboard_frames() const {
388 // We don't resample the keyboard channel. 387 // We don't resample the keyboard channel.
389 return input_num_frames_; 388 return input_num_frames_;
390 } 389 }
391 390
392 int AudioBuffer::num_bands() const { 391 size_t AudioBuffer::num_bands() const {
393 return num_bands_; 392 return num_bands_;
394 } 393 }
395 394
396 // The resampler is only for supporting 48kHz to 16kHz in the reverse stream. 395 // The resampler is only for supporting 48kHz to 16kHz in the reverse stream.
397 void AudioBuffer::DeinterleaveFrom(AudioFrame* frame) { 396 void AudioBuffer::DeinterleaveFrom(AudioFrame* frame) {
398 assert(frame->num_channels_ == num_input_channels_); 397 assert(frame->num_channels_ == num_input_channels_);
399 assert(frame->samples_per_channel_ == input_num_frames_); 398 assert(frame->samples_per_channel_ == input_num_frames_);
400 InitForNewData(); 399 InitForNewData();
401 // Initialized lazily because there's a different condition in CopyFrom. 400 // Initialized lazily because there's a different condition in CopyFrom.
402 if ((input_num_frames_ != proc_num_frames_) && !input_buffer_) { 401 if ((input_num_frames_ != proc_num_frames_) && !input_buffer_) {
403 input_buffer_.reset( 402 input_buffer_.reset(
404 new IFChannelBuffer(input_num_frames_, num_proc_channels_)); 403 new IFChannelBuffer(input_num_frames_, num_proc_channels_));
405 } 404 }
406 activity_ = frame->vad_activity_; 405 activity_ = frame->vad_activity_;
407 406
408 int16_t* const* deinterleaved; 407 int16_t* const* deinterleaved;
409 if (input_num_frames_ == proc_num_frames_) { 408 if (input_num_frames_ == proc_num_frames_) {
410 deinterleaved = data_->ibuf()->channels(); 409 deinterleaved = data_->ibuf()->channels();
411 } else { 410 } else {
412 deinterleaved = input_buffer_->ibuf()->channels(); 411 deinterleaved = input_buffer_->ibuf()->channels();
413 } 412 }
414 if (num_input_channels_ == 2 && num_proc_channels_ == 1) { 413 if (num_input_channels_ == 2 && num_proc_channels_ == 1) {
415 // Downmix directly; no explicit deinterleaving needed. 414 // Downmix directly; no explicit deinterleaving needed.
416 for (int i = 0; i < input_num_frames_; ++i) { 415 for (size_t i = 0; i < input_num_frames_; ++i) {
417 deinterleaved[0][i] = (frame->data_[i * 2] + frame->data_[i * 2 + 1]) / 2; 416 deinterleaved[0][i] = (frame->data_[i * 2] + frame->data_[i * 2 + 1]) / 2;
418 } 417 }
419 } else { 418 } else {
420 assert(num_proc_channels_ == num_input_channels_); 419 assert(num_proc_channels_ == num_input_channels_);
421 Deinterleave(frame->data_, 420 Deinterleave(frame->data_,
422 input_num_frames_, 421 input_num_frames_,
423 num_proc_channels_, 422 num_proc_channels_,
424 deinterleaved); 423 deinterleaved);
425 } 424 }
426 425
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 469
471 void AudioBuffer::SplitIntoFrequencyBands() { 470 void AudioBuffer::SplitIntoFrequencyBands() {
472 splitting_filter_->Analysis(data_.get(), split_data_.get()); 471 splitting_filter_->Analysis(data_.get(), split_data_.get());
473 } 472 }
474 473
475 void AudioBuffer::MergeFrequencyBands() { 474 void AudioBuffer::MergeFrequencyBands() {
476 splitting_filter_->Synthesis(split_data_.get(), data_.get()); 475 splitting_filter_->Synthesis(split_data_.get(), data_.get());
477 } 476 }
478 477
479 } // namespace webrtc 478 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698