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