blob: a3153b2244cb57b6edc67ad233ebc55501d135be [file] [log] [blame]
* Copyright (c) 2015 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 <algorithm>
#include <limits>
#include <vector>
#include "webrtc/base/scoped_ptr.h"
#include "webrtc/common_audio/channel_buffer.h"
#include "webrtc/common_audio/wav_file.h"
#include "webrtc/modules/audio_processing/include/audio_processing.h"
#include "webrtc/modules/audio_processing/test/test_utils.h"
#include "webrtc/system_wrappers/include/tick_util.h"
#include "external/webrtc/webrtc/modules/audio_processing/debug.pb.h"
#include "webrtc/audio_processing/debug.pb.h"
namespace webrtc {
// Holds a few statistics about a series of TickIntervals.
struct TickIntervalStats {
TickIntervalStats() : min(std::numeric_limits<int64_t>::max()) {}
TickInterval sum;
TickInterval max;
TickInterval min;
// Interface for processing an input file with an AudioProcessing instance and
// dumping the results to an output file.
class AudioFileProcessor {
static const int kChunksPerSecond = 1000 / AudioProcessing::kChunkSizeMs;
virtual ~AudioFileProcessor() {}
// Processes one AudioProcessing::kChunkSizeMs of data from the input file and
// writes to the output file.
virtual bool ProcessChunk() = 0;
// Returns the execution time of all AudioProcessing calls.
const TickIntervalStats& proc_time() const { return proc_time_; }
// RAII class for execution time measurement. Updates the provided
// TickIntervalStats based on the time between ScopedTimer creation and
// leaving the enclosing scope.
class ScopedTimer {
explicit ScopedTimer(TickIntervalStats* proc_time)
: proc_time_(proc_time), start_time_(TickTime::Now()) {}
~ScopedTimer() {
TickInterval interval = TickTime::Now() - start_time_;
proc_time_->sum += interval;
proc_time_->max = std::max(proc_time_->max, interval);
proc_time_->min = std::min(proc_time_->min, interval);
TickIntervalStats* const proc_time_;
TickTime start_time_;
TickIntervalStats* mutable_proc_time() { return &proc_time_; }
TickIntervalStats proc_time_;
// Used to read from and write to WavFile objects.
class WavFileProcessor final : public AudioFileProcessor {
// Takes ownership of all parameters.
WavFileProcessor(rtc::scoped_ptr<AudioProcessing> ap,
rtc::scoped_ptr<WavReader> in_file,
rtc::scoped_ptr<WavWriter> out_file);
virtual ~WavFileProcessor() {}
// Processes one chunk from the WAV input and writes to the WAV output.
bool ProcessChunk() override;
rtc::scoped_ptr<AudioProcessing> ap_;
ChannelBuffer<float> in_buf_;
ChannelBuffer<float> out_buf_;
const StreamConfig input_config_;
const StreamConfig output_config_;
ChannelBufferWavReader buffer_reader_;
ChannelBufferWavWriter buffer_writer_;
// Used to read from an aecdump file and write to a WavWriter.
class AecDumpFileProcessor final : public AudioFileProcessor {
// Takes ownership of all parameters.
AecDumpFileProcessor(rtc::scoped_ptr<AudioProcessing> ap,
FILE* dump_file,
rtc::scoped_ptr<WavWriter> out_file);
virtual ~AecDumpFileProcessor();
// Processes messages from the aecdump file until the first Stream message is
// completed. Passes other data from the aecdump messages as appropriate.
bool ProcessChunk() override;
void HandleMessage(const webrtc::audioproc::Init& msg);
void HandleMessage(const webrtc::audioproc::Stream& msg);
void HandleMessage(const webrtc::audioproc::ReverseStream& msg);
rtc::scoped_ptr<AudioProcessing> ap_;
FILE* dump_file_;
rtc::scoped_ptr<ChannelBuffer<float>> in_buf_;
rtc::scoped_ptr<ChannelBuffer<float>> reverse_buf_;
ChannelBuffer<float> out_buf_;
StreamConfig input_config_;
StreamConfig reverse_config_;
const StreamConfig output_config_;
ChannelBufferWavWriter buffer_writer_;
} // namespace webrtc