OLD | NEW |
| (Empty) |
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_ | |
OLD | NEW |