Home | History | Annotate | Download | only in tools
      1 /*
      2  *  Copyright (c) 2014 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_CODING_CODECS_TOOLS_AUDIO_CODEC_SPEED_TEST_H_
     12 #define WEBRTC_MODULES_AUDIO_CODING_CODECS_TOOLS_AUDIO_CODEC_SPEED_TEST_H_
     13 
     14 #include <string>
     15 #include "testing/gtest/include/gtest/gtest.h"
     16 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
     17 #include "webrtc/typedefs.h"
     18 
     19 namespace webrtc {
     20 
     21 // Define coding parameter as
     22 // <channels, bit_rate, file_name, extension, if_save_output>.
     23 typedef std::tr1::tuple<int, int, std::string, std::string, bool> coding_param;
     24 
     25 class AudioCodecSpeedTest : public testing::TestWithParam<coding_param> {
     26  protected:
     27   AudioCodecSpeedTest(int block_duration_ms,
     28                       int input_sampling_khz,
     29                       int output_sampling_khz);
     30   virtual void SetUp();
     31   virtual void TearDown();
     32 
     33   // EncodeABlock(...) does the following:
     34   // 1. encodes a block of audio, saved in |in_data|,
     35   // 2. save the bit stream to |bit_stream| of |max_bytes| bytes in size,
     36   // 3. assign |encoded_bytes| with the length of the bit stream (in bytes),
     37   // 4. return the cost of time (in millisecond) spent on actual encoding.
     38   virtual float EncodeABlock(int16_t* in_data, uint8_t* bit_stream,
     39                              int max_bytes, int* encoded_bytes) = 0;
     40 
     41   // DecodeABlock(...) does the following:
     42   // 1. decodes the bit stream in |bit_stream| with a length of |encoded_bytes|
     43   // (in bytes),
     44   // 2. save the decoded audio in |out_data|,
     45   // 3. return the cost of time (in millisecond) spent on actual decoding.
     46   virtual float DecodeABlock(const uint8_t* bit_stream, int encoded_bytes,
     47                              int16_t* out_data) = 0;
     48 
     49   // Encoding and decode an audio of |audio_duration| (in seconds) and
     50   // record the runtime for encoding and decoding separately.
     51   void EncodeDecode(size_t audio_duration);
     52 
     53   int block_duration_ms_;
     54   int input_sampling_khz_;
     55   int output_sampling_khz_;
     56 
     57   // Number of samples-per-channel in a frame.
     58   int input_length_sample_;
     59 
     60   // Expected output number of samples-per-channel in a frame.
     61   int output_length_sample_;
     62 
     63   scoped_ptr<int16_t[]> in_data_;
     64   scoped_ptr<int16_t[]> out_data_;
     65   size_t data_pointer_;
     66   size_t loop_length_samples_;
     67   scoped_ptr<uint8_t[]> bit_stream_;
     68 
     69   // Maximum number of bytes in output bitstream for a frame of audio.
     70   int max_bytes_;
     71 
     72   int encoded_bytes_;
     73   float encoding_time_ms_;
     74   float decoding_time_ms_;
     75   FILE* out_file_;
     76 
     77   int channels_;
     78 
     79   // Bit rate is in bit-per-second.
     80   int bit_rate_;
     81 
     82   std::string in_filename_;
     83 
     84   // Determines whether to save the output to file.
     85   bool save_out_data_;
     86 };
     87 
     88 }  // namespace webrtc
     89 
     90 #endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_TOOLS_AUDIO_CODEC_SPEED_TEST_H_
     91