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 #include "webrtc/modules/audio_coding/main/acm2/acm_receive_test.h" 12 13 #include <assert.h> 14 #include <stdio.h> 15 16 #include "testing/gtest/include/gtest/gtest.h" 17 #include "webrtc/modules/audio_coding/main/interface/audio_coding_module.h" 18 #include "webrtc/modules/audio_coding/neteq/tools/audio_sink.h" 19 #include "webrtc/modules/audio_coding/neteq/tools/packet.h" 20 #include "webrtc/modules/audio_coding/neteq/tools/packet_source.h" 21 22 namespace webrtc { 23 namespace test { 24 25 AcmReceiveTest::AcmReceiveTest(PacketSource* packet_source, 26 AudioSink* audio_sink, 27 int output_freq_hz, 28 NumOutputChannels exptected_output_channels) 29 : clock_(0), 30 packet_source_(packet_source), 31 audio_sink_(audio_sink), 32 output_freq_hz_(output_freq_hz), 33 exptected_output_channels_(exptected_output_channels) { 34 webrtc::AudioCoding::Config config; 35 config.clock = &clock_; 36 config.playout_frequency_hz = output_freq_hz_; 37 acm_.reset(webrtc::AudioCoding::Create(config)); 38 } 39 40 void AcmReceiveTest::RegisterDefaultCodecs() { 41 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kOpus, 120)); 42 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kISAC, 103)); 43 #ifndef WEBRTC_ANDROID 44 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kISACSWB, 104)); 45 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kISACFB, 105)); 46 #endif 47 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16B, 107)); 48 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16Bwb, 108)); 49 ASSERT_TRUE( 50 acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16Bswb32kHz, 109)); 51 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16B_2ch, 111)); 52 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16Bwb_2ch, 112)); 53 ASSERT_TRUE( 54 acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16Bswb32kHz_2ch, 113)); 55 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCMU, 0)); 56 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCMA, 8)); 57 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCMU_2ch, 110)); 58 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCMA_2ch, 118)); 59 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kILBC, 102)); 60 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kG722, 9)); 61 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kG722_2ch, 119)); 62 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kCNNB, 13)); 63 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kCNWB, 98)); 64 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kCNSWB, 99)); 65 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kRED, 127)); 66 } 67 68 void AcmReceiveTest::RegisterNetEqTestCodecs() { 69 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kISAC, 103)); 70 #ifndef WEBRTC_ANDROID 71 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kISACSWB, 104)); 72 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kISACFB, 124)); 73 #endif 74 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16B, 93)); 75 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16Bwb, 94)); 76 ASSERT_TRUE( 77 acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16Bswb32kHz, 95)); 78 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCMU, 0)); 79 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCMA, 8)); 80 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kILBC, 102)); 81 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kG722, 9)); 82 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kCNNB, 13)); 83 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kCNWB, 98)); 84 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kCNSWB, 99)); 85 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kRED, 117)); 86 } 87 88 void AcmReceiveTest::Run() { 89 for (scoped_ptr<Packet> packet(packet_source_->NextPacket()); packet; 90 packet.reset(packet_source_->NextPacket())) { 91 // Pull audio until time to insert packet. 92 while (clock_.TimeInMilliseconds() < packet->time_ms()) { 93 AudioFrame output_frame; 94 EXPECT_TRUE(acm_->Get10MsAudio(&output_frame)); 95 EXPECT_EQ(output_freq_hz_, output_frame.sample_rate_hz_); 96 const int samples_per_block = output_freq_hz_ * 10 / 1000; 97 EXPECT_EQ(samples_per_block, output_frame.samples_per_channel_); 98 if (exptected_output_channels_ != kArbitraryChannels) { 99 if (output_frame.speech_type_ == webrtc::AudioFrame::kPLC) { 100 // Don't check number of channels for PLC output, since each test run 101 // usually starts with a short period of mono PLC before decoding the 102 // first packet. 103 } else { 104 EXPECT_EQ(exptected_output_channels_, output_frame.num_channels_); 105 } 106 } 107 ASSERT_TRUE(audio_sink_->WriteAudioFrame(output_frame)); 108 clock_.AdvanceTimeMilliseconds(10); 109 } 110 111 // Insert packet after converting from RTPHeader to WebRtcRTPHeader. 112 WebRtcRTPHeader header; 113 header.header = packet->header(); 114 header.frameType = kAudioFrameSpeech; 115 memset(&header.type.Audio, 0, sizeof(RTPAudioHeader)); 116 EXPECT_TRUE( 117 acm_->InsertPacket(packet->payload(), 118 static_cast<int32_t>(packet->payload_length_bytes()), 119 header)) 120 << "Failure when inserting packet:" << std::endl 121 << " PT = " << static_cast<int>(header.header.payloadType) << std::endl 122 << " TS = " << header.header.timestamp << std::endl 123 << " SN = " << header.header.sequenceNumber; 124 } 125 } 126 127 } // namespace test 128 } // namespace webrtc 129