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