| OLD | NEW |
| (Empty) |
| 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 expected_output_channels) | |
| 29 : clock_(0), | |
| 30 packet_source_(packet_source), | |
| 31 audio_sink_(audio_sink), | |
| 32 output_freq_hz_(output_freq_hz), | |
| 33 expected_output_channels_(expected_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 #ifdef WEBRTC_CODEC_OPUS | |
| 42 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kOpus, 120)); | |
| 43 #endif | |
| 44 #if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX) | |
| 45 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kISAC, 103)); | |
| 46 #endif | |
| 47 #ifdef WEBRTC_CODEC_ISAC | |
| 48 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kISACSWB, 104)); | |
| 49 #endif | |
| 50 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16B, 107)); | |
| 51 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16Bwb, 108)); | |
| 52 ASSERT_TRUE( | |
| 53 acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16Bswb32kHz, 109)); | |
| 54 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16B_2ch, 111)); | |
| 55 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16Bwb_2ch, 112)); | |
| 56 ASSERT_TRUE( | |
| 57 acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16Bswb32kHz_2ch, 113)); | |
| 58 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCMU, 0)); | |
| 59 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCMA, 8)); | |
| 60 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCMU_2ch, 110)); | |
| 61 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCMA_2ch, 118)); | |
| 62 #ifdef WEBRTC_CODEC_ILBC | |
| 63 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kILBC, 102)); | |
| 64 #endif | |
| 65 #ifdef WEBRTC_CODEC_G722 | |
| 66 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kG722, 9)); | |
| 67 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kG722_2ch, 119)); | |
| 68 #endif | |
| 69 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kCNNB, 13)); | |
| 70 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kCNWB, 98)); | |
| 71 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kCNSWB, 99)); | |
| 72 #ifdef WEBRTC_CODEC_RED | |
| 73 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kRED, 127)); | |
| 74 #endif | |
| 75 } | |
| 76 | |
| 77 void AcmReceiveTest::RegisterNetEqTestCodecs() { | |
| 78 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kISAC, 103)); | |
| 79 #ifndef WEBRTC_ANDROID | |
| 80 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kISACSWB, 104)); | |
| 81 #endif | |
| 82 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16B, 93)); | |
| 83 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16Bwb, 94)); | |
| 84 ASSERT_TRUE( | |
| 85 acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCM16Bswb32kHz, 95)); | |
| 86 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCMU, 0)); | |
| 87 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kPCMA, 8)); | |
| 88 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kILBC, 102)); | |
| 89 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kG722, 9)); | |
| 90 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kCNNB, 13)); | |
| 91 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kCNWB, 98)); | |
| 92 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kCNSWB, 99)); | |
| 93 ASSERT_TRUE(acm_->RegisterReceiveCodec(acm2::ACMCodecDB::kRED, 117)); | |
| 94 } | |
| 95 | |
| 96 void AcmReceiveTest::Run() { | |
| 97 for (rtc::scoped_ptr<Packet> packet(packet_source_->NextPacket()); packet; | |
| 98 packet.reset(packet_source_->NextPacket())) { | |
| 99 // Pull audio until time to insert packet. | |
| 100 while (clock_.TimeInMilliseconds() < packet->time_ms()) { | |
| 101 AudioFrame output_frame; | |
| 102 EXPECT_TRUE(acm_->Get10MsAudio(&output_frame)); | |
| 103 EXPECT_EQ(output_freq_hz_, output_frame.sample_rate_hz_); | |
| 104 const size_t samples_per_block = | |
| 105 static_cast<size_t>(output_freq_hz_ * 10 / 1000); | |
| 106 EXPECT_EQ(samples_per_block, output_frame.samples_per_channel_); | |
| 107 if (expected_output_channels_ != kArbitraryChannels) { | |
| 108 if (output_frame.speech_type_ == webrtc::AudioFrame::kPLC) { | |
| 109 // Don't check number of channels for PLC output, since each test run | |
| 110 // usually starts with a short period of mono PLC before decoding the | |
| 111 // first packet. | |
| 112 } else { | |
| 113 EXPECT_EQ(expected_output_channels_, output_frame.num_channels_); | |
| 114 } | |
| 115 } | |
| 116 ASSERT_TRUE(audio_sink_->WriteAudioFrame(output_frame)); | |
| 117 clock_.AdvanceTimeMilliseconds(10); | |
| 118 } | |
| 119 | |
| 120 // Insert packet after converting from RTPHeader to WebRtcRTPHeader. | |
| 121 WebRtcRTPHeader header; | |
| 122 header.header = packet->header(); | |
| 123 header.frameType = kAudioFrameSpeech; | |
| 124 memset(&header.type.Audio, 0, sizeof(RTPAudioHeader)); | |
| 125 EXPECT_TRUE(acm_->InsertPacket(packet->payload(), | |
| 126 packet->payload_length_bytes(), | |
| 127 header)) | |
| 128 << "Failure when inserting packet:" << std::endl | |
| 129 << " PT = " << static_cast<int>(header.header.payloadType) << std::endl | |
| 130 << " TS = " << header.header.timestamp << std::endl | |
| 131 << " SN = " << header.header.sequenceNumber; | |
| 132 } | |
| 133 } | |
| 134 | |
| 135 } // namespace test | |
| 136 } // namespace webrtc | |
| OLD | NEW |