xref: /aosp_15_r20/external/webrtc/audio/utility/audio_frame_operations_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
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
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "audio/utility/audio_frame_operations.h"
12 
13 #include "rtc_base/checks.h"
14 #include "test/gtest.h"
15 
16 namespace webrtc {
17 namespace {
18 
19 class AudioFrameOperationsTest : public ::testing::Test {
20  protected:
AudioFrameOperationsTest()21   AudioFrameOperationsTest() {
22     // Set typical values.
23     frame_.samples_per_channel_ = 320;
24     frame_.num_channels_ = 2;
25   }
26 
27   AudioFrame frame_;
28 };
29 
30 class AudioFrameOperationsDeathTest : public AudioFrameOperationsTest {};
31 
SetFrameData(int16_t ch1,int16_t ch2,int16_t ch3,int16_t ch4,AudioFrame * frame)32 void SetFrameData(int16_t ch1,
33                   int16_t ch2,
34                   int16_t ch3,
35                   int16_t ch4,
36                   AudioFrame* frame) {
37   int16_t* frame_data = frame->mutable_data();
38   for (size_t i = 0; i < frame->samples_per_channel_ * 4; i += 4) {
39     frame_data[i] = ch1;
40     frame_data[i + 1] = ch2;
41     frame_data[i + 2] = ch3;
42     frame_data[i + 3] = ch4;
43   }
44 }
45 
SetFrameData(int16_t left,int16_t right,AudioFrame * frame)46 void SetFrameData(int16_t left, int16_t right, AudioFrame* frame) {
47   int16_t* frame_data = frame->mutable_data();
48   for (size_t i = 0; i < frame->samples_per_channel_ * 2; i += 2) {
49     frame_data[i] = left;
50     frame_data[i + 1] = right;
51   }
52 }
53 
SetFrameData(int16_t data,AudioFrame * frame)54 void SetFrameData(int16_t data, AudioFrame* frame) {
55   int16_t* frame_data = frame->mutable_data();
56   for (size_t i = 0; i < frame->samples_per_channel_ * frame->num_channels_;
57        i++) {
58     frame_data[i] = data;
59   }
60 }
61 
VerifyFramesAreEqual(const AudioFrame & frame1,const AudioFrame & frame2)62 void VerifyFramesAreEqual(const AudioFrame& frame1, const AudioFrame& frame2) {
63   EXPECT_EQ(frame1.num_channels_, frame2.num_channels_);
64   EXPECT_EQ(frame1.samples_per_channel_, frame2.samples_per_channel_);
65   const int16_t* frame1_data = frame1.data();
66   const int16_t* frame2_data = frame2.data();
67   for (size_t i = 0; i < frame1.samples_per_channel_ * frame1.num_channels_;
68        i++) {
69     EXPECT_EQ(frame1_data[i], frame2_data[i]);
70   }
71   EXPECT_EQ(frame1.muted(), frame2.muted());
72 }
73 
InitFrame(AudioFrame * frame,size_t channels,size_t samples_per_channel,int16_t left_data,int16_t right_data)74 void InitFrame(AudioFrame* frame,
75                size_t channels,
76                size_t samples_per_channel,
77                int16_t left_data,
78                int16_t right_data) {
79   RTC_DCHECK(frame);
80   RTC_DCHECK_GE(2, channels);
81   RTC_DCHECK_GE(AudioFrame::kMaxDataSizeSamples,
82                 samples_per_channel * channels);
83   frame->samples_per_channel_ = samples_per_channel;
84   frame->num_channels_ = channels;
85   if (channels == 2) {
86     SetFrameData(left_data, right_data, frame);
87   } else if (channels == 1) {
88     SetFrameData(left_data, frame);
89   }
90 }
91 
GetChannelData(const AudioFrame & frame,size_t channel,size_t index)92 int16_t GetChannelData(const AudioFrame& frame, size_t channel, size_t index) {
93   RTC_DCHECK_LT(channel, frame.num_channels_);
94   RTC_DCHECK_LT(index, frame.samples_per_channel_);
95   return frame.data()[index * frame.num_channels_ + channel];
96 }
97 
VerifyFrameDataBounds(const AudioFrame & frame,size_t channel,int16_t max,int16_t min)98 void VerifyFrameDataBounds(const AudioFrame& frame,
99                            size_t channel,
100                            int16_t max,
101                            int16_t min) {
102   for (size_t i = 0; i < frame.samples_per_channel_; ++i) {
103     int16_t s = GetChannelData(frame, channel, i);
104     EXPECT_LE(min, s);
105     EXPECT_GE(max, s);
106   }
107 }
108 
109 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
TEST_F(AudioFrameOperationsDeathTest,MonoToStereoFailsWithBadParameters)110 TEST_F(AudioFrameOperationsDeathTest, MonoToStereoFailsWithBadParameters) {
111   EXPECT_DEATH(AudioFrameOperations::UpmixChannels(2, &frame_), "");
112   frame_.samples_per_channel_ = AudioFrame::kMaxDataSizeSamples;
113   frame_.num_channels_ = 1;
114   EXPECT_DEATH(AudioFrameOperations::UpmixChannels(2, &frame_), "");
115 }
116 #endif
117 
TEST_F(AudioFrameOperationsTest,MonoToStereoSucceeds)118 TEST_F(AudioFrameOperationsTest, MonoToStereoSucceeds) {
119   frame_.num_channels_ = 1;
120   SetFrameData(1, &frame_);
121 
122   AudioFrameOperations::UpmixChannels(2, &frame_);
123   EXPECT_EQ(2u, frame_.num_channels_);
124 
125   AudioFrame stereo_frame;
126   stereo_frame.samples_per_channel_ = 320;
127   stereo_frame.num_channels_ = 2;
128   SetFrameData(1, 1, &stereo_frame);
129   VerifyFramesAreEqual(stereo_frame, frame_);
130 }
131 
TEST_F(AudioFrameOperationsTest,MonoToStereoMuted)132 TEST_F(AudioFrameOperationsTest, MonoToStereoMuted) {
133   frame_.num_channels_ = 1;
134   ASSERT_TRUE(frame_.muted());
135   AudioFrameOperations::UpmixChannels(2, &frame_);
136   EXPECT_EQ(2u, frame_.num_channels_);
137   EXPECT_TRUE(frame_.muted());
138 }
139 
140 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
TEST_F(AudioFrameOperationsDeathTest,StereoToMonoFailsWithBadParameters)141 TEST_F(AudioFrameOperationsDeathTest, StereoToMonoFailsWithBadParameters) {
142   frame_.num_channels_ = 1;
143   EXPECT_DEATH(AudioFrameOperations::DownmixChannels(1, &frame_), "");
144 }
145 #endif
146 
TEST_F(AudioFrameOperationsTest,StereoToMonoSucceeds)147 TEST_F(AudioFrameOperationsTest, StereoToMonoSucceeds) {
148   SetFrameData(4, 2, &frame_);
149   AudioFrameOperations::DownmixChannels(1, &frame_);
150   EXPECT_EQ(1u, frame_.num_channels_);
151 
152   AudioFrame mono_frame;
153   mono_frame.samples_per_channel_ = 320;
154   mono_frame.num_channels_ = 1;
155   SetFrameData(3, &mono_frame);
156   VerifyFramesAreEqual(mono_frame, frame_);
157 }
158 
TEST_F(AudioFrameOperationsTest,StereoToMonoMuted)159 TEST_F(AudioFrameOperationsTest, StereoToMonoMuted) {
160   ASSERT_TRUE(frame_.muted());
161   AudioFrameOperations::DownmixChannels(1, &frame_);
162   EXPECT_EQ(1u, frame_.num_channels_);
163   EXPECT_TRUE(frame_.muted());
164 }
165 
TEST_F(AudioFrameOperationsTest,StereoToMonoBufferSucceeds)166 TEST_F(AudioFrameOperationsTest, StereoToMonoBufferSucceeds) {
167   AudioFrame target_frame;
168   SetFrameData(4, 2, &frame_);
169 
170   target_frame.num_channels_ = 1;
171   target_frame.samples_per_channel_ = frame_.samples_per_channel_;
172 
173   AudioFrameOperations::DownmixChannels(frame_.data(), 2,
174                                         frame_.samples_per_channel_, 1,
175                                         target_frame.mutable_data());
176 
177   AudioFrame mono_frame;
178   mono_frame.samples_per_channel_ = 320;
179   mono_frame.num_channels_ = 1;
180   SetFrameData(3, &mono_frame);
181   VerifyFramesAreEqual(mono_frame, target_frame);
182 }
183 
TEST_F(AudioFrameOperationsTest,StereoToMonoDoesNotWrapAround)184 TEST_F(AudioFrameOperationsTest, StereoToMonoDoesNotWrapAround) {
185   SetFrameData(-32768, -32768, &frame_);
186   AudioFrameOperations::DownmixChannels(1, &frame_);
187   EXPECT_EQ(1u, frame_.num_channels_);
188   AudioFrame mono_frame;
189   mono_frame.samples_per_channel_ = 320;
190   mono_frame.num_channels_ = 1;
191   SetFrameData(-32768, &mono_frame);
192   VerifyFramesAreEqual(mono_frame, frame_);
193 }
194 
TEST_F(AudioFrameOperationsTest,QuadToMonoSucceeds)195 TEST_F(AudioFrameOperationsTest, QuadToMonoSucceeds) {
196   frame_.num_channels_ = 4;
197   SetFrameData(4, 2, 6, 8, &frame_);
198 
199   AudioFrameOperations::DownmixChannels(1, &frame_);
200   EXPECT_EQ(1u, frame_.num_channels_);
201 
202   AudioFrame mono_frame;
203   mono_frame.samples_per_channel_ = 320;
204   mono_frame.num_channels_ = 1;
205   SetFrameData(5, &mono_frame);
206   VerifyFramesAreEqual(mono_frame, frame_);
207 }
208 
TEST_F(AudioFrameOperationsTest,QuadToMonoMuted)209 TEST_F(AudioFrameOperationsTest, QuadToMonoMuted) {
210   frame_.num_channels_ = 4;
211   ASSERT_TRUE(frame_.muted());
212   AudioFrameOperations::DownmixChannels(1, &frame_);
213   EXPECT_EQ(1u, frame_.num_channels_);
214   EXPECT_TRUE(frame_.muted());
215 }
216 
TEST_F(AudioFrameOperationsTest,QuadToMonoBufferSucceeds)217 TEST_F(AudioFrameOperationsTest, QuadToMonoBufferSucceeds) {
218   AudioFrame target_frame;
219   frame_.num_channels_ = 4;
220   SetFrameData(4, 2, 6, 8, &frame_);
221 
222   target_frame.num_channels_ = 1;
223   target_frame.samples_per_channel_ = frame_.samples_per_channel_;
224 
225   AudioFrameOperations::DownmixChannels(frame_.data(), 4,
226                                         frame_.samples_per_channel_, 1,
227                                         target_frame.mutable_data());
228   AudioFrame mono_frame;
229   mono_frame.samples_per_channel_ = 320;
230   mono_frame.num_channels_ = 1;
231   SetFrameData(5, &mono_frame);
232   VerifyFramesAreEqual(mono_frame, target_frame);
233 }
234 
TEST_F(AudioFrameOperationsTest,QuadToMonoDoesNotWrapAround)235 TEST_F(AudioFrameOperationsTest, QuadToMonoDoesNotWrapAround) {
236   frame_.num_channels_ = 4;
237   SetFrameData(-32768, -32768, -32768, -32768, &frame_);
238   AudioFrameOperations::DownmixChannels(1, &frame_);
239   EXPECT_EQ(1u, frame_.num_channels_);
240 
241   AudioFrame mono_frame;
242   mono_frame.samples_per_channel_ = 320;
243   mono_frame.num_channels_ = 1;
244   SetFrameData(-32768, &mono_frame);
245   VerifyFramesAreEqual(mono_frame, frame_);
246 }
247 
TEST_F(AudioFrameOperationsTest,QuadToStereoFailsWithBadParameters)248 TEST_F(AudioFrameOperationsTest, QuadToStereoFailsWithBadParameters) {
249   frame_.num_channels_ = 1;
250   EXPECT_EQ(-1, AudioFrameOperations::QuadToStereo(&frame_));
251   frame_.num_channels_ = 2;
252   EXPECT_EQ(-1, AudioFrameOperations::QuadToStereo(&frame_));
253 }
254 
TEST_F(AudioFrameOperationsTest,QuadToStereoSucceeds)255 TEST_F(AudioFrameOperationsTest, QuadToStereoSucceeds) {
256   frame_.num_channels_ = 4;
257   SetFrameData(4, 2, 6, 8, &frame_);
258   EXPECT_EQ(0, AudioFrameOperations::QuadToStereo(&frame_));
259 
260   AudioFrame stereo_frame;
261   stereo_frame.samples_per_channel_ = 320;
262   stereo_frame.num_channels_ = 2;
263   SetFrameData(3, 7, &stereo_frame);
264   VerifyFramesAreEqual(stereo_frame, frame_);
265 }
266 
TEST_F(AudioFrameOperationsTest,QuadToStereoMuted)267 TEST_F(AudioFrameOperationsTest, QuadToStereoMuted) {
268   frame_.num_channels_ = 4;
269   ASSERT_TRUE(frame_.muted());
270   EXPECT_EQ(0, AudioFrameOperations::QuadToStereo(&frame_));
271   EXPECT_TRUE(frame_.muted());
272 }
273 
TEST_F(AudioFrameOperationsTest,QuadToStereoBufferSucceeds)274 TEST_F(AudioFrameOperationsTest, QuadToStereoBufferSucceeds) {
275   AudioFrame target_frame;
276   frame_.num_channels_ = 4;
277   SetFrameData(4, 2, 6, 8, &frame_);
278 
279   target_frame.num_channels_ = 2;
280   target_frame.samples_per_channel_ = frame_.samples_per_channel_;
281 
282   AudioFrameOperations::QuadToStereo(frame_.data(), frame_.samples_per_channel_,
283                                      target_frame.mutable_data());
284   AudioFrame stereo_frame;
285   stereo_frame.samples_per_channel_ = 320;
286   stereo_frame.num_channels_ = 2;
287   SetFrameData(3, 7, &stereo_frame);
288   VerifyFramesAreEqual(stereo_frame, target_frame);
289 }
290 
TEST_F(AudioFrameOperationsTest,QuadToStereoDoesNotWrapAround)291 TEST_F(AudioFrameOperationsTest, QuadToStereoDoesNotWrapAround) {
292   frame_.num_channels_ = 4;
293   SetFrameData(-32768, -32768, -32768, -32768, &frame_);
294   EXPECT_EQ(0, AudioFrameOperations::QuadToStereo(&frame_));
295 
296   AudioFrame stereo_frame;
297   stereo_frame.samples_per_channel_ = 320;
298   stereo_frame.num_channels_ = 2;
299   SetFrameData(-32768, -32768, &stereo_frame);
300   VerifyFramesAreEqual(stereo_frame, frame_);
301 }
302 
TEST_F(AudioFrameOperationsTest,SwapStereoChannelsSucceedsOnStereo)303 TEST_F(AudioFrameOperationsTest, SwapStereoChannelsSucceedsOnStereo) {
304   SetFrameData(0, 1, &frame_);
305 
306   AudioFrame swapped_frame;
307   swapped_frame.samples_per_channel_ = 320;
308   swapped_frame.num_channels_ = 2;
309   SetFrameData(1, 0, &swapped_frame);
310 
311   AudioFrameOperations::SwapStereoChannels(&frame_);
312   VerifyFramesAreEqual(swapped_frame, frame_);
313 }
314 
TEST_F(AudioFrameOperationsTest,SwapStereoChannelsMuted)315 TEST_F(AudioFrameOperationsTest, SwapStereoChannelsMuted) {
316   ASSERT_TRUE(frame_.muted());
317   AudioFrameOperations::SwapStereoChannels(&frame_);
318   EXPECT_TRUE(frame_.muted());
319 }
320 
TEST_F(AudioFrameOperationsTest,SwapStereoChannelsFailsOnMono)321 TEST_F(AudioFrameOperationsTest, SwapStereoChannelsFailsOnMono) {
322   frame_.num_channels_ = 1;
323   // Set data to "stereo", despite it being a mono frame.
324   SetFrameData(0, 1, &frame_);
325 
326   AudioFrame orig_frame;
327   orig_frame.CopyFrom(frame_);
328   AudioFrameOperations::SwapStereoChannels(&frame_);
329   // Verify that no swap occurred.
330   VerifyFramesAreEqual(orig_frame, frame_);
331 }
332 
TEST_F(AudioFrameOperationsTest,MuteDisabled)333 TEST_F(AudioFrameOperationsTest, MuteDisabled) {
334   SetFrameData(1000, -1000, &frame_);
335   AudioFrameOperations::Mute(&frame_, false, false);
336 
337   AudioFrame muted_frame;
338   muted_frame.samples_per_channel_ = 320;
339   muted_frame.num_channels_ = 2;
340   SetFrameData(1000, -1000, &muted_frame);
341   VerifyFramesAreEqual(muted_frame, frame_);
342 }
343 
TEST_F(AudioFrameOperationsTest,MuteEnabled)344 TEST_F(AudioFrameOperationsTest, MuteEnabled) {
345   SetFrameData(1000, -1000, &frame_);
346   AudioFrameOperations::Mute(&frame_, true, true);
347 
348   AudioFrame muted_frame;
349   muted_frame.samples_per_channel_ = frame_.samples_per_channel_;
350   muted_frame.num_channels_ = frame_.num_channels_;
351   ASSERT_TRUE(muted_frame.muted());
352   VerifyFramesAreEqual(muted_frame, frame_);
353 }
354 
355 // Verify that *beginning* to mute works for short and long (>128) frames, mono
356 // and stereo. Beginning mute should yield a ramp down to zero.
TEST_F(AudioFrameOperationsTest,MuteBeginMonoLong)357 TEST_F(AudioFrameOperationsTest, MuteBeginMonoLong) {
358   InitFrame(&frame_, 1, 228, 1000, -1000);
359   AudioFrameOperations::Mute(&frame_, false, true);
360   VerifyFrameDataBounds(frame_, 0, 1000, 0);
361   EXPECT_EQ(1000, GetChannelData(frame_, 0, 99));
362   EXPECT_EQ(992, GetChannelData(frame_, 0, 100));
363   EXPECT_EQ(7, GetChannelData(frame_, 0, 226));
364   EXPECT_EQ(0, GetChannelData(frame_, 0, 227));
365 }
366 
TEST_F(AudioFrameOperationsTest,MuteBeginMonoShort)367 TEST_F(AudioFrameOperationsTest, MuteBeginMonoShort) {
368   InitFrame(&frame_, 1, 93, 1000, -1000);
369   AudioFrameOperations::Mute(&frame_, false, true);
370   VerifyFrameDataBounds(frame_, 0, 1000, 0);
371   EXPECT_EQ(989, GetChannelData(frame_, 0, 0));
372   EXPECT_EQ(978, GetChannelData(frame_, 0, 1));
373   EXPECT_EQ(10, GetChannelData(frame_, 0, 91));
374   EXPECT_EQ(0, GetChannelData(frame_, 0, 92));
375 }
376 
TEST_F(AudioFrameOperationsTest,MuteBeginStereoLong)377 TEST_F(AudioFrameOperationsTest, MuteBeginStereoLong) {
378   InitFrame(&frame_, 2, 228, 1000, -1000);
379   AudioFrameOperations::Mute(&frame_, false, true);
380   VerifyFrameDataBounds(frame_, 0, 1000, 0);
381   VerifyFrameDataBounds(frame_, 1, 0, -1000);
382   EXPECT_EQ(1000, GetChannelData(frame_, 0, 99));
383   EXPECT_EQ(-1000, GetChannelData(frame_, 1, 99));
384   EXPECT_EQ(992, GetChannelData(frame_, 0, 100));
385   EXPECT_EQ(-992, GetChannelData(frame_, 1, 100));
386   EXPECT_EQ(7, GetChannelData(frame_, 0, 226));
387   EXPECT_EQ(-7, GetChannelData(frame_, 1, 226));
388   EXPECT_EQ(0, GetChannelData(frame_, 0, 227));
389   EXPECT_EQ(0, GetChannelData(frame_, 1, 227));
390 }
391 
TEST_F(AudioFrameOperationsTest,MuteBeginStereoShort)392 TEST_F(AudioFrameOperationsTest, MuteBeginStereoShort) {
393   InitFrame(&frame_, 2, 93, 1000, -1000);
394   AudioFrameOperations::Mute(&frame_, false, true);
395   VerifyFrameDataBounds(frame_, 0, 1000, 0);
396   VerifyFrameDataBounds(frame_, 1, 0, -1000);
397   EXPECT_EQ(989, GetChannelData(frame_, 0, 0));
398   EXPECT_EQ(-989, GetChannelData(frame_, 1, 0));
399   EXPECT_EQ(978, GetChannelData(frame_, 0, 1));
400   EXPECT_EQ(-978, GetChannelData(frame_, 1, 1));
401   EXPECT_EQ(10, GetChannelData(frame_, 0, 91));
402   EXPECT_EQ(-10, GetChannelData(frame_, 1, 91));
403   EXPECT_EQ(0, GetChannelData(frame_, 0, 92));
404   EXPECT_EQ(0, GetChannelData(frame_, 1, 92));
405 }
406 
407 // Verify that *ending* to mute works for short and long (>128) frames, mono
408 // and stereo. Ending mute should yield a ramp up from zero.
TEST_F(AudioFrameOperationsTest,MuteEndMonoLong)409 TEST_F(AudioFrameOperationsTest, MuteEndMonoLong) {
410   InitFrame(&frame_, 1, 228, 1000, -1000);
411   AudioFrameOperations::Mute(&frame_, true, false);
412   VerifyFrameDataBounds(frame_, 0, 1000, 0);
413   EXPECT_EQ(7, GetChannelData(frame_, 0, 0));
414   EXPECT_EQ(15, GetChannelData(frame_, 0, 1));
415   EXPECT_EQ(1000, GetChannelData(frame_, 0, 127));
416   EXPECT_EQ(1000, GetChannelData(frame_, 0, 128));
417 }
418 
TEST_F(AudioFrameOperationsTest,MuteEndMonoShort)419 TEST_F(AudioFrameOperationsTest, MuteEndMonoShort) {
420   InitFrame(&frame_, 1, 93, 1000, -1000);
421   AudioFrameOperations::Mute(&frame_, true, false);
422   VerifyFrameDataBounds(frame_, 0, 1000, 0);
423   EXPECT_EQ(10, GetChannelData(frame_, 0, 0));
424   EXPECT_EQ(21, GetChannelData(frame_, 0, 1));
425   EXPECT_EQ(989, GetChannelData(frame_, 0, 91));
426   EXPECT_EQ(999, GetChannelData(frame_, 0, 92));
427 }
428 
TEST_F(AudioFrameOperationsTest,MuteEndStereoLong)429 TEST_F(AudioFrameOperationsTest, MuteEndStereoLong) {
430   InitFrame(&frame_, 2, 228, 1000, -1000);
431   AudioFrameOperations::Mute(&frame_, true, false);
432   VerifyFrameDataBounds(frame_, 0, 1000, 0);
433   VerifyFrameDataBounds(frame_, 1, 0, -1000);
434   EXPECT_EQ(7, GetChannelData(frame_, 0, 0));
435   EXPECT_EQ(-7, GetChannelData(frame_, 1, 0));
436   EXPECT_EQ(15, GetChannelData(frame_, 0, 1));
437   EXPECT_EQ(-15, GetChannelData(frame_, 1, 1));
438   EXPECT_EQ(1000, GetChannelData(frame_, 0, 127));
439   EXPECT_EQ(-1000, GetChannelData(frame_, 1, 127));
440   EXPECT_EQ(1000, GetChannelData(frame_, 0, 128));
441   EXPECT_EQ(-1000, GetChannelData(frame_, 1, 128));
442 }
443 
TEST_F(AudioFrameOperationsTest,MuteEndStereoShort)444 TEST_F(AudioFrameOperationsTest, MuteEndStereoShort) {
445   InitFrame(&frame_, 2, 93, 1000, -1000);
446   AudioFrameOperations::Mute(&frame_, true, false);
447   VerifyFrameDataBounds(frame_, 0, 1000, 0);
448   VerifyFrameDataBounds(frame_, 1, 0, -1000);
449   EXPECT_EQ(10, GetChannelData(frame_, 0, 0));
450   EXPECT_EQ(-10, GetChannelData(frame_, 1, 0));
451   EXPECT_EQ(21, GetChannelData(frame_, 0, 1));
452   EXPECT_EQ(-21, GetChannelData(frame_, 1, 1));
453   EXPECT_EQ(989, GetChannelData(frame_, 0, 91));
454   EXPECT_EQ(-989, GetChannelData(frame_, 1, 91));
455   EXPECT_EQ(999, GetChannelData(frame_, 0, 92));
456   EXPECT_EQ(-999, GetChannelData(frame_, 1, 92));
457 }
458 
TEST_F(AudioFrameOperationsTest,MuteBeginAlreadyMuted)459 TEST_F(AudioFrameOperationsTest, MuteBeginAlreadyMuted) {
460   ASSERT_TRUE(frame_.muted());
461   AudioFrameOperations::Mute(&frame_, false, true);
462   EXPECT_TRUE(frame_.muted());
463 }
464 
TEST_F(AudioFrameOperationsTest,MuteEndAlreadyMuted)465 TEST_F(AudioFrameOperationsTest, MuteEndAlreadyMuted) {
466   ASSERT_TRUE(frame_.muted());
467   AudioFrameOperations::Mute(&frame_, true, false);
468   EXPECT_TRUE(frame_.muted());
469 }
470 
TEST_F(AudioFrameOperationsTest,ApplyHalfGainSucceeds)471 TEST_F(AudioFrameOperationsTest, ApplyHalfGainSucceeds) {
472   SetFrameData(2, &frame_);
473 
474   AudioFrame half_gain_frame;
475   half_gain_frame.num_channels_ = frame_.num_channels_;
476   half_gain_frame.samples_per_channel_ = frame_.samples_per_channel_;
477   SetFrameData(1, &half_gain_frame);
478 
479   AudioFrameOperations::ApplyHalfGain(&frame_);
480   VerifyFramesAreEqual(half_gain_frame, frame_);
481 }
482 
TEST_F(AudioFrameOperationsTest,ApplyHalfGainMuted)483 TEST_F(AudioFrameOperationsTest, ApplyHalfGainMuted) {
484   ASSERT_TRUE(frame_.muted());
485   AudioFrameOperations::ApplyHalfGain(&frame_);
486   EXPECT_TRUE(frame_.muted());
487 }
488 
489 // TODO(andrew): should not allow negative scales.
TEST_F(AudioFrameOperationsTest,DISABLED_ScaleFailsWithBadParameters)490 TEST_F(AudioFrameOperationsTest, DISABLED_ScaleFailsWithBadParameters) {
491   frame_.num_channels_ = 1;
492   EXPECT_EQ(-1, AudioFrameOperations::Scale(1.0, 1.0, &frame_));
493 
494   frame_.num_channels_ = 3;
495   EXPECT_EQ(-1, AudioFrameOperations::Scale(1.0, 1.0, &frame_));
496 
497   frame_.num_channels_ = 2;
498   EXPECT_EQ(-1, AudioFrameOperations::Scale(-1.0, 1.0, &frame_));
499   EXPECT_EQ(-1, AudioFrameOperations::Scale(1.0, -1.0, &frame_));
500 }
501 
502 // TODO(andrew): fix the wraparound bug. We should always saturate.
TEST_F(AudioFrameOperationsTest,DISABLED_ScaleDoesNotWrapAround)503 TEST_F(AudioFrameOperationsTest, DISABLED_ScaleDoesNotWrapAround) {
504   SetFrameData(4000, -4000, &frame_);
505   EXPECT_EQ(0, AudioFrameOperations::Scale(10.0, 10.0, &frame_));
506 
507   AudioFrame clipped_frame;
508   clipped_frame.samples_per_channel_ = 320;
509   clipped_frame.num_channels_ = 2;
510   SetFrameData(32767, -32768, &clipped_frame);
511   VerifyFramesAreEqual(clipped_frame, frame_);
512 }
513 
TEST_F(AudioFrameOperationsTest,ScaleSucceeds)514 TEST_F(AudioFrameOperationsTest, ScaleSucceeds) {
515   SetFrameData(1, -1, &frame_);
516   EXPECT_EQ(0, AudioFrameOperations::Scale(2.0, 3.0, &frame_));
517 
518   AudioFrame scaled_frame;
519   scaled_frame.samples_per_channel_ = 320;
520   scaled_frame.num_channels_ = 2;
521   SetFrameData(2, -3, &scaled_frame);
522   VerifyFramesAreEqual(scaled_frame, frame_);
523 }
524 
TEST_F(AudioFrameOperationsTest,ScaleMuted)525 TEST_F(AudioFrameOperationsTest, ScaleMuted) {
526   ASSERT_TRUE(frame_.muted());
527   EXPECT_EQ(0, AudioFrameOperations::Scale(2.0, 3.0, &frame_));
528   EXPECT_TRUE(frame_.muted());
529 }
530 
531 // TODO(andrew): should fail with a negative scale.
TEST_F(AudioFrameOperationsTest,DISABLED_ScaleWithSatFailsWithBadParameters)532 TEST_F(AudioFrameOperationsTest, DISABLED_ScaleWithSatFailsWithBadParameters) {
533   EXPECT_EQ(-1, AudioFrameOperations::ScaleWithSat(-1.0, &frame_));
534 }
535 
TEST_F(AudioFrameOperationsTest,ScaleWithSatDoesNotWrapAround)536 TEST_F(AudioFrameOperationsTest, ScaleWithSatDoesNotWrapAround) {
537   frame_.num_channels_ = 1;
538   SetFrameData(4000, &frame_);
539   EXPECT_EQ(0, AudioFrameOperations::ScaleWithSat(10.0, &frame_));
540 
541   AudioFrame clipped_frame;
542   clipped_frame.samples_per_channel_ = 320;
543   clipped_frame.num_channels_ = 1;
544   SetFrameData(32767, &clipped_frame);
545   VerifyFramesAreEqual(clipped_frame, frame_);
546 
547   SetFrameData(-4000, &frame_);
548   EXPECT_EQ(0, AudioFrameOperations::ScaleWithSat(10.0, &frame_));
549   SetFrameData(-32768, &clipped_frame);
550   VerifyFramesAreEqual(clipped_frame, frame_);
551 }
552 
TEST_F(AudioFrameOperationsTest,ScaleWithSatSucceeds)553 TEST_F(AudioFrameOperationsTest, ScaleWithSatSucceeds) {
554   frame_.num_channels_ = 1;
555   SetFrameData(1, &frame_);
556   EXPECT_EQ(0, AudioFrameOperations::ScaleWithSat(2.0, &frame_));
557 
558   AudioFrame scaled_frame;
559   scaled_frame.samples_per_channel_ = 320;
560   scaled_frame.num_channels_ = 1;
561   SetFrameData(2, &scaled_frame);
562   VerifyFramesAreEqual(scaled_frame, frame_);
563 }
564 
TEST_F(AudioFrameOperationsTest,ScaleWithSatMuted)565 TEST_F(AudioFrameOperationsTest, ScaleWithSatMuted) {
566   ASSERT_TRUE(frame_.muted());
567   EXPECT_EQ(0, AudioFrameOperations::ScaleWithSat(2.0, &frame_));
568   EXPECT_TRUE(frame_.muted());
569 }
570 
TEST_F(AudioFrameOperationsTest,AddingXToEmptyGivesX)571 TEST_F(AudioFrameOperationsTest, AddingXToEmptyGivesX) {
572   // When samples_per_channel_ is 0, the frame counts as empty and zero.
573   AudioFrame frame_to_add_to;
574   frame_to_add_to.mutable_data();  // Unmute the frame.
575   ASSERT_FALSE(frame_to_add_to.muted());
576   frame_to_add_to.samples_per_channel_ = 0;
577   frame_to_add_to.num_channels_ = frame_.num_channels_;
578 
579   SetFrameData(1000, &frame_);
580   AudioFrameOperations::Add(frame_, &frame_to_add_to);
581   VerifyFramesAreEqual(frame_, frame_to_add_to);
582 }
583 
TEST_F(AudioFrameOperationsTest,AddingXToMutedGivesX)584 TEST_F(AudioFrameOperationsTest, AddingXToMutedGivesX) {
585   AudioFrame frame_to_add_to;
586   ASSERT_TRUE(frame_to_add_to.muted());
587   frame_to_add_to.samples_per_channel_ = frame_.samples_per_channel_;
588   frame_to_add_to.num_channels_ = frame_.num_channels_;
589 
590   SetFrameData(1000, &frame_);
591   AudioFrameOperations::Add(frame_, &frame_to_add_to);
592   VerifyFramesAreEqual(frame_, frame_to_add_to);
593 }
594 
TEST_F(AudioFrameOperationsTest,AddingMutedToXGivesX)595 TEST_F(AudioFrameOperationsTest, AddingMutedToXGivesX) {
596   AudioFrame frame_to_add_to;
597   frame_to_add_to.samples_per_channel_ = frame_.samples_per_channel_;
598   frame_to_add_to.num_channels_ = frame_.num_channels_;
599   SetFrameData(1000, &frame_to_add_to);
600 
601   AudioFrame frame_copy;
602   frame_copy.CopyFrom(frame_to_add_to);
603 
604   ASSERT_TRUE(frame_.muted());
605   AudioFrameOperations::Add(frame_, &frame_to_add_to);
606   VerifyFramesAreEqual(frame_copy, frame_to_add_to);
607 }
608 
TEST_F(AudioFrameOperationsTest,AddingTwoFramesProducesTheirSum)609 TEST_F(AudioFrameOperationsTest, AddingTwoFramesProducesTheirSum) {
610   AudioFrame frame_to_add_to;
611   frame_to_add_to.samples_per_channel_ = frame_.samples_per_channel_;
612   frame_to_add_to.num_channels_ = frame_.num_channels_;
613   SetFrameData(1000, &frame_to_add_to);
614   SetFrameData(2000, &frame_);
615 
616   AudioFrameOperations::Add(frame_, &frame_to_add_to);
617   SetFrameData(frame_.data()[0] + 1000, &frame_);
618   VerifyFramesAreEqual(frame_, frame_to_add_to);
619 }
620 
621 }  // namespace
622 }  // namespace webrtc
623