162 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
 | |
|  *
 | |
|  *  Use of this source code is governed by a BSD-style license
 | |
|  *  that can be found in the LICENSE file in the root of the source
 | |
|  *  tree. An additional intellectual property rights grant can be found
 | |
|  *  in the file PATENTS.  All contributing project authors may
 | |
|  *  be found in the AUTHORS file in the root of the source tree.
 | |
|  */
 | |
| 
 | |
| #include "modules/audio_coding/acm2/acm_receive_test.h"
 | |
| 
 | |
| #include <stdio.h>
 | |
| 
 | |
| #include <memory>
 | |
| 
 | |
| #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 | |
| #include "modules/audio_coding/include/audio_coding_module.h"
 | |
| #include "modules/audio_coding/neteq/tools/audio_sink.h"
 | |
| #include "modules/audio_coding/neteq/tools/packet.h"
 | |
| #include "modules/audio_coding/neteq/tools/packet_source.h"
 | |
| #include "test/gtest.h"
 | |
| 
 | |
| namespace webrtc {
 | |
| namespace test {
 | |
| 
 | |
| namespace {
 | |
| AudioCodingModule::Config MakeAcmConfig(
 | |
|     Clock* clock,
 | |
|     rtc::scoped_refptr<AudioDecoderFactory> decoder_factory) {
 | |
|   AudioCodingModule::Config config;
 | |
|   config.clock = clock;
 | |
|   config.decoder_factory = std::move(decoder_factory);
 | |
|   return config;
 | |
| }
 | |
| }  // namespace
 | |
| 
 | |
| AcmReceiveTestOldApi::AcmReceiveTestOldApi(
 | |
|     PacketSource* packet_source,
 | |
|     AudioSink* audio_sink,
 | |
|     int output_freq_hz,
 | |
|     NumOutputChannels exptected_output_channels,
 | |
|     rtc::scoped_refptr<AudioDecoderFactory> decoder_factory)
 | |
|     : clock_(0),
 | |
|       acm_(webrtc::AudioCodingModule::Create(
 | |
|           MakeAcmConfig(&clock_, std::move(decoder_factory)))),
 | |
|       packet_source_(packet_source),
 | |
|       audio_sink_(audio_sink),
 | |
|       output_freq_hz_(output_freq_hz),
 | |
|       exptected_output_channels_(exptected_output_channels) {}
 | |
| 
 | |
| AcmReceiveTestOldApi::~AcmReceiveTestOldApi() = default;
 | |
| 
 | |
| void AcmReceiveTestOldApi::RegisterDefaultCodecs() {
 | |
|   acm_->SetReceiveCodecs({{103, {"ISAC", 16000, 1}},
 | |
|                           {104, {"ISAC", 32000, 1}},
 | |
|                           {107, {"L16", 8000, 1}},
 | |
|                           {108, {"L16", 16000, 1}},
 | |
|                           {109, {"L16", 32000, 1}},
 | |
|                           {111, {"L16", 8000, 2}},
 | |
|                           {112, {"L16", 16000, 2}},
 | |
|                           {113, {"L16", 32000, 2}},
 | |
|                           {0, {"PCMU", 8000, 1}},
 | |
|                           {110, {"PCMU", 8000, 2}},
 | |
|                           {8, {"PCMA", 8000, 1}},
 | |
|                           {118, {"PCMA", 8000, 2}},
 | |
|                           {102, {"ILBC", 8000, 1}},
 | |
|                           {9, {"G722", 8000, 1}},
 | |
|                           {119, {"G722", 8000, 2}},
 | |
|                           {120, {"OPUS", 48000, 2, {{"stereo", "1"}}}},
 | |
|                           {13, {"CN", 8000, 1}},
 | |
|                           {98, {"CN", 16000, 1}},
 | |
|                           {99, {"CN", 32000, 1}}});
 | |
| }
 | |
| 
 | |
| // Remaps payload types from ACM's default to those used in the resource file
 | |
| // neteq_universal_new.rtp.
 | |
| void AcmReceiveTestOldApi::RegisterNetEqTestCodecs() {
 | |
|   acm_->SetReceiveCodecs({{103, {"ISAC", 16000, 1}},
 | |
|                           {104, {"ISAC", 32000, 1}},
 | |
|                           {93, {"L16", 8000, 1}},
 | |
|                           {94, {"L16", 16000, 1}},
 | |
|                           {95, {"L16", 32000, 1}},
 | |
|                           {0, {"PCMU", 8000, 1}},
 | |
|                           {8, {"PCMA", 8000, 1}},
 | |
|                           {102, {"ILBC", 8000, 1}},
 | |
|                           {9, {"G722", 8000, 1}},
 | |
|                           {120, {"OPUS", 48000, 2}},
 | |
|                           {13, {"CN", 8000, 1}},
 | |
|                           {98, {"CN", 16000, 1}},
 | |
|                           {99, {"CN", 32000, 1}}});
 | |
| }
 | |
| 
 | |
| void AcmReceiveTestOldApi::Run() {
 | |
|   for (std::unique_ptr<Packet> packet(packet_source_->NextPacket()); packet;
 | |
|        packet = packet_source_->NextPacket()) {
 | |
|     // Pull audio until time to insert packet.
 | |
|     while (clock_.TimeInMilliseconds() < packet->time_ms()) {
 | |
|       AudioFrame output_frame;
 | |
|       bool muted;
 | |
|       EXPECT_EQ(0,
 | |
|                 acm_->PlayoutData10Ms(output_freq_hz_, &output_frame, &muted));
 | |
|       ASSERT_EQ(output_freq_hz_, output_frame.sample_rate_hz_);
 | |
|       ASSERT_FALSE(muted);
 | |
|       const size_t samples_per_block =
 | |
|           static_cast<size_t>(output_freq_hz_ * 10 / 1000);
 | |
|       EXPECT_EQ(samples_per_block, output_frame.samples_per_channel_);
 | |
|       if (exptected_output_channels_ != kArbitraryChannels) {
 | |
|         if (output_frame.speech_type_ == webrtc::AudioFrame::kPLC) {
 | |
|           // Don't check number of channels for PLC output, since each test run
 | |
|           // usually starts with a short period of mono PLC before decoding the
 | |
|           // first packet.
 | |
|         } else {
 | |
|           EXPECT_EQ(exptected_output_channels_, output_frame.num_channels_);
 | |
|         }
 | |
|       }
 | |
|       ASSERT_TRUE(audio_sink_->WriteAudioFrame(output_frame));
 | |
|       clock_.AdvanceTimeMilliseconds(10);
 | |
|       AfterGetAudio();
 | |
|     }
 | |
| 
 | |
|     EXPECT_EQ(0, acm_->IncomingPacket(
 | |
|                      packet->payload(),
 | |
|                      static_cast<int32_t>(packet->payload_length_bytes()),
 | |
|                      packet->header()))
 | |
|         << "Failure when inserting packet:" << std::endl
 | |
|         << "  PT = " << static_cast<int>(packet->header().payloadType)
 | |
|         << std::endl
 | |
|         << "  TS = " << packet->header().timestamp << std::endl
 | |
|         << "  SN = " << packet->header().sequenceNumber;
 | |
|   }
 | |
| }
 | |
| 
 | |
| AcmReceiveTestToggleOutputFreqOldApi::AcmReceiveTestToggleOutputFreqOldApi(
 | |
|     PacketSource* packet_source,
 | |
|     AudioSink* audio_sink,
 | |
|     int output_freq_hz_1,
 | |
|     int output_freq_hz_2,
 | |
|     int toggle_period_ms,
 | |
|     NumOutputChannels exptected_output_channels)
 | |
|     : AcmReceiveTestOldApi(packet_source,
 | |
|                            audio_sink,
 | |
|                            output_freq_hz_1,
 | |
|                            exptected_output_channels,
 | |
|                            CreateBuiltinAudioDecoderFactory()),
 | |
|       output_freq_hz_1_(output_freq_hz_1),
 | |
|       output_freq_hz_2_(output_freq_hz_2),
 | |
|       toggle_period_ms_(toggle_period_ms),
 | |
|       last_toggle_time_ms_(clock_.TimeInMilliseconds()) {}
 | |
| 
 | |
| void AcmReceiveTestToggleOutputFreqOldApi::AfterGetAudio() {
 | |
|   if (clock_.TimeInMilliseconds() >= last_toggle_time_ms_ + toggle_period_ms_) {
 | |
|     output_freq_hz_ = (output_freq_hz_ == output_freq_hz_1_)
 | |
|                           ? output_freq_hz_2_
 | |
|                           : output_freq_hz_1_;
 | |
|     last_toggle_time_ms_ = clock_.TimeInMilliseconds();
 | |
|   }
 | |
| }
 | |
| 
 | |
| }  // namespace test
 | |
| }  // namespace webrtc
 |