Home | History | Annotate | Download | only in test
      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