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

Unified Diff: webrtc/modules/audio_mixer/frame_combiner_unittest.cc

Issue 2776113002: Send data from mixer to APM limiter more often. (Closed)
Patch Set: Minor changes in response to hlundin@'s comments. Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/modules/audio_mixer/frame_combiner.cc ('k') | webrtc/modules/audio_mixer/gain_change_calculator.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/modules/audio_mixer/frame_combiner_unittest.cc
diff --git a/webrtc/modules/audio_mixer/frame_combiner_unittest.cc b/webrtc/modules/audio_mixer/frame_combiner_unittest.cc
index 13c66012f99f27c4fd30d820e19c0166fcf3d1f6..8d745f651def9679e6c161cc053bd90df4f56af6 100644
--- a/webrtc/modules/audio_mixer/frame_combiner_unittest.cc
+++ b/webrtc/modules/audio_mixer/frame_combiner_unittest.cc
@@ -14,7 +14,10 @@
#include <sstream>
#include <string>
+#include "webrtc/audio/utility/audio_frame_operations.h"
#include "webrtc/base/checks.h"
+#include "webrtc/modules/audio_mixer/gain_change_calculator.h"
+#include "webrtc/modules/audio_mixer/sine_wave_generator.h"
#include "webrtc/test/gtest.h"
namespace webrtc {
@@ -24,9 +27,23 @@ std::string ProduceDebugText(int sample_rate_hz,
int number_of_channels,
int number_of_sources) {
std::ostringstream ss;
- ss << "Sample rate: " << sample_rate_hz << " ";
- ss << "Number of channels: " << number_of_channels << " ";
- ss << "Number of sources: " << number_of_sources;
+ ss << "Sample rate: " << sample_rate_hz << " ,";
+ ss << "number of channels: " << number_of_channels << " ,";
+ ss << "number of sources: " << number_of_sources;
+ return ss.str();
+}
+
+std::string ProduceDebugText(int sample_rate_hz,
+ int number_of_channels,
+ int number_of_sources,
+ bool limiter_active,
+ float wave_frequency) {
+ std::ostringstream ss;
+ ss << "Sample rate: " << sample_rate_hz << " ,";
+ ss << "number of channels: " << number_of_channels << " ,";
+ ss << "number of sources: " << number_of_sources << " ,";
+ ss << "limiter active: " << (limiter_active ? "true" : "false") << " ,";
+ ss << "wave frequency: " << wave_frequency << " ,";
return ss.str();
}
@@ -57,7 +74,7 @@ TEST(FrameCombiner, BasicApiCallsLimiter) {
const std::vector<AudioFrame*> frames_to_combine(
all_frames.begin(), all_frames.begin() + number_of_frames);
combiner.Combine(frames_to_combine, number_of_channels, rate,
- &audio_frame_for_mixing);
+ frames_to_combine.size(), &audio_frame_for_mixing);
}
}
}
@@ -79,7 +96,7 @@ TEST(FrameCombiner, BasicApiCallsNoLimiter) {
const std::vector<AudioFrame*> frames_to_combine(
all_frames.begin(), all_frames.begin() + number_of_frames);
combiner.Combine(frames_to_combine, number_of_channels, rate,
- &audio_frame_for_mixing);
+ frames_to_combine.size(), &audio_frame_for_mixing);
}
}
}
@@ -93,7 +110,7 @@ TEST(FrameCombiner, CombiningZeroFramesShouldProduceSilence) {
const std::vector<AudioFrame*> frames_to_combine;
combiner.Combine(frames_to_combine, number_of_channels, rate,
- &audio_frame_for_mixing);
+ frames_to_combine.size(), &audio_frame_for_mixing);
const std::vector<int16_t> mixed_data(
audio_frame_for_mixing.data_,
@@ -116,7 +133,7 @@ TEST(FrameCombiner, CombiningOneFrameShouldNotChangeFrame) {
0);
const std::vector<AudioFrame*> frames_to_combine = {&frame1};
combiner.Combine(frames_to_combine, number_of_channels, rate,
- &audio_frame_for_mixing);
+ frames_to_combine.size(), &audio_frame_for_mixing);
const std::vector<int16_t> mixed_data(
audio_frame_for_mixing.data_,
@@ -129,4 +146,57 @@ TEST(FrameCombiner, CombiningOneFrameShouldNotChangeFrame) {
}
}
+// Send a sine wave through the FrameCombiner, and check that the
+// difference between input and output varies smoothly. This is to
+// catch issues like chromium:695993.
+TEST(FrameCombiner, GainCurveIsSmoothForAlternatingNumberOfStreams) {
+ // Test doesn't work with rates requiring a band split, because it
+ // introduces a small delay measured in single samples, and this
+ // test cannot handle it.
+ //
+ // TODO(aleloi): Add more rates when APM limiter doesn't use band
+ // split.
+ for (const bool use_limiter : {true, false}) {
+ for (const int rate : {8000, 16000}) {
+ constexpr int number_of_channels = 2;
+ for (const float wave_frequency : {50, 400, 3200}) {
+ SCOPED_TRACE(ProduceDebugText(rate, number_of_channels, 1, use_limiter,
+ wave_frequency));
+
+ FrameCombiner combiner(use_limiter);
+
+ constexpr int16_t wave_amplitude = 30000;
+ SineWaveGenerator wave_generator(wave_frequency, wave_amplitude);
+
+ GainChangeCalculator change_calculator;
+ float cumulative_change = 0.f;
+
+ constexpr size_t iterations = 100;
+
+ for (size_t i = 0; i < iterations; ++i) {
+ SetUpFrames(rate, number_of_channels);
+ wave_generator.GenerateNextFrame(&frame1);
+ AudioFrameOperations::Mute(&frame2);
+
+ std::vector<AudioFrame*> frames_to_combine = {&frame1};
+ if (i % 2 == 0) {
+ frames_to_combine.push_back(&frame2);
+ }
+ const size_t number_of_samples =
+ frame1.samples_per_channel_ * number_of_channels;
+
+ // Ensures limiter is on if 'use_limiter'.
+ constexpr size_t number_of_streams = 2;
+ combiner.Combine(frames_to_combine, number_of_channels, rate,
+ number_of_streams, &audio_frame_for_mixing);
+ cumulative_change += change_calculator.CalculateGainChange(
+ rtc::ArrayView<const int16_t>(frame1.data_, number_of_samples),
+ rtc::ArrayView<const int16_t>(audio_frame_for_mixing.data_,
+ number_of_samples));
+ }
+ RTC_DCHECK_LT(cumulative_change, 10);
+ }
+ }
+ }
+}
} // namespace webrtc
« no previous file with comments | « webrtc/modules/audio_mixer/frame_combiner.cc ('k') | webrtc/modules/audio_mixer/gain_change_calculator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698