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

Unified Diff: webrtc/modules/audio_processing/test/process_test.cc

Issue 2425583002: Removed the deprecated audioproc executable (Closed)
Patch Set: Created 4 years, 2 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_processing/audio_processing_tests.gypi ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/modules/audio_processing/test/process_test.cc
diff --git a/webrtc/modules/audio_processing/test/process_test.cc b/webrtc/modules/audio_processing/test/process_test.cc
deleted file mode 100644
index 55df1d7780ff114d452a9ac0dd0c29022a9c7831..0000000000000000000000000000000000000000
--- a/webrtc/modules/audio_processing/test/process_test.cc
+++ /dev/null
@@ -1,1168 +0,0 @@
-/*
- * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-#ifdef WEBRTC_ANDROID
-#include <sys/stat.h>
-#endif
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/base/format_macros.h"
-#include "webrtc/base/ignore_wundef.h"
-#include "webrtc/base/timeutils.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/include/config.h"
-#include "webrtc/modules/audio_processing/test/protobuf_utils.h"
-#include "webrtc/modules/audio_processing/test/test_utils.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/test/testsupport/perf_test.h"
-
-RTC_PUSH_IGNORING_WUNDEF()
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/modules/audio_processing/debug.pb.h"
-#else
-#include "webrtc/modules/audio_processing/debug.pb.h"
-#endif
-RTC_POP_IGNORING_WUNDEF()
-
-namespace webrtc {
-
-using webrtc::audioproc::Event;
-using webrtc::audioproc::Init;
-using webrtc::audioproc::ReverseStream;
-using webrtc::audioproc::Stream;
-
-namespace {
-
-void PrintStat(const AudioProcessing::Statistic& stat) {
- printf("%d, %d, %d\n", stat.average,
- stat.maximum,
- stat.minimum);
-}
-
-void usage() {
- printf(
- "Usage: process_test [options] [-pb PROTOBUF_FILE]\n"
- " [-ir REVERSE_FILE] [-i PRIMARY_FILE] [-o OUT_FILE]\n");
- printf(
- "process_test is a test application for AudioProcessing.\n\n"
- "When a protobuf debug file is available, specify it with -pb. Alternately,\n"
- "when -ir or -i is used, the specified files will be processed directly in\n"
- "a simulation mode. Otherwise the full set of legacy test files is expected\n"
- "to be present in the working directory. OUT_FILE should be specified\n"
- "without extension to support both raw and wav output.\n\n");
- printf("Options\n");
- printf("General configuration (only used for the simulation mode):\n");
- printf(" -fs SAMPLE_RATE_HZ\n");
- printf(" -ch CHANNELS_IN CHANNELS_OUT\n");
- printf(" -rch REVERSE_CHANNELS\n");
- printf("\n");
- printf("Component configuration:\n");
- printf(
- "All components are disabled by default. Each block below begins with a\n"
- "flag to enable the component with default settings. The subsequent flags\n"
- "in the block are used to provide configuration settings.\n");
- printf("\n -aec Echo cancellation\n");
- printf(" --drift_compensation\n");
- printf(" --no_drift_compensation\n");
- printf(" --no_echo_metrics\n");
- printf(" --no_delay_logging\n");
- printf(" --aec_suppression_level LEVEL [0 - 2]\n");
- printf(" --extended_filter\n");
- printf(" --no_reported_delay\n");
- printf(" --aec3\n");
- printf(" --refined_adaptive_filter\n");
- printf("\n -aecm Echo control mobile\n");
- printf(" --aecm_echo_path_in_file FILE\n");
- printf(" --aecm_echo_path_out_file FILE\n");
- printf(" --no_comfort_noise\n");
- printf(" --routing_mode MODE [0 - 4]\n");
- printf("\n -agc Gain control\n");
- printf(" --analog\n");
- printf(" --adaptive_digital\n");
- printf(" --fixed_digital\n");
- printf(" --target_level LEVEL\n");
- printf(" --compression_gain GAIN\n");
- printf(" --limiter\n");
- printf(" --no_limiter\n");
- printf("\n -hpf High pass filter\n");
- printf("\n -ns Noise suppression\n");
- printf(" --ns_low\n");
- printf(" --ns_moderate\n");
- printf(" --ns_high\n");
- printf(" --ns_very_high\n");
- printf(" --ns_prob_file FILE\n");
- printf("\n -vad Voice activity detection\n");
- printf(" --vad_out_file FILE\n");
- printf("\n -expns Experimental noise suppression\n");
- printf("\n Level metrics (enabled by default)\n");
- printf(" --no_level_metrics\n");
- printf(" --level_control\n");
- printf("\n");
- printf("Modifiers:\n");
- printf(" --noasm Disable SSE optimization.\n");
- printf(" --add_delay DELAY Add DELAY ms to input value.\n");
- printf(" --delay DELAY Override input delay with DELAY ms.\n");
- printf(" --perf Measure performance.\n");
- printf(" --quiet Suppress text output.\n");
- printf(" --no_progress Suppress progress.\n");
- printf(" --raw_output Raw output instead of WAV file.\n");
- printf(" --debug_file FILE Dump a debug recording.\n");
-}
-
-static float MicLevel2Gain(int level) {
- return pow(10.0f, ((level - 127.0f) / 128.0f * 40.0f) / 20.0f);
-}
-
-static void SimulateMic(int mic_level, AudioFrame* frame) {
- mic_level = std::min(std::max(mic_level, 0), 255);
- float mic_gain = MicLevel2Gain(mic_level);
- int num_samples = frame->samples_per_channel_ * frame->num_channels_;
- float v;
- for (int n = 0; n < num_samples; n++) {
- v = floor(frame->data_[n] * mic_gain + 0.5);
- v = std::max(std::min(32767.0f, v), -32768.0f);
- frame->data_[n] = static_cast<int16_t>(v);
- }
-}
-
-// void function for gtest.
-void void_main(int argc, char* argv[]) {
- if (argc > 1 && strcmp(argv[1], "--help") == 0) {
- usage();
- return;
- }
-
- if (argc < 2) {
- printf("Did you mean to run without arguments?\n");
- printf("Try `process_test --help' for more information.\n\n");
- }
-
- std::unique_ptr<AudioProcessing> apm(AudioProcessing::Create());
- ASSERT_TRUE(apm.get() != NULL);
-
- const char* pb_filename = NULL;
- const char* far_filename = NULL;
- const char* near_filename = NULL;
- std::string out_filename;
- const char* vad_out_filename = NULL;
- const char* ns_prob_filename = NULL;
- const char* aecm_echo_path_in_filename = NULL;
- const char* aecm_echo_path_out_filename = NULL;
-
- int32_t sample_rate_hz = 16000;
-
- size_t num_capture_input_channels = 1;
- size_t num_capture_output_channels = 1;
- size_t num_render_channels = 1;
-
- int samples_per_channel = sample_rate_hz / 100;
-
- bool simulating = false;
- bool perf_testing = false;
- bool verbose = true;
- bool progress = true;
- bool raw_output = false;
- int extra_delay_ms = 0;
- int override_delay_ms = 0;
- Config config;
- AudioProcessing::Config apm_config;
-
- ASSERT_EQ(apm->kNoError, apm->level_estimator()->Enable(true));
- for (int i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-pb") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify protobuf filename after -pb";
- pb_filename = argv[i];
-
- } else if (strcmp(argv[i], "-ir") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify filename after -ir";
- far_filename = argv[i];
- simulating = true;
-
- } else if (strcmp(argv[i], "-i") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify filename after -i";
- near_filename = argv[i];
- simulating = true;
-
- } else if (strcmp(argv[i], "-o") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify filename without extension after -o";
- out_filename = argv[i];
-
- } else if (strcmp(argv[i], "-fs") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify sample rate after -fs";
- ASSERT_EQ(1, sscanf(argv[i], "%d", &sample_rate_hz));
- samples_per_channel = sample_rate_hz / 100;
-
- } else if (strcmp(argv[i], "-ch") == 0) {
- i++;
- ASSERT_LT(i + 1, argc) << "Specify number of channels after -ch";
- ASSERT_EQ(1, sscanf(argv[i], "%" PRIuS, &num_capture_input_channels));
- i++;
- ASSERT_EQ(1, sscanf(argv[i], "%" PRIuS, &num_capture_output_channels));
-
- } else if (strcmp(argv[i], "-rch") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify number of channels after -rch";
- ASSERT_EQ(1, sscanf(argv[i], "%" PRIuS, &num_render_channels));
-
- } else if (strcmp(argv[i], "-aec") == 0) {
- ASSERT_EQ(apm->kNoError, apm->echo_cancellation()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->echo_cancellation()->enable_metrics(true));
- ASSERT_EQ(apm->kNoError,
- apm->echo_cancellation()->enable_delay_logging(true));
-
- } else if (strcmp(argv[i], "--drift_compensation") == 0) {
- ASSERT_EQ(apm->kNoError, apm->echo_cancellation()->Enable(true));
- // TODO(ajm): this is enabled in the VQE test app by default. Investigate
- // why it can give better performance despite passing zeros.
- ASSERT_EQ(apm->kNoError,
- apm->echo_cancellation()->enable_drift_compensation(true));
- } else if (strcmp(argv[i], "--no_drift_compensation") == 0) {
- ASSERT_EQ(apm->kNoError, apm->echo_cancellation()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->echo_cancellation()->enable_drift_compensation(false));
-
- } else if (strcmp(argv[i], "--no_echo_metrics") == 0) {
- ASSERT_EQ(apm->kNoError, apm->echo_cancellation()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->echo_cancellation()->enable_metrics(false));
-
- } else if (strcmp(argv[i], "--no_delay_logging") == 0) {
- ASSERT_EQ(apm->kNoError, apm->echo_cancellation()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->echo_cancellation()->enable_delay_logging(false));
-
- } else if (strcmp(argv[i], "--no_level_metrics") == 0) {
- ASSERT_EQ(apm->kNoError, apm->level_estimator()->Enable(false));
-
- } else if (strcmp(argv[i], "--aec_suppression_level") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify level after --aec_suppression_level";
- int suppression_level;
- ASSERT_EQ(1, sscanf(argv[i], "%d", &suppression_level));
- ASSERT_EQ(apm->kNoError,
- apm->echo_cancellation()->set_suppression_level(
- static_cast<webrtc::EchoCancellation::SuppressionLevel>(
- suppression_level)));
-
- } else if (strcmp(argv[i], "--level_control") == 0) {
- apm_config.level_controller.enabled = true;
- } else if (strcmp(argv[i], "--extended_filter") == 0) {
- config.Set<ExtendedFilter>(new ExtendedFilter(true));
-
- } else if (strcmp(argv[i], "--no_reported_delay") == 0) {
- config.Set<DelayAgnostic>(new DelayAgnostic(true));
-
- } else if (strcmp(argv[i], "--delay_agnostic") == 0) {
- config.Set<DelayAgnostic>(new DelayAgnostic(true));
-
- } else if (strcmp(argv[i], "--aec3") == 0) {
- config.Set<EchoCanceller3>(new EchoCanceller3(true));
-
- } else if (strcmp(argv[i], "--refined_adaptive_filter") == 0) {
- config.Set<RefinedAdaptiveFilter>(new RefinedAdaptiveFilter(true));
-
- } else if (strcmp(argv[i], "-aecm") == 0) {
- ASSERT_EQ(apm->kNoError, apm->echo_control_mobile()->Enable(true));
-
- } else if (strcmp(argv[i], "--aecm_echo_path_in_file") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify filename after --aecm_echo_path_in_file";
- aecm_echo_path_in_filename = argv[i];
-
- } else if (strcmp(argv[i], "--aecm_echo_path_out_file") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify filename after --aecm_echo_path_out_file";
- aecm_echo_path_out_filename = argv[i];
-
- } else if (strcmp(argv[i], "--no_comfort_noise") == 0) {
- ASSERT_EQ(apm->kNoError,
- apm->echo_control_mobile()->enable_comfort_noise(false));
-
- } else if (strcmp(argv[i], "--routing_mode") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify mode after --routing_mode";
- int routing_mode;
- ASSERT_EQ(1, sscanf(argv[i], "%d", &routing_mode));
- ASSERT_EQ(apm->kNoError,
- apm->echo_control_mobile()->set_routing_mode(
- static_cast<webrtc::EchoControlMobile::RoutingMode>(
- routing_mode)));
-
- } else if (strcmp(argv[i], "-agc") == 0) {
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
-
- } else if (strcmp(argv[i], "--analog") == 0) {
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->set_mode(GainControl::kAdaptiveAnalog));
-
- } else if (strcmp(argv[i], "--adaptive_digital") == 0) {
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->set_mode(GainControl::kAdaptiveDigital));
-
- } else if (strcmp(argv[i], "--fixed_digital") == 0) {
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->set_mode(GainControl::kFixedDigital));
-
- } else if (strcmp(argv[i], "--target_level") == 0) {
- i++;
- int level;
- ASSERT_EQ(1, sscanf(argv[i], "%d", &level));
-
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->set_target_level_dbfs(level));
-
- } else if (strcmp(argv[i], "--compression_gain") == 0) {
- i++;
- int gain;
- ASSERT_EQ(1, sscanf(argv[i], "%d", &gain));
-
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->set_compression_gain_db(gain));
-
- } else if (strcmp(argv[i], "--limiter") == 0) {
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->enable_limiter(true));
-
- } else if (strcmp(argv[i], "--no_limiter") == 0) {
- ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->enable_limiter(false));
-
- } else if (strcmp(argv[i], "-hpf") == 0) {
- ASSERT_EQ(apm->kNoError, apm->high_pass_filter()->Enable(true));
-
- } else if (strcmp(argv[i], "-ns") == 0) {
- ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true));
-
- } else if (strcmp(argv[i], "--ns_low") == 0) {
- ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->noise_suppression()->set_level(NoiseSuppression::kLow));
-
- } else if (strcmp(argv[i], "--ns_moderate") == 0) {
- ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->noise_suppression()->set_level(NoiseSuppression::kModerate));
-
- } else if (strcmp(argv[i], "--ns_high") == 0) {
- ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->noise_suppression()->set_level(NoiseSuppression::kHigh));
-
- } else if (strcmp(argv[i], "--ns_very_high") == 0) {
- ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->noise_suppression()->set_level(NoiseSuppression::kVeryHigh));
-
- } else if (strcmp(argv[i], "--ns_prob_file") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify filename after --ns_prob_file";
- ns_prob_filename = argv[i];
-
- } else if (strcmp(argv[i], "-vad") == 0) {
- ASSERT_EQ(apm->kNoError, apm->voice_detection()->Enable(true));
-
- } else if (strcmp(argv[i], "--vad_very_low") == 0) {
- ASSERT_EQ(apm->kNoError, apm->voice_detection()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->voice_detection()->set_likelihood(
- VoiceDetection::kVeryLowLikelihood));
-
- } else if (strcmp(argv[i], "--vad_low") == 0) {
- ASSERT_EQ(apm->kNoError, apm->voice_detection()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->voice_detection()->set_likelihood(
- VoiceDetection::kLowLikelihood));
-
- } else if (strcmp(argv[i], "--vad_moderate") == 0) {
- ASSERT_EQ(apm->kNoError, apm->voice_detection()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->voice_detection()->set_likelihood(
- VoiceDetection::kModerateLikelihood));
-
- } else if (strcmp(argv[i], "--vad_high") == 0) {
- ASSERT_EQ(apm->kNoError, apm->voice_detection()->Enable(true));
- ASSERT_EQ(apm->kNoError,
- apm->voice_detection()->set_likelihood(
- VoiceDetection::kHighLikelihood));
-
- } else if (strcmp(argv[i], "--vad_out_file") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify filename after --vad_out_file";
- vad_out_filename = argv[i];
-
- } else if (strcmp(argv[i], "-expns") == 0) {
- config.Set<ExperimentalNs>(new ExperimentalNs(true));
-
- } else if (strcmp(argv[i], "--noasm") == 0) {
- WebRtc_GetCPUInfo = WebRtc_GetCPUInfoNoASM;
- // We need to reinitialize here if components have already been enabled.
- ASSERT_EQ(apm->kNoError, apm->Initialize());
-
- } else if (strcmp(argv[i], "--add_delay") == 0) {
- i++;
- ASSERT_EQ(1, sscanf(argv[i], "%d", &extra_delay_ms));
-
- } else if (strcmp(argv[i], "--delay") == 0) {
- i++;
- ASSERT_EQ(1, sscanf(argv[i], "%d", &override_delay_ms));
-
- } else if (strcmp(argv[i], "--perf") == 0) {
- perf_testing = true;
-
- } else if (strcmp(argv[i], "--quiet") == 0) {
- verbose = false;
- progress = false;
-
- } else if (strcmp(argv[i], "--no_progress") == 0) {
- progress = false;
-
- } else if (strcmp(argv[i], "--raw_output") == 0) {
- raw_output = true;
-
- } else if (strcmp(argv[i], "--debug_file") == 0) {
- i++;
- ASSERT_LT(i, argc) << "Specify filename after --debug_file";
- ASSERT_EQ(apm->kNoError, apm->StartDebugRecording(argv[i], -1));
- } else {
- FAIL() << "Unrecognized argument " << argv[i];
- }
- }
- apm->ApplyConfig(apm_config);
- apm->SetExtraOptions(config);
-
- // If we're reading a protobuf file, ensure a simulation hasn't also
- // been requested (which makes no sense...)
- ASSERT_FALSE(pb_filename && simulating);
-
- if (verbose) {
- printf("Sample rate: %d Hz\n", sample_rate_hz);
- printf("Primary channels: %" PRIuS " (in), %" PRIuS " (out)\n",
- num_capture_input_channels,
- num_capture_output_channels);
- printf("Reverse channels: %" PRIuS "\n", num_render_channels);
- }
-
- const std::string out_path = webrtc::test::OutputPath();
- const char far_file_default[] = "apm_far.pcm";
- const char near_file_default[] = "apm_near.pcm";
- const char event_filename[] = "apm_event.dat";
- const char delay_filename[] = "apm_delay.dat";
- const char drift_filename[] = "apm_drift.dat";
- const std::string vad_file_default = out_path + "vad_out.dat";
- const std::string ns_prob_file_default = out_path + "ns_prob.dat";
-
- if (!simulating) {
- far_filename = far_file_default;
- near_filename = near_file_default;
- }
-
- if (out_filename.size() == 0) {
- out_filename = out_path + "out";
- }
-
- if (!vad_out_filename) {
- vad_out_filename = vad_file_default.c_str();
- }
-
- if (!ns_prob_filename) {
- ns_prob_filename = ns_prob_file_default.c_str();
- }
-
- FILE* pb_file = NULL;
- FILE* far_file = NULL;
- FILE* near_file = NULL;
- FILE* event_file = NULL;
- FILE* delay_file = NULL;
- FILE* drift_file = NULL;
- FILE* vad_out_file = NULL;
- FILE* ns_prob_file = NULL;
- FILE* aecm_echo_path_in_file = NULL;
- FILE* aecm_echo_path_out_file = NULL;
-
- std::unique_ptr<WavWriter> output_wav_file;
- std::unique_ptr<RawFile> output_raw_file;
-
- if (pb_filename) {
- pb_file = OpenFile(pb_filename, "rb");
- } else {
- if (far_filename) {
- far_file = OpenFile(far_filename, "rb");
- }
-
- near_file = OpenFile(near_filename, "rb");
- if (!simulating) {
- event_file = OpenFile(event_filename, "rb");
- delay_file = OpenFile(delay_filename, "rb");
- drift_file = OpenFile(drift_filename, "rb");
- }
- }
-
- int near_size_bytes = 0;
- if (pb_file) {
- struct stat st;
- stat(pb_filename, &st);
- // Crude estimate, but should be good enough.
- near_size_bytes = st.st_size / 3;
- } else {
- struct stat st;
- stat(near_filename, &st);
- near_size_bytes = st.st_size;
- }
-
- if (apm->voice_detection()->is_enabled()) {
- vad_out_file = OpenFile(vad_out_filename, "wb");
- }
-
- if (apm->noise_suppression()->is_enabled()) {
- ns_prob_file = OpenFile(ns_prob_filename, "wb");
- }
-
- if (aecm_echo_path_in_filename != NULL) {
- aecm_echo_path_in_file = OpenFile(aecm_echo_path_in_filename, "rb");
-
- const size_t path_size =
- apm->echo_control_mobile()->echo_path_size_bytes();
- std::unique_ptr<char[]> echo_path(new char[path_size]);
- ASSERT_EQ(path_size, fread(echo_path.get(),
- sizeof(char),
- path_size,
- aecm_echo_path_in_file));
- EXPECT_EQ(apm->kNoError,
- apm->echo_control_mobile()->SetEchoPath(echo_path.get(),
- path_size));
- fclose(aecm_echo_path_in_file);
- aecm_echo_path_in_file = NULL;
- }
-
- if (aecm_echo_path_out_filename != NULL) {
- aecm_echo_path_out_file = OpenFile(aecm_echo_path_out_filename, "wb");
- }
-
- size_t read_count = 0;
- int reverse_count = 0;
- int primary_count = 0;
- int near_read_bytes = 0;
- int64_t acc_nanos = 0;
-
- AudioFrame far_frame;
- AudioFrame near_frame;
-
- int delay_ms = 0;
- int drift_samples = 0;
- int capture_level = 127;
- int8_t stream_has_voice = 0;
- float ns_speech_prob = 0.0f;
-
- int64_t t0 = rtc::TimeNanos();
- int64_t t1 = t0;
- int64_t max_time_us = 0;
- int64_t max_time_reverse_us = 0;
- int64_t min_time_us = 1e6;
- int64_t min_time_reverse_us = 1e6;
-
- // TODO(ajm): Ideally we would refactor this block into separate functions,
- // but for now we want to share the variables.
- if (pb_file) {
- Event event_msg;
- std::unique_ptr<ChannelBuffer<float> > reverse_cb;
- std::unique_ptr<ChannelBuffer<float> > primary_cb;
- int output_sample_rate = 32000;
- AudioProcessing::ChannelLayout output_layout = AudioProcessing::kMono;
- while (ReadMessageFromFile(pb_file, &event_msg)) {
- std::ostringstream trace_stream;
- trace_stream << "Processed frames: " << reverse_count << " (reverse), "
- << primary_count << " (primary)";
- SCOPED_TRACE(trace_stream.str());
-
- if (event_msg.type() == Event::INIT) {
- ASSERT_TRUE(event_msg.has_init());
- const Init msg = event_msg.init();
-
- ASSERT_TRUE(msg.has_sample_rate());
- ASSERT_TRUE(msg.has_num_input_channels());
- ASSERT_TRUE(msg.has_num_output_channels());
- ASSERT_TRUE(msg.has_num_reverse_channels());
- int reverse_sample_rate = msg.sample_rate();
- if (msg.has_reverse_sample_rate()) {
- reverse_sample_rate = msg.reverse_sample_rate();
- }
- output_sample_rate = msg.sample_rate();
- if (msg.has_output_sample_rate()) {
- output_sample_rate = msg.output_sample_rate();
- }
- output_layout =
- LayoutFromChannels(static_cast<size_t>(msg.num_output_channels()));
- ASSERT_EQ(kNoErr,
- apm->Initialize(
- msg.sample_rate(),
- output_sample_rate,
- reverse_sample_rate,
- LayoutFromChannels(
- static_cast<size_t>(msg.num_input_channels())),
- output_layout,
- LayoutFromChannels(
- static_cast<size_t>(msg.num_reverse_channels()))));
-
- samples_per_channel = msg.sample_rate() / 100;
- far_frame.sample_rate_hz_ = reverse_sample_rate;
- far_frame.samples_per_channel_ = reverse_sample_rate / 100;
- far_frame.num_channels_ = msg.num_reverse_channels();
- near_frame.sample_rate_hz_ = msg.sample_rate();
- near_frame.samples_per_channel_ = samples_per_channel;
- near_frame.num_channels_ = msg.num_input_channels();
- reverse_cb.reset(new ChannelBuffer<float>(
- far_frame.samples_per_channel_,
- msg.num_reverse_channels()));
- primary_cb.reset(new ChannelBuffer<float>(samples_per_channel,
- msg.num_input_channels()));
-
- if (verbose) {
- printf("Init at frame: %d (primary), %d (reverse)\n",
- primary_count, reverse_count);
- printf(" Primary rates: %d Hz (in), %d Hz (out)\n",
- msg.sample_rate(), output_sample_rate);
- printf(" Primary channels: %d (in), %d (out)\n",
- msg.num_input_channels(),
- msg.num_output_channels());
- printf(" Reverse rate: %d\n", reverse_sample_rate);
- printf(" Reverse channels: %d\n", msg.num_reverse_channels());
- }
-
- if (!raw_output) {
- // The WAV file needs to be reset every time, because it can't change
- // its sample rate or number of channels.
- output_wav_file.reset(new WavWriter(
- out_filename + ".wav", output_sample_rate,
- static_cast<size_t>(msg.num_output_channels())));
- }
-
- } else if (event_msg.type() == Event::REVERSE_STREAM) {
- ASSERT_TRUE(event_msg.has_reverse_stream());
- ReverseStream msg = event_msg.reverse_stream();
- reverse_count++;
-
- ASSERT_TRUE(msg.has_data() ^ (msg.channel_size() > 0));
- if (msg.has_data()) {
- ASSERT_EQ(sizeof(int16_t) * far_frame.samples_per_channel_ *
- far_frame.num_channels_, msg.data().size());
- memcpy(far_frame.data_, msg.data().data(), msg.data().size());
- } else {
- for (int i = 0; i < msg.channel_size(); ++i) {
- memcpy(reverse_cb->channels()[i],
- msg.channel(i).data(),
- reverse_cb->num_frames() *
- sizeof(reverse_cb->channels()[i][0]));
- }
- }
-
- if (perf_testing) {
- t0 = rtc::TimeNanos();
- }
-
- if (msg.has_data()) {
- ASSERT_EQ(apm->kNoError,
- apm->ProcessReverseStream(&far_frame));
- } else {
- ASSERT_EQ(apm->kNoError,
- apm->AnalyzeReverseStream(
- reverse_cb->channels(),
- far_frame.samples_per_channel_,
- far_frame.sample_rate_hz_,
- LayoutFromChannels(far_frame.num_channels_)));
- }
-
- if (perf_testing) {
- t1 = rtc::TimeNanos();
- int64_t diff_nanos = t1 - t0;
- acc_nanos += diff_nanos;
- int64_t diff_us = diff_nanos / rtc::kNumNanosecsPerMicrosec;
- if (diff_us > max_time_reverse_us) {
- max_time_reverse_us = diff_us;
- }
- if (diff_us < min_time_reverse_us) {
- min_time_reverse_us = diff_us;
- }
- }
-
- } else if (event_msg.type() == Event::STREAM) {
- ASSERT_TRUE(event_msg.has_stream());
- const Stream msg = event_msg.stream();
- primary_count++;
-
- ASSERT_TRUE(msg.has_input_data() ^ (msg.input_channel_size() > 0));
- if (msg.has_input_data()) {
- ASSERT_EQ(sizeof(int16_t) * samples_per_channel *
- near_frame.num_channels_, msg.input_data().size());
- memcpy(near_frame.data_,
- msg.input_data().data(),
- msg.input_data().size());
- near_read_bytes += msg.input_data().size();
- } else {
- for (int i = 0; i < msg.input_channel_size(); ++i) {
- memcpy(primary_cb->channels()[i],
- msg.input_channel(i).data(),
- primary_cb->num_frames() *
- sizeof(primary_cb->channels()[i][0]));
- near_read_bytes += msg.input_channel(i).size();
- }
- }
-
- if (progress && primary_count % 100 == 0) {
- near_read_bytes = std::min(near_read_bytes, near_size_bytes);
- printf("%.0f%% complete\r",
- (near_read_bytes * 100.0) / near_size_bytes);
- fflush(stdout);
- }
-
- if (perf_testing) {
- t0 = rtc::TimeNanos();
- }
-
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->set_stream_analog_level(msg.level()));
- delay_ms = msg.delay() + extra_delay_ms;
- if (override_delay_ms) {
- delay_ms = override_delay_ms;
- }
- ASSERT_EQ(apm->kNoError,
- apm->set_stream_delay_ms(delay_ms));
- apm->echo_cancellation()->set_stream_drift_samples(msg.drift());
-
- if (msg.has_keypress()) {
- apm->set_stream_key_pressed(msg.keypress());
- } else {
- apm->set_stream_key_pressed(true);
- }
-
- int err = apm->kNoError;
- if (msg.has_input_data()) {
- err = apm->ProcessStream(&near_frame);
- ASSERT_TRUE(near_frame.num_channels_ == apm->num_output_channels());
- } else {
- err = apm->ProcessStream(
- primary_cb->channels(),
- near_frame.samples_per_channel_,
- near_frame.sample_rate_hz_,
- LayoutFromChannels(near_frame.num_channels_),
- output_sample_rate,
- output_layout,
- primary_cb->channels());
- }
-
- if (err == apm->kBadStreamParameterWarning) {
- printf("Bad parameter warning. %s\n", trace_stream.str().c_str());
- }
- ASSERT_TRUE(err == apm->kNoError ||
- err == apm->kBadStreamParameterWarning);
-
- stream_has_voice =
- static_cast<int8_t>(apm->voice_detection()->stream_has_voice());
- if (vad_out_file != NULL) {
- ASSERT_EQ(1u, fwrite(&stream_has_voice,
- sizeof(stream_has_voice),
- 1,
- vad_out_file));
- }
-
- if (ns_prob_file != NULL) {
- ns_speech_prob = apm->noise_suppression()->speech_probability();
- ASSERT_EQ(1u, fwrite(&ns_speech_prob,
- sizeof(ns_speech_prob),
- 1,
- ns_prob_file));
- }
-
- if (perf_testing) {
- t1 = rtc::TimeNanos();
- int64_t diff_nanos = t1 - t0;
- acc_nanos += diff_nanos;
- int64_t diff_us = diff_nanos / rtc::kNumNanosecsPerMicrosec;
- if (diff_us > max_time_us) {
- max_time_us = diff_us;
- }
- if (diff_us < min_time_us) {
- min_time_us = diff_us;
- }
- }
-
- const size_t samples_per_channel = output_sample_rate / 100;
- if (msg.has_input_data()) {
- if (raw_output && !output_raw_file) {
- output_raw_file.reset(new RawFile(out_filename + ".pcm"));
- }
- WriteIntData(near_frame.data_,
- apm->num_output_channels() * samples_per_channel,
- output_wav_file.get(),
- output_raw_file.get());
- } else {
- if (raw_output && !output_raw_file) {
- output_raw_file.reset(new RawFile(out_filename + ".float"));
- }
- WriteFloatData(primary_cb->channels(),
- samples_per_channel,
- apm->num_output_channels(),
- output_wav_file.get(),
- output_raw_file.get());
- }
- }
- }
-
- ASSERT_TRUE(feof(pb_file));
-
- } else {
- enum Events {
- kInitializeEvent,
- kRenderEvent,
- kCaptureEvent,
- kResetEventDeprecated
- };
- int16_t event = 0;
- while (simulating || feof(event_file) == 0) {
- std::ostringstream trace_stream;
- trace_stream << "Processed frames: " << reverse_count << " (reverse), "
- << primary_count << " (primary)";
- SCOPED_TRACE(trace_stream.str());
-
- if (simulating) {
- if (far_file == NULL) {
- event = kCaptureEvent;
- } else {
- event = (event == kCaptureEvent) ? kRenderEvent : kCaptureEvent;
- }
- } else {
- read_count = fread(&event, sizeof(event), 1, event_file);
- if (read_count != 1) {
- break;
- }
- }
-
- far_frame.sample_rate_hz_ = sample_rate_hz;
- far_frame.samples_per_channel_ = samples_per_channel;
- far_frame.num_channels_ = num_render_channels;
- near_frame.sample_rate_hz_ = sample_rate_hz;
- near_frame.samples_per_channel_ = samples_per_channel;
-
- if (event == kInitializeEvent || event == kResetEventDeprecated) {
- ASSERT_EQ(1u,
- fread(&sample_rate_hz, sizeof(sample_rate_hz), 1, event_file));
- samples_per_channel = sample_rate_hz / 100;
-
- int32_t unused_device_sample_rate_hz;
- ASSERT_EQ(1u,
- fread(&unused_device_sample_rate_hz,
- sizeof(unused_device_sample_rate_hz),
- 1,
- event_file));
-
- ASSERT_EQ(kNoErr, apm->Initialize(
- sample_rate_hz,
- sample_rate_hz,
- sample_rate_hz,
- LayoutFromChannels(num_capture_input_channels),
- LayoutFromChannels(num_capture_output_channels),
- LayoutFromChannels(num_render_channels)));
-
- far_frame.sample_rate_hz_ = sample_rate_hz;
- far_frame.samples_per_channel_ = samples_per_channel;
- far_frame.num_channels_ = num_render_channels;
- near_frame.sample_rate_hz_ = sample_rate_hz;
- near_frame.samples_per_channel_ = samples_per_channel;
-
- if (!raw_output) {
- // The WAV file needs to be reset every time, because it can't change
- // it's sample rate or number of channels.
- output_wav_file.reset(new WavWriter(out_filename + ".wav",
- sample_rate_hz,
- num_capture_output_channels));
- }
-
- if (verbose) {
- printf("Init at frame: %d (primary), %d (reverse)\n",
- primary_count, reverse_count);
- printf(" Sample rate: %d Hz\n", sample_rate_hz);
- }
-
- } else if (event == kRenderEvent) {
- reverse_count++;
-
- size_t size = samples_per_channel * num_render_channels;
- read_count = fread(far_frame.data_,
- sizeof(int16_t),
- size,
- far_file);
-
- if (simulating) {
- if (read_count != size) {
- // Read an equal amount from the near file to avoid errors due to
- // not reaching end-of-file.
- EXPECT_EQ(0, fseek(near_file, read_count * sizeof(int16_t),
- SEEK_CUR));
- break; // This is expected.
- }
- } else {
- ASSERT_EQ(size, read_count);
- }
-
- if (perf_testing) {
- t0 = rtc::TimeNanos();
- }
-
- ASSERT_EQ(apm->kNoError,
- apm->ProcessReverseStream(&far_frame));
-
- if (perf_testing) {
- t1 = rtc::TimeNanos();
- int64_t diff_nanos = t1 - t0;
- acc_nanos += diff_nanos;
- int64_t diff_us = diff_nanos / rtc::kNumNanosecsPerMicrosec;
- if (diff_us > max_time_reverse_us) {
- max_time_reverse_us = diff_us;
- }
- if (diff_us < min_time_reverse_us) {
- min_time_reverse_us = diff_us;
- }
- }
-
- } else if (event == kCaptureEvent) {
- primary_count++;
- near_frame.num_channels_ = num_capture_input_channels;
-
- size_t size = samples_per_channel * num_capture_input_channels;
- read_count = fread(near_frame.data_,
- sizeof(int16_t),
- size,
- near_file);
-
- near_read_bytes += read_count * sizeof(int16_t);
- if (progress && primary_count % 100 == 0) {
- printf("%.0f%% complete\r",
- (near_read_bytes * 100.0) / near_size_bytes);
- fflush(stdout);
- }
- if (simulating) {
- if (read_count != size) {
- break; // This is expected.
- }
-
- delay_ms = 0;
- drift_samples = 0;
- } else {
- ASSERT_EQ(size, read_count);
-
- // TODO(ajm): sizeof(delay_ms) for current files?
- ASSERT_EQ(1u,
- fread(&delay_ms, 2, 1, delay_file));
- ASSERT_EQ(1u,
- fread(&drift_samples, sizeof(drift_samples), 1, drift_file));
- }
-
- if (apm->gain_control()->is_enabled() &&
- apm->gain_control()->mode() == GainControl::kAdaptiveAnalog) {
- SimulateMic(capture_level, &near_frame);
- }
-
- if (perf_testing) {
- t0 = rtc::TimeNanos();
- }
-
- const int capture_level_in = capture_level;
- ASSERT_EQ(apm->kNoError,
- apm->gain_control()->set_stream_analog_level(capture_level));
- delay_ms += extra_delay_ms;
- if (override_delay_ms) {
- delay_ms = override_delay_ms;
- }
- ASSERT_EQ(apm->kNoError,
- apm->set_stream_delay_ms(delay_ms));
- apm->echo_cancellation()->set_stream_drift_samples(drift_samples);
-
- apm->set_stream_key_pressed(true);
-
- int err = apm->ProcessStream(&near_frame);
- if (err == apm->kBadStreamParameterWarning) {
- printf("Bad parameter warning. %s\n", trace_stream.str().c_str());
- }
- ASSERT_TRUE(err == apm->kNoError ||
- err == apm->kBadStreamParameterWarning);
- ASSERT_TRUE(near_frame.num_channels_ == apm->num_output_channels());
-
- capture_level = apm->gain_control()->stream_analog_level();
-
- stream_has_voice =
- static_cast<int8_t>(apm->voice_detection()->stream_has_voice());
- if (vad_out_file != NULL) {
- ASSERT_EQ(1u, fwrite(&stream_has_voice,
- sizeof(stream_has_voice),
- 1,
- vad_out_file));
- }
-
- if (ns_prob_file != NULL) {
- ns_speech_prob = apm->noise_suppression()->speech_probability();
- ASSERT_EQ(1u, fwrite(&ns_speech_prob,
- sizeof(ns_speech_prob),
- 1,
- ns_prob_file));
- }
-
- if (apm->gain_control()->mode() != GainControl::kAdaptiveAnalog) {
- ASSERT_EQ(capture_level_in, capture_level);
- }
-
- if (perf_testing) {
- t1 = rtc::TimeNanos();
- int64_t diff_nanos = t1 - t0;
- acc_nanos += diff_nanos;
- int64_t diff_us = diff_nanos / rtc::kNumNanosecsPerMicrosec;
- if (diff_us > max_time_us) {
- max_time_us = diff_us;
- }
- if (diff_us < min_time_us) {
- min_time_us = diff_us;
- }
- }
-
- if (raw_output && !output_raw_file) {
- output_raw_file.reset(new RawFile(out_filename + ".pcm"));
- }
- if (!raw_output && !output_wav_file) {
- output_wav_file.reset(new WavWriter(out_filename + ".wav",
- sample_rate_hz,
- num_capture_output_channels));
- }
- WriteIntData(near_frame.data_,
- size,
- output_wav_file.get(),
- output_raw_file.get());
- } else {
- FAIL() << "Event " << event << " is unrecognized";
- }
- }
- }
- if (progress) {
- printf("100%% complete\r");
- }
-
- if (aecm_echo_path_out_file != NULL) {
- const size_t path_size =
- apm->echo_control_mobile()->echo_path_size_bytes();
- std::unique_ptr<char[]> echo_path(new char[path_size]);
- apm->echo_control_mobile()->GetEchoPath(echo_path.get(), path_size);
- ASSERT_EQ(path_size, fwrite(echo_path.get(),
- sizeof(char),
- path_size,
- aecm_echo_path_out_file));
- fclose(aecm_echo_path_out_file);
- aecm_echo_path_out_file = NULL;
- }
-
- if (verbose) {
- printf("\nProcessed frames: %d (primary), %d (reverse)\n",
- primary_count, reverse_count);
-
- if (apm->level_estimator()->is_enabled()) {
- printf("\n--Level metrics--\n");
- printf("RMS: %d dBFS\n", -apm->level_estimator()->RMS());
- }
- if (apm->echo_cancellation()->are_metrics_enabled()) {
- EchoCancellation::Metrics metrics;
- apm->echo_cancellation()->GetMetrics(&metrics);
- printf("\n--Echo metrics--\n");
- printf("(avg, max, min)\n");
- printf("ERL: ");
- PrintStat(metrics.echo_return_loss);
- printf("ERLE: ");
- PrintStat(metrics.echo_return_loss_enhancement);
- printf("ANLP: ");
- PrintStat(metrics.a_nlp);
- }
- if (apm->echo_cancellation()->is_delay_logging_enabled()) {
- int median = 0;
- int std = 0;
- float fraction_poor_delays = 0;
- apm->echo_cancellation()->GetDelayMetrics(&median, &std,
- &fraction_poor_delays);
- printf("\n--Delay metrics--\n");
- printf("Median: %3d\n", median);
- printf("Standard deviation: %3d\n", std);
- printf("Poor delay values: %3.1f%%\n", fraction_poor_delays * 100);
- }
- }
-
- if (!pb_file) {
- int8_t temp_int8;
- if (far_file) {
- read_count = fread(&temp_int8, sizeof(temp_int8), 1, far_file);
- EXPECT_NE(0, feof(far_file)) << "Far-end file not fully processed";
- }
-
- read_count = fread(&temp_int8, sizeof(temp_int8), 1, near_file);
- EXPECT_NE(0, feof(near_file)) << "Near-end file not fully processed";
-
- if (!simulating) {
- read_count = fread(&temp_int8, sizeof(temp_int8), 1, event_file);
- EXPECT_NE(0, feof(event_file)) << "Event file not fully processed";
- read_count = fread(&temp_int8, sizeof(temp_int8), 1, delay_file);
- EXPECT_NE(0, feof(delay_file)) << "Delay file not fully processed";
- read_count = fread(&temp_int8, sizeof(temp_int8), 1, drift_file);
- EXPECT_NE(0, feof(drift_file)) << "Drift file not fully processed";
- }
- }
-
- if (perf_testing) {
- if (primary_count > 0) {
- int64_t exec_time = acc_nanos / rtc::kNumNanosecsPerMillisec;
- printf("\nTotal time: %.3f s, file time: %.2f s\n",
- exec_time * 0.001, primary_count * 0.01);
- printf("Time per frame: %.3f ms (average), %.3f ms (max),"
- " %.3f ms (min)\n",
- (exec_time * 1.0) / primary_count,
- (max_time_us + max_time_reverse_us) / 1000.0,
- (min_time_us + min_time_reverse_us) / 1000.0);
- // Record the results with Perf test tools.
- webrtc::test::PrintResult("audioproc", "", "time_per_10ms_frame",
- (exec_time * 1000) / primary_count, "us", false);
- } else {
- printf("Warning: no capture frames\n");
- }
- }
-}
-
-} // namespace
-} // namespace webrtc
-
-int main(int argc, char* argv[]) {
- webrtc::void_main(argc, argv);
-
- // Optional, but removes memory leak noise from Valgrind.
- google::protobuf::ShutdownProtobufLibrary();
- return 0;
-}
« no previous file with comments | « webrtc/modules/audio_processing/audio_processing_tests.gypi ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698