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 <memory> | |
17 #include <vector> | |
18 | |
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/modules/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(std::unique_ptr<AudioProcessing> ap, | |
88 std::unique_ptr<WavReader> in_file, | |
89 std::unique_ptr<WavWriter> out_file, | |
90 std::unique_ptr<WavReader> reverse_in_file, | |
91 std::unique_ptr<WavWriter> reverse_out_file); | |
92 virtual ~WavFileProcessor() {} | |
93 | |
94 // Processes one chunk from the WAV input and writes to the WAV output. | |
95 bool ProcessChunk() override; | |
96 | |
97 private: | |
98 std::unique_ptr<AudioProcessing> ap_; | |
99 | |
100 ChannelBuffer<float> in_buf_; | |
101 ChannelBuffer<float> out_buf_; | |
102 const StreamConfig input_config_; | |
103 const StreamConfig output_config_; | |
104 ChannelBufferWavReader buffer_reader_; | |
105 ChannelBufferWavWriter buffer_writer_; | |
106 std::unique_ptr<ChannelBuffer<float>> reverse_in_buf_; | |
107 std::unique_ptr<ChannelBuffer<float>> reverse_out_buf_; | |
108 std::unique_ptr<StreamConfig> reverse_input_config_; | |
109 std::unique_ptr<StreamConfig> reverse_output_config_; | |
110 std::unique_ptr<ChannelBufferWavReader> reverse_buffer_reader_; | |
111 std::unique_ptr<ChannelBufferWavWriter> reverse_buffer_writer_; | |
112 }; | |
113 | |
114 // Used to read from an aecdump file and write to a WavWriter. | |
115 class AecDumpFileProcessor final : public AudioFileProcessor { | |
116 public: | |
117 // Takes ownership of all parameters. | |
118 AecDumpFileProcessor(std::unique_ptr<AudioProcessing> ap, | |
119 FILE* dump_file, | |
120 std::unique_ptr<WavWriter> out_file); | |
121 | |
122 virtual ~AecDumpFileProcessor(); | |
123 | |
124 // Processes messages from the aecdump file until the first Stream message is | |
125 // completed. Passes other data from the aecdump messages as appropriate. | |
126 bool ProcessChunk() override; | |
127 | |
128 private: | |
129 void HandleMessage(const webrtc::audioproc::Init& msg); | |
130 void HandleMessage(const webrtc::audioproc::Stream& msg); | |
131 void HandleMessage(const webrtc::audioproc::ReverseStream& msg); | |
132 | |
133 std::unique_ptr<AudioProcessing> ap_; | |
134 FILE* dump_file_; | |
135 | |
136 std::unique_ptr<ChannelBuffer<float>> in_buf_; | |
137 std::unique_ptr<ChannelBuffer<float>> reverse_buf_; | |
138 ChannelBuffer<float> out_buf_; | |
139 StreamConfig input_config_; | |
140 StreamConfig reverse_config_; | |
141 const StreamConfig output_config_; | |
142 ChannelBufferWavWriter buffer_writer_; | |
143 }; | |
144 | |
145 } // namespace webrtc | |
146 | |
147 #endif // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_AUDIO_FILE_PROCESSOR_H_ | |
OLD | NEW |