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

Side by Side Diff: webrtc/voice_engine/utility_unittest.cc

Issue 2750783004: Add mute state field to AudioFrame. (Closed)
Patch Set: Update new usages of AudioFrame::data_ Created 3 years, 6 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
« no previous file with comments | « webrtc/voice_engine/utility.cc ('k') | webrtc/voice_engine/voe_base_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
(...skipping 29 matching lines...) Expand all
40 PushResampler<int16_t> resampler_; 40 PushResampler<int16_t> resampler_;
41 AudioFrame src_frame_; 41 AudioFrame src_frame_;
42 AudioFrame dst_frame_; 42 AudioFrame dst_frame_;
43 AudioFrame golden_frame_; 43 AudioFrame golden_frame_;
44 }; 44 };
45 45
46 // Sets the signal value to increase by |data| with every sample. Floats are 46 // Sets the signal value to increase by |data| with every sample. Floats are
47 // used so non-integer values result in rounding error, but not an accumulating 47 // used so non-integer values result in rounding error, but not an accumulating
48 // error. 48 // error.
49 void SetMonoFrame(float data, int sample_rate_hz, AudioFrame* frame) { 49 void SetMonoFrame(float data, int sample_rate_hz, AudioFrame* frame) {
50 memset(frame->data_, 0, sizeof(frame->data_)); 50 frame->Mute();
51 frame->num_channels_ = 1; 51 frame->num_channels_ = 1;
52 frame->sample_rate_hz_ = sample_rate_hz; 52 frame->sample_rate_hz_ = sample_rate_hz;
53 frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100); 53 frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100);
54 int16_t* frame_data = frame->mutable_data();
54 for (size_t i = 0; i < frame->samples_per_channel_; i++) { 55 for (size_t i = 0; i < frame->samples_per_channel_; i++) {
55 frame->data_[i] = static_cast<int16_t>(data * i); 56 frame_data[i] = static_cast<int16_t>(data * i);
56 } 57 }
57 } 58 }
58 59
59 // Keep the existing sample rate. 60 // Keep the existing sample rate.
60 void SetMonoFrame(float data, AudioFrame* frame) { 61 void SetMonoFrame(float data, AudioFrame* frame) {
61 SetMonoFrame(data, frame->sample_rate_hz_, frame); 62 SetMonoFrame(data, frame->sample_rate_hz_, frame);
62 } 63 }
63 64
64 // Sets the signal value to increase by |left| and |right| with every sample in 65 // Sets the signal value to increase by |left| and |right| with every sample in
65 // each channel respectively. 66 // each channel respectively.
66 void SetStereoFrame(float left, 67 void SetStereoFrame(float left,
67 float right, 68 float right,
68 int sample_rate_hz, 69 int sample_rate_hz,
69 AudioFrame* frame) { 70 AudioFrame* frame) {
70 memset(frame->data_, 0, sizeof(frame->data_)); 71 frame->Mute();
71 frame->num_channels_ = 2; 72 frame->num_channels_ = 2;
72 frame->sample_rate_hz_ = sample_rate_hz; 73 frame->sample_rate_hz_ = sample_rate_hz;
73 frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100); 74 frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100);
75 int16_t* frame_data = frame->mutable_data();
74 for (size_t i = 0; i < frame->samples_per_channel_; i++) { 76 for (size_t i = 0; i < frame->samples_per_channel_; i++) {
75 frame->data_[i * 2] = static_cast<int16_t>(left * i); 77 frame_data[i * 2] = static_cast<int16_t>(left * i);
76 frame->data_[i * 2 + 1] = static_cast<int16_t>(right * i); 78 frame_data[i * 2 + 1] = static_cast<int16_t>(right * i);
77 } 79 }
78 } 80 }
79 81
80 // Keep the existing sample rate. 82 // Keep the existing sample rate.
81 void SetStereoFrame(float left, float right, AudioFrame* frame) { 83 void SetStereoFrame(float left, float right, AudioFrame* frame) {
82 SetStereoFrame(left, right, frame->sample_rate_hz_, frame); 84 SetStereoFrame(left, right, frame->sample_rate_hz_, frame);
83 } 85 }
84 86
85 // Sets the signal value to increase by |ch1|, |ch2|, |ch3|, |ch4| with every 87 // Sets the signal value to increase by |ch1|, |ch2|, |ch3|, |ch4| with every
86 // sample in each channel respectively. 88 // sample in each channel respectively.
87 void SetQuadFrame(float ch1, 89 void SetQuadFrame(float ch1,
88 float ch2, 90 float ch2,
89 float ch3, 91 float ch3,
90 float ch4, 92 float ch4,
91 int sample_rate_hz, 93 int sample_rate_hz,
92 AudioFrame* frame) { 94 AudioFrame* frame) {
93 memset(frame->data_, 0, sizeof(frame->data_)); 95 frame->Mute();
94 frame->num_channels_ = 4; 96 frame->num_channels_ = 4;
95 frame->sample_rate_hz_ = sample_rate_hz; 97 frame->sample_rate_hz_ = sample_rate_hz;
96 frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100); 98 frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100);
99 int16_t* frame_data = frame->mutable_data();
97 for (size_t i = 0; i < frame->samples_per_channel_; i++) { 100 for (size_t i = 0; i < frame->samples_per_channel_; i++) {
98 frame->data_[i * 4] = static_cast<int16_t>(ch1 * i); 101 frame_data[i * 4] = static_cast<int16_t>(ch1 * i);
99 frame->data_[i * 4 + 1] = static_cast<int16_t>(ch2 * i); 102 frame_data[i * 4 + 1] = static_cast<int16_t>(ch2 * i);
100 frame->data_[i * 4 + 2] = static_cast<int16_t>(ch3 * i); 103 frame_data[i * 4 + 2] = static_cast<int16_t>(ch3 * i);
101 frame->data_[i * 4 + 3] = static_cast<int16_t>(ch4 * i); 104 frame_data[i * 4 + 3] = static_cast<int16_t>(ch4 * i);
102 } 105 }
103 } 106 }
104 107
105 void VerifyParams(const AudioFrame& ref_frame, const AudioFrame& test_frame) { 108 void VerifyParams(const AudioFrame& ref_frame, const AudioFrame& test_frame) {
106 EXPECT_EQ(ref_frame.num_channels_, test_frame.num_channels_); 109 EXPECT_EQ(ref_frame.num_channels_, test_frame.num_channels_);
107 EXPECT_EQ(ref_frame.samples_per_channel_, test_frame.samples_per_channel_); 110 EXPECT_EQ(ref_frame.samples_per_channel_, test_frame.samples_per_channel_);
108 EXPECT_EQ(ref_frame.sample_rate_hz_, test_frame.sample_rate_hz_); 111 EXPECT_EQ(ref_frame.sample_rate_hz_, test_frame.sample_rate_hz_);
109 } 112 }
110 113
111 // Computes the best SNR based on the error between |ref_frame| and 114 // Computes the best SNR based on the error between |ref_frame| and
112 // |test_frame|. It allows for up to a |max_delay| in samples between the 115 // |test_frame|. It allows for up to a |max_delay| in samples between the
113 // signals to compensate for the resampling delay. 116 // signals to compensate for the resampling delay.
114 float ComputeSNR(const AudioFrame& ref_frame, const AudioFrame& test_frame, 117 float ComputeSNR(const AudioFrame& ref_frame, const AudioFrame& test_frame,
115 size_t max_delay) { 118 size_t max_delay) {
116 VerifyParams(ref_frame, test_frame); 119 VerifyParams(ref_frame, test_frame);
117 float best_snr = 0; 120 float best_snr = 0;
118 size_t best_delay = 0; 121 size_t best_delay = 0;
119 for (size_t delay = 0; delay <= max_delay; delay++) { 122 for (size_t delay = 0; delay <= max_delay; delay++) {
120 float mse = 0; 123 float mse = 0;
121 float variance = 0; 124 float variance = 0;
125 const int16_t* ref_frame_data = ref_frame.data();
126 const int16_t* test_frame_data = test_frame.data();
122 for (size_t i = 0; i < ref_frame.samples_per_channel_ * 127 for (size_t i = 0; i < ref_frame.samples_per_channel_ *
123 ref_frame.num_channels_ - delay; i++) { 128 ref_frame.num_channels_ - delay; i++) {
124 int error = ref_frame.data_[i] - test_frame.data_[i + delay]; 129 int error = ref_frame_data[i] - test_frame_data[i + delay];
125 mse += error * error; 130 mse += error * error;
126 variance += ref_frame.data_[i] * ref_frame.data_[i]; 131 variance += ref_frame_data[i] * ref_frame_data[i];
127 } 132 }
128 float snr = 100; // We assign 100 dB to the zero-error case. 133 float snr = 100; // We assign 100 dB to the zero-error case.
129 if (mse > 0) 134 if (mse > 0)
130 snr = 10 * log10(variance / mse); 135 snr = 10 * log10(variance / mse);
131 if (snr > best_snr) { 136 if (snr > best_snr) {
132 best_snr = snr; 137 best_snr = snr;
133 best_delay = delay; 138 best_delay = delay;
134 } 139 }
135 } 140 }
136 printf("SNR=%.1f dB at delay=%" PRIuS "\n", best_snr, best_delay); 141 printf("SNR=%.1f dB at delay=%" PRIuS "\n", best_snr, best_delay);
137 return best_snr; 142 return best_snr;
138 } 143 }
139 144
140 void VerifyFramesAreEqual(const AudioFrame& ref_frame, 145 void VerifyFramesAreEqual(const AudioFrame& ref_frame,
141 const AudioFrame& test_frame) { 146 const AudioFrame& test_frame) {
142 VerifyParams(ref_frame, test_frame); 147 VerifyParams(ref_frame, test_frame);
148 const int16_t* ref_frame_data = ref_frame.data();
149 const int16_t* test_frame_data = test_frame.data();
143 for (size_t i = 0; 150 for (size_t i = 0;
144 i < ref_frame.samples_per_channel_ * ref_frame.num_channels_; i++) { 151 i < ref_frame.samples_per_channel_ * ref_frame.num_channels_; i++) {
145 EXPECT_EQ(ref_frame.data_[i], test_frame.data_[i]); 152 EXPECT_EQ(ref_frame_data[i], test_frame_data[i]);
146 } 153 }
147 } 154 }
148 155
149 void UtilityTest::RunResampleTest(int src_channels, 156 void UtilityTest::RunResampleTest(int src_channels,
150 int src_sample_rate_hz, 157 int src_sample_rate_hz,
151 int dst_channels, 158 int dst_channels,
152 int dst_sample_rate_hz) { 159 int dst_sample_rate_hz) {
153 PushResampler<int16_t> resampler; // Create a new one with every test. 160 PushResampler<int16_t> resampler; // Create a new one with every test.
154 const int16_t kSrcCh1 = 30; // Shouldn't overflow for any used sample rate. 161 const int16_t kSrcCh1 = 30; // Shouldn't overflow for any used sample rate.
155 const int16_t kSrcCh2 = 15; 162 const int16_t kSrcCh2 = 15;
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 kDstChannels[dst_channel], kSampleRates[dst_rate]); 267 kDstChannels[dst_channel], kSampleRates[dst_rate]);
261 } 268 }
262 } 269 }
263 } 270 }
264 } 271 }
265 } 272 }
266 273
267 } // namespace 274 } // namespace
268 } // namespace voe 275 } // namespace voe
269 } // namespace webrtc 276 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/voice_engine/utility.cc ('k') | webrtc/voice_engine/voe_base_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698