1 /* 2 * Copyright (c) 2015 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 #ifndef WEBRTC_MODULES_AUDIO_PROCESSING_TEST_AUDIO_FILE_PROCESSOR_H_ 12 #define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_AUDIO_FILE_PROCESSOR_H_ 13 14 #include <algorithm> 15 #include <limits> 16 #include <vector> 17 18 #include "webrtc/base/scoped_ptr.h" 19 #include "webrtc/common_audio/channel_buffer.h" 20 #include "webrtc/common_audio/wav_file.h" 21 #include "webrtc/modules/audio_processing/include/audio_processing.h" 22 #include "webrtc/modules/audio_processing/test/test_utils.h" 23 #include "webrtc/system_wrappers/include/tick_util.h" 24 25 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD 26 #include "external/webrtc/webrtc/modules/audio_processing/debug.pb.h" 27 #else 28 #include "webrtc/audio_processing/debug.pb.h" 29 #endif 30 31 namespace webrtc { 32 33 // Holds a few statistics about a series of TickIntervals. 34 struct TickIntervalStats { 35 TickIntervalStats() : min(std::numeric_limits<int64_t>::max()) {} 36 TickInterval sum; 37 TickInterval max; 38 TickInterval min; 39 }; 40 41 // Interface for processing an input file with an AudioProcessing instance and 42 // dumping the results to an output file. 43 class AudioFileProcessor { 44 public: 45 static const int kChunksPerSecond = 1000 / AudioProcessing::kChunkSizeMs; 46 47 virtual ~AudioFileProcessor() {} 48 49 // Processes one AudioProcessing::kChunkSizeMs of data from the input file and 50 // writes to the output file. 51 virtual bool ProcessChunk() = 0; 52 53 // Returns the execution time of all AudioProcessing calls. 54 const TickIntervalStats& proc_time() const { return proc_time_; } 55 56 protected: 57 // RAII class for execution time measurement. Updates the provided 58 // TickIntervalStats based on the time between ScopedTimer creation and 59 // leaving the enclosing scope. 60 class ScopedTimer { 61 public: 62 explicit ScopedTimer(TickIntervalStats* proc_time) 63 : proc_time_(proc_time), start_time_(TickTime::Now()) {} 64 65 ~ScopedTimer() { 66 TickInterval interval = TickTime::Now() - start_time_; 67 proc_time_->sum += interval; 68 proc_time_->max = std::max(proc_time_->max, interval); 69 proc_time_->min = std::min(proc_time_->min, interval); 70 } 71 72 private: 73 TickIntervalStats* const proc_time_; 74 TickTime start_time_; 75 }; 76 77 TickIntervalStats* mutable_proc_time() { return &proc_time_; } 78 79 private: 80 TickIntervalStats proc_time_; 81 }; 82 83 // Used to read from and write to WavFile objects. 84 class WavFileProcessor final : public AudioFileProcessor { 85 public: 86 // Takes ownership of all parameters. 87 WavFileProcessor(rtc::scoped_ptr<AudioProcessing> ap, 88 rtc::scoped_ptr<WavReader> in_file, 89 rtc::scoped_ptr<WavWriter> out_file); 90 virtual ~WavFileProcessor() {} 91 92 // Processes one chunk from the WAV input and writes to the WAV output. 93 bool ProcessChunk() override; 94 95 private: 96 rtc::scoped_ptr<AudioProcessing> ap_; 97 98 ChannelBuffer<float> in_buf_; 99 ChannelBuffer<float> out_buf_; 100 const StreamConfig input_config_; 101 const StreamConfig output_config_; 102 ChannelBufferWavReader buffer_reader_; 103 ChannelBufferWavWriter buffer_writer_; 104 }; 105 106 // Used to read from an aecdump file and write to a WavWriter. 107 class AecDumpFileProcessor final : public AudioFileProcessor { 108 public: 109 // Takes ownership of all parameters. 110 AecDumpFileProcessor(rtc::scoped_ptr<AudioProcessing> ap, 111 FILE* dump_file, 112 rtc::scoped_ptr<WavWriter> out_file); 113 114 virtual ~AecDumpFileProcessor(); 115 116 // Processes messages from the aecdump file until the first Stream message is 117 // completed. Passes other data from the aecdump messages as appropriate. 118 bool ProcessChunk() override; 119 120 private: 121 void HandleMessage(const webrtc::audioproc::Init& msg); 122 void HandleMessage(const webrtc::audioproc::Stream& msg); 123 void HandleMessage(const webrtc::audioproc::ReverseStream& msg); 124 125 rtc::scoped_ptr<AudioProcessing> ap_; 126 FILE* dump_file_; 127 128 rtc::scoped_ptr<ChannelBuffer<float>> in_buf_; 129 rtc::scoped_ptr<ChannelBuffer<float>> reverse_buf_; 130 ChannelBuffer<float> out_buf_; 131 StreamConfig input_config_; 132 StreamConfig reverse_config_; 133 const StreamConfig output_config_; 134 ChannelBufferWavWriter buffer_writer_; 135 }; 136 137 } // namespace webrtc 138 139 #endif // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_AUDIO_FILE_PROCESSOR_H_ 140