neteq_quality_test.cc revision 35ead381f8dff68ba2f6b7ff163ede6cf4bccc24
1b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org/* 2b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 3b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org * 4b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org * Use of this source code is governed by a BSD-style license 5b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org * that can be found in the LICENSE file in the root of the source 6b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org * tree. An additional intellectual property rights grant can be found 7b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org * in the file PATENTS. All contributing project authors may 8b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org */ 10b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org 11b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org#include <stdio.h> 12b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org#include "webrtc/modules/audio_coding/neteq4/tools/neteq_quality_test.h" 13b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org 14b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.orgnamespace webrtc { 15b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.orgnamespace test { 16b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org 17b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.orgconst uint8_t kPayloadType = 95; 18b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.orgconst int kOutputSizeMs = 10; 19b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org 20b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.orgNetEqQualityTest::NetEqQualityTest(int block_duration_ms, 21b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org int in_sampling_khz, 22b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org int out_sampling_khz, 23b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org enum NetEqDecoder decoder_type, 24b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org int channels, 25b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org double drift_factor, 26b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org std::string in_filename, 27b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org std::string out_filename) 28b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org : decoded_time_ms_(0), 29b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org decodable_time_ms_(0), 30b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org drift_factor_(drift_factor), 31b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org block_duration_ms_(block_duration_ms), 32b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org in_sampling_khz_(in_sampling_khz), 33b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org out_sampling_khz_(out_sampling_khz), 34b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org decoder_type_(decoder_type), 35b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org channels_(channels), 36b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org in_filename_(in_filename), 37b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org out_filename_(out_filename), 38b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org in_size_samples_(in_sampling_khz_ * block_duration_ms_), 39b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org out_size_samples_(out_sampling_khz_ * kOutputSizeMs), 40b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org payload_size_bytes_(0), 41b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org max_payload_bytes_(0), 42b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org in_file_(new InputAudioFile(in_filename_)), 43b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org out_file_(NULL), 44b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org rtp_generator_(new RtpGenerator(in_sampling_khz_, 0, 0, 4535ead381f8dff68ba2f6b7ff163ede6cf4bccc24henrik.lundin@webrtc.org decodable_time_ms_)) { 4635ead381f8dff68ba2f6b7ff163ede6cf4bccc24henrik.lundin@webrtc.org NetEq::Config config; 4735ead381f8dff68ba2f6b7ff163ede6cf4bccc24henrik.lundin@webrtc.org config.sample_rate_hz = out_sampling_khz_ * 1000; 4835ead381f8dff68ba2f6b7ff163ede6cf4bccc24henrik.lundin@webrtc.org neteq_.reset(NetEq::Create(config)); 49b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org max_payload_bytes_ = in_size_samples_ * channels_ * sizeof(int16_t); 50b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org in_data_.reset(new int16_t[in_size_samples_ * channels_]); 51b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org payload_.reset(new uint8_t[max_payload_bytes_]); 52b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org out_data_.reset(new int16_t[out_size_samples_ * channels_]); 53b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org} 54b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org 55b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.orgvoid NetEqQualityTest::SetUp() { 56b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org out_file_ = fopen(out_filename_.c_str(), "wb"); 57b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org ASSERT_TRUE(out_file_ != NULL); 58b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org ASSERT_EQ(0, neteq_->RegisterPayloadType(decoder_type_, kPayloadType)); 59b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org rtp_generator_->set_drift_factor(drift_factor_); 60b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org} 61b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org 62b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.orgvoid NetEqQualityTest::TearDown() { 63b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org fclose(out_file_); 64b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org} 65b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org 66b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.orgint NetEqQualityTest::Transmit() { 67b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org int packet_input_time_ms = 68b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org rtp_generator_->GetRtpHeader(kPayloadType, in_size_samples_, 69b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org &rtp_header_); 70b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org if (!PacketLost(packet_input_time_ms) && payload_size_bytes_ > 0) { 71b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org int ret = neteq_->InsertPacket(rtp_header_, &payload_[0], 72b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org payload_size_bytes_, 73b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org packet_input_time_ms * in_sampling_khz_); 74b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org if (ret != NetEq::kOK) 75b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org return -1; 76b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org } 77b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org return packet_input_time_ms; 78b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org} 79b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org 80b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.orgint NetEqQualityTest::DecodeBlock() { 81b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org int channels; 82b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org int samples; 83b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org int ret = neteq_->GetAudio(out_size_samples_ * channels_, &out_data_[0], 84b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org &samples, &channels, NULL); 85b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org 86b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org if (ret != NetEq::kOK) { 87b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org return -1; 88b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org } else { 89b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org assert(channels == channels_); 90b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org assert(samples == kOutputSizeMs * out_sampling_khz_); 91b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org fwrite(&out_data_[0], sizeof(int16_t), samples * channels, out_file_); 92b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org return samples; 93b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org } 94b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org} 95b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org 96b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.orgvoid NetEqQualityTest::Simulate(int end_time_ms) { 97b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org int audio_size_samples; 98b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org 99b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org while (decoded_time_ms_ < end_time_ms) { 100b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org while (decodable_time_ms_ - kOutputSizeMs < decoded_time_ms_) { 101b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org ASSERT_TRUE(in_file_->Read(in_size_samples_ * channels_, &in_data_[0])); 102b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org payload_size_bytes_ = EncodeBlock(&in_data_[0], 103b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org in_size_samples_, &payload_[0], 104b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org max_payload_bytes_); 105b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org decodable_time_ms_ = Transmit() + block_duration_ms_; 106b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org } 107b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org audio_size_samples = DecodeBlock(); 108b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org if (audio_size_samples > 0) { 109b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org decoded_time_ms_ += audio_size_samples / out_sampling_khz_; 110b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org } 111b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org } 112b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org} 113b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org 114b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org} // namespace test 115b28bfa7efcffa3800f64ebd6aeb54face45c180dminyue@webrtc.org} // namespace webrtc 116