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

Side by Side Diff: webrtc/common_audio/resampler/push_sinc_resampler.cc

Issue 1231713002: Update audio code to use size_t more correctly, webrtc/common_audio/resampler/ (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Review comments Created 5 years, 4 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) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 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/common_audio/resampler/push_sinc_resampler.h" 11 #include "webrtc/common_audio/resampler/push_sinc_resampler.h"
12 12
13 #include <cstring> 13 #include <cstring>
14 14
15 #include "webrtc/base/checks.h" 15 #include "webrtc/base/checks.h"
16 #include "webrtc/common_audio/include/audio_util.h" 16 #include "webrtc/common_audio/include/audio_util.h"
17 17
18 namespace webrtc { 18 namespace webrtc {
19 19
20 PushSincResampler::PushSincResampler(int source_frames, int destination_frames) 20 PushSincResampler::PushSincResampler(size_t source_frames,
21 size_t destination_frames)
21 : resampler_(new SincResampler(source_frames * 1.0 / destination_frames, 22 : resampler_(new SincResampler(source_frames * 1.0 / destination_frames,
22 source_frames, 23 source_frames,
23 this)), 24 this)),
24 source_ptr_(nullptr), 25 source_ptr_(nullptr),
25 source_ptr_int_(nullptr), 26 source_ptr_int_(nullptr),
26 destination_frames_(destination_frames), 27 destination_frames_(destination_frames),
27 first_pass_(true), 28 first_pass_(true),
28 source_available_(0) {} 29 source_available_(0) {}
29 30
30 PushSincResampler::~PushSincResampler() { 31 PushSincResampler::~PushSincResampler() {
31 } 32 }
32 33
33 int PushSincResampler::Resample(const int16_t* source, 34 size_t PushSincResampler::Resample(const int16_t* source,
34 int source_length, 35 size_t source_length,
35 int16_t* destination, 36 int16_t* destination,
36 int destination_capacity) { 37 size_t destination_capacity) {
37 if (!float_buffer_.get()) 38 if (!float_buffer_.get())
38 float_buffer_.reset(new float[destination_frames_]); 39 float_buffer_.reset(new float[destination_frames_]);
39 40
40 source_ptr_int_ = source; 41 source_ptr_int_ = source;
41 // Pass nullptr as the float source to have Run() read from the int16 source. 42 // Pass nullptr as the float source to have Run() read from the int16 source.
42 Resample(nullptr, source_length, float_buffer_.get(), destination_frames_); 43 Resample(nullptr, source_length, float_buffer_.get(), destination_frames_);
43 FloatS16ToS16(float_buffer_.get(), destination_frames_, destination); 44 FloatS16ToS16(float_buffer_.get(), destination_frames_, destination);
44 source_ptr_int_ = nullptr; 45 source_ptr_int_ = nullptr;
45 return destination_frames_; 46 return destination_frames_;
46 } 47 }
47 48
48 int PushSincResampler::Resample(const float* source, 49 size_t PushSincResampler::Resample(const float* source,
49 int source_length, 50 size_t source_length,
50 float* destination, 51 float* destination,
51 int destination_capacity) { 52 size_t destination_capacity) {
52 CHECK_EQ(source_length, resampler_->request_frames()); 53 CHECK_EQ(source_length, resampler_->request_frames());
53 CHECK_GE(destination_capacity, destination_frames_); 54 CHECK_GE(destination_capacity, destination_frames_);
54 // Cache the source pointer. Calling Resample() will immediately trigger 55 // Cache the source pointer. Calling Resample() will immediately trigger
55 // the Run() callback whereupon we provide the cached value. 56 // the Run() callback whereupon we provide the cached value.
56 source_ptr_ = source; 57 source_ptr_ = source;
57 source_available_ = source_length; 58 source_available_ = source_length;
58 59
59 // On the first pass, we call Resample() twice. During the first call, we 60 // On the first pass, we call Resample() twice. During the first call, we
60 // provide dummy input and discard the output. This is done to prime the 61 // provide dummy input and discard the output. This is done to prime the
61 // SincResampler buffer with the correct delay (half the kernel size), thereby 62 // SincResampler buffer with the correct delay (half the kernel size), thereby
62 // ensuring that all later Resample() calls will only result in one input 63 // ensuring that all later Resample() calls will only result in one input
63 // request through Run(). 64 // request through Run().
64 // 65 //
65 // If this wasn't done, SincResampler would call Run() twice on the first 66 // If this wasn't done, SincResampler would call Run() twice on the first
66 // pass, and we'd have to introduce an entire |source_frames| of delay, rather 67 // pass, and we'd have to introduce an entire |source_frames| of delay, rather
67 // than the minimum half kernel. 68 // than the minimum half kernel.
68 // 69 //
69 // It works out that ChunkSize() is exactly the amount of output we need to 70 // It works out that ChunkSize() is exactly the amount of output we need to
70 // request in order to prime the buffer with a single Run() request for 71 // request in order to prime the buffer with a single Run() request for
71 // |source_frames|. 72 // |source_frames|.
72 if (first_pass_) 73 if (first_pass_)
73 resampler_->Resample(resampler_->ChunkSize(), destination); 74 resampler_->Resample(resampler_->ChunkSize(), destination);
74 75
75 resampler_->Resample(destination_frames_, destination); 76 resampler_->Resample(destination_frames_, destination);
76 source_ptr_ = nullptr; 77 source_ptr_ = nullptr;
77 return destination_frames_; 78 return destination_frames_;
78 } 79 }
79 80
80 void PushSincResampler::Run(int frames, float* destination) { 81 void PushSincResampler::Run(size_t frames, float* destination) {
81 // Ensure we are only asked for the available samples. This would fail if 82 // Ensure we are only asked for the available samples. This would fail if
82 // Run() was triggered more than once per Resample() call. 83 // Run() was triggered more than once per Resample() call.
83 CHECK_EQ(source_available_, frames); 84 CHECK_EQ(source_available_, frames);
84 85
85 if (first_pass_) { 86 if (first_pass_) {
86 // Provide dummy input on the first pass, the output of which will be 87 // Provide dummy input on the first pass, the output of which will be
87 // discarded, as described in Resample(). 88 // discarded, as described in Resample().
88 std::memset(destination, 0, frames * sizeof(*destination)); 89 std::memset(destination, 0, frames * sizeof(*destination));
89 first_pass_ = false; 90 first_pass_ = false;
90 return; 91 return;
91 } 92 }
92 93
93 if (source_ptr_) { 94 if (source_ptr_) {
94 std::memcpy(destination, source_ptr_, frames * sizeof(*destination)); 95 std::memcpy(destination, source_ptr_, frames * sizeof(*destination));
95 } else { 96 } else {
96 for (int i = 0; i < frames; ++i) 97 for (size_t i = 0; i < frames; ++i)
97 destination[i] = static_cast<float>(source_ptr_int_[i]); 98 destination[i] = static_cast<float>(source_ptr_int_[i]);
98 } 99 }
99 source_available_ -= frames; 100 source_available_ -= frames;
100 } 101 }
101 102
102 } // namespace webrtc 103 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/common_audio/resampler/push_sinc_resampler.h ('k') | webrtc/common_audio/resampler/push_sinc_resampler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698