| Index: webrtc/modules/audio_coding/neteq/neteq_unittest.cc
|
| diff --git a/webrtc/modules/audio_coding/neteq/neteq_unittest.cc b/webrtc/modules/audio_coding/neteq/neteq_unittest.cc
|
| index b63d7c14d1d08e220adc83a4e4fa9f21f99b8f1c..14a48af6709b43083bd11aeb9a2ec333827ca6a9 100644
|
| --- a/webrtc/modules/audio_coding/neteq/neteq_unittest.cc
|
| +++ b/webrtc/modules/audio_coding/neteq/neteq_unittest.cc
|
| @@ -61,20 +61,6 @@ const std::string& PlatformChecksum(const std::string& checksum_general,
|
| #endif // WEBRTC_WIN
|
| }
|
|
|
| -bool IsAllZero(const int16_t* buf, size_t buf_length) {
|
| - bool all_zero = true;
|
| - for (size_t n = 0; n < buf_length && all_zero; ++n)
|
| - all_zero = buf[n] == 0;
|
| - return all_zero;
|
| -}
|
| -
|
| -bool IsAllNonZero(const int16_t* buf, size_t buf_length) {
|
| - bool all_non_zero = true;
|
| - for (size_t n = 0; n < buf_length && all_non_zero; ++n)
|
| - all_non_zero = buf[n] != 0;
|
| - return all_non_zero;
|
| -}
|
| -
|
| #ifdef WEBRTC_NETEQ_UNITTEST_BITEXACT
|
| void Convert(const webrtc::NetEqNetworkStatistics& stats_raw,
|
| webrtc::neteq_unittest::NetEqNetworkStatistics* stats) {
|
| @@ -1079,232 +1065,6 @@ TEST_F(NetEqBgnTestFade, RunTest) {
|
| CheckBgn(32000);
|
| }
|
|
|
| -#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
|
| -#define MAYBE_SyncPacketInsert SyncPacketInsert
|
| -#else
|
| -#define MAYBE_SyncPacketInsert DISABLED_SyncPacketInsert
|
| -#endif
|
| -TEST_F(NetEqDecodingTest, MAYBE_SyncPacketInsert) {
|
| - WebRtcRTPHeader rtp_info;
|
| - uint32_t receive_timestamp = 0;
|
| - // For the readability use the following payloads instead of the defaults of
|
| - // this test.
|
| - uint8_t kPcm16WbPayloadType = 1;
|
| - uint8_t kCngNbPayloadType = 2;
|
| - uint8_t kCngWbPayloadType = 3;
|
| - uint8_t kCngSwb32PayloadType = 4;
|
| - uint8_t kCngSwb48PayloadType = 5;
|
| - uint8_t kAvtPayloadType = 6;
|
| - uint8_t kRedPayloadType = 7;
|
| - uint8_t kIsacPayloadType = 9; // Payload type 8 is already registered.
|
| -
|
| - // Register decoders.
|
| - ASSERT_EQ(0, neteq_->RegisterPayloadType(NetEqDecoder::kDecoderPCM16Bwb,
|
| - "pcm16-wb", kPcm16WbPayloadType));
|
| - ASSERT_EQ(0, neteq_->RegisterPayloadType(NetEqDecoder::kDecoderCNGnb,
|
| - "cng-nb", kCngNbPayloadType));
|
| - ASSERT_EQ(0, neteq_->RegisterPayloadType(NetEqDecoder::kDecoderCNGwb,
|
| - "cng-wb", kCngWbPayloadType));
|
| - ASSERT_EQ(0, neteq_->RegisterPayloadType(NetEqDecoder::kDecoderCNGswb32kHz,
|
| - "cng-swb32", kCngSwb32PayloadType));
|
| - ASSERT_EQ(0, neteq_->RegisterPayloadType(NetEqDecoder::kDecoderCNGswb48kHz,
|
| - "cng-swb48", kCngSwb48PayloadType));
|
| - ASSERT_EQ(0, neteq_->RegisterPayloadType(NetEqDecoder::kDecoderAVT, "avt",
|
| - kAvtPayloadType));
|
| - ASSERT_EQ(0, neteq_->RegisterPayloadType(NetEqDecoder::kDecoderRED, "red",
|
| - kRedPayloadType));
|
| - ASSERT_EQ(0, neteq_->RegisterPayloadType(NetEqDecoder::kDecoderISAC, "isac",
|
| - kIsacPayloadType));
|
| -
|
| - PopulateRtpInfo(0, 0, &rtp_info);
|
| - rtp_info.header.payloadType = kPcm16WbPayloadType;
|
| -
|
| - // The first packet injected cannot be sync-packet.
|
| - EXPECT_EQ(-1, neteq_->InsertSyncPacket(rtp_info, receive_timestamp));
|
| -
|
| - // Payload length of 10 ms PCM16 16 kHz.
|
| - const size_t kPayloadBytes = kBlockSize16kHz * sizeof(int16_t);
|
| - uint8_t payload[kPayloadBytes] = {0};
|
| - ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp));
|
| -
|
| - // Next packet. Last packet contained 10 ms audio.
|
| - rtp_info.header.sequenceNumber++;
|
| - rtp_info.header.timestamp += kBlockSize16kHz;
|
| - receive_timestamp += kBlockSize16kHz;
|
| -
|
| - // Unacceptable payload types CNG, AVT (DTMF), RED.
|
| - rtp_info.header.payloadType = kCngNbPayloadType;
|
| - EXPECT_EQ(-1, neteq_->InsertSyncPacket(rtp_info, receive_timestamp));
|
| -
|
| - rtp_info.header.payloadType = kCngWbPayloadType;
|
| - EXPECT_EQ(-1, neteq_->InsertSyncPacket(rtp_info, receive_timestamp));
|
| -
|
| - rtp_info.header.payloadType = kCngSwb32PayloadType;
|
| - EXPECT_EQ(-1, neteq_->InsertSyncPacket(rtp_info, receive_timestamp));
|
| -
|
| - rtp_info.header.payloadType = kCngSwb48PayloadType;
|
| - EXPECT_EQ(-1, neteq_->InsertSyncPacket(rtp_info, receive_timestamp));
|
| -
|
| - rtp_info.header.payloadType = kAvtPayloadType;
|
| - EXPECT_EQ(-1, neteq_->InsertSyncPacket(rtp_info, receive_timestamp));
|
| -
|
| - rtp_info.header.payloadType = kRedPayloadType;
|
| - EXPECT_EQ(-1, neteq_->InsertSyncPacket(rtp_info, receive_timestamp));
|
| -
|
| - // Change of codec cannot be initiated with a sync packet.
|
| - rtp_info.header.payloadType = kIsacPayloadType;
|
| - EXPECT_EQ(-1, neteq_->InsertSyncPacket(rtp_info, receive_timestamp));
|
| -
|
| - // Change of SSRC is not allowed with a sync packet.
|
| - rtp_info.header.payloadType = kPcm16WbPayloadType;
|
| - ++rtp_info.header.ssrc;
|
| - EXPECT_EQ(-1, neteq_->InsertSyncPacket(rtp_info, receive_timestamp));
|
| -
|
| - --rtp_info.header.ssrc;
|
| - EXPECT_EQ(0, neteq_->InsertSyncPacket(rtp_info, receive_timestamp));
|
| -}
|
| -
|
| -// First insert several noise like packets, then sync-packets. Decoding all
|
| -// packets should not produce error, statistics should not show any packet loss
|
| -// and sync-packets should decode to zero.
|
| -// TODO(turajs) we will have a better test if we have a referece NetEq, and
|
| -// when Sync packets are inserted in "test" NetEq we insert all-zero payload
|
| -// in reference NetEq and compare the output of those two.
|
| -TEST_F(NetEqDecodingTest, SyncPacketDecode) {
|
| - WebRtcRTPHeader rtp_info;
|
| - PopulateRtpInfo(0, 0, &rtp_info);
|
| - const size_t kPayloadBytes = kBlockSize16kHz * sizeof(int16_t);
|
| - uint8_t payload[kPayloadBytes];
|
| - AudioFrame output;
|
| - int algorithmic_frame_delay = algorithmic_delay_ms_ / 10 + 1;
|
| - for (size_t n = 0; n < kPayloadBytes; ++n) {
|
| - payload[n] = (rand() & 0xF0) + 1; // Non-zero random sequence.
|
| - }
|
| - // Insert some packets which decode to noise. We are not interested in
|
| - // actual decoded values.
|
| - uint32_t receive_timestamp = 0;
|
| - bool muted;
|
| - for (int n = 0; n < 100; ++n) {
|
| - ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp));
|
| - ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
|
| - ASSERT_EQ(kBlockSize16kHz, output.samples_per_channel_);
|
| - ASSERT_EQ(1u, output.num_channels_);
|
| -
|
| - rtp_info.header.sequenceNumber++;
|
| - rtp_info.header.timestamp += kBlockSize16kHz;
|
| - receive_timestamp += kBlockSize16kHz;
|
| - }
|
| - const int kNumSyncPackets = 10;
|
| -
|
| - // Make sure sufficient number of sync packets are inserted that we can
|
| - // conduct a test.
|
| - ASSERT_GT(kNumSyncPackets, algorithmic_frame_delay);
|
| - // Insert sync-packets, the decoded sequence should be all-zero.
|
| - for (int n = 0; n < kNumSyncPackets; ++n) {
|
| - ASSERT_EQ(0, neteq_->InsertSyncPacket(rtp_info, receive_timestamp));
|
| - ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
|
| - ASSERT_FALSE(muted);
|
| - ASSERT_EQ(kBlockSize16kHz, output.samples_per_channel_);
|
| - ASSERT_EQ(1u, output.num_channels_);
|
| - if (n > algorithmic_frame_delay) {
|
| - EXPECT_TRUE(IsAllZero(
|
| - output.data_, output.samples_per_channel_ * output.num_channels_));
|
| - }
|
| - rtp_info.header.sequenceNumber++;
|
| - rtp_info.header.timestamp += kBlockSize16kHz;
|
| - receive_timestamp += kBlockSize16kHz;
|
| - }
|
| -
|
| - // We insert regular packets, if sync packet are not correctly buffered then
|
| - // network statistics would show some packet loss.
|
| - for (int n = 0; n <= algorithmic_frame_delay + 10; ++n) {
|
| - ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp));
|
| - ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
|
| - ASSERT_FALSE(muted);
|
| - if (n >= algorithmic_frame_delay + 1) {
|
| - // Expect that this frame contain samples from regular RTP.
|
| - EXPECT_TRUE(IsAllNonZero(
|
| - output.data_, output.samples_per_channel_ * output.num_channels_));
|
| - }
|
| - rtp_info.header.sequenceNumber++;
|
| - rtp_info.header.timestamp += kBlockSize16kHz;
|
| - receive_timestamp += kBlockSize16kHz;
|
| - }
|
| - NetEqNetworkStatistics network_stats;
|
| - ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats));
|
| - // Expecting a "clean" network.
|
| - EXPECT_EQ(0, network_stats.packet_loss_rate);
|
| - EXPECT_EQ(0, network_stats.expand_rate);
|
| - EXPECT_EQ(0, network_stats.accelerate_rate);
|
| - EXPECT_LE(network_stats.preemptive_rate, 150);
|
| -}
|
| -
|
| -// Test if the size of the packet buffer reported correctly when containing
|
| -// sync packets. Also, test if network packets override sync packets. That is to
|
| -// prefer decoding a network packet to a sync packet, if both have same sequence
|
| -// number and timestamp.
|
| -TEST_F(NetEqDecodingTest, SyncPacketBufferSizeAndOverridenByNetworkPackets) {
|
| - WebRtcRTPHeader rtp_info;
|
| - PopulateRtpInfo(0, 0, &rtp_info);
|
| - const size_t kPayloadBytes = kBlockSize16kHz * sizeof(int16_t);
|
| - uint8_t payload[kPayloadBytes];
|
| - AudioFrame output;
|
| - for (size_t n = 0; n < kPayloadBytes; ++n) {
|
| - payload[n] = (rand() & 0xF0) + 1; // Non-zero random sequence.
|
| - }
|
| - // Insert some packets which decode to noise. We are not interested in
|
| - // actual decoded values.
|
| - uint32_t receive_timestamp = 0;
|
| - int algorithmic_frame_delay = algorithmic_delay_ms_ / 10 + 1;
|
| - bool muted;
|
| - for (int n = 0; n < algorithmic_frame_delay; ++n) {
|
| - ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp));
|
| - ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
|
| - ASSERT_EQ(kBlockSize16kHz, output.samples_per_channel_);
|
| - ASSERT_EQ(1u, output.num_channels_);
|
| - rtp_info.header.sequenceNumber++;
|
| - rtp_info.header.timestamp += kBlockSize16kHz;
|
| - receive_timestamp += kBlockSize16kHz;
|
| - }
|
| - const int kNumSyncPackets = 10;
|
| -
|
| - WebRtcRTPHeader first_sync_packet_rtp_info;
|
| - memcpy(&first_sync_packet_rtp_info, &rtp_info, sizeof(rtp_info));
|
| -
|
| - // Insert sync-packets, but no decoding.
|
| - for (int n = 0; n < kNumSyncPackets; ++n) {
|
| - ASSERT_EQ(0, neteq_->InsertSyncPacket(rtp_info, receive_timestamp));
|
| - rtp_info.header.sequenceNumber++;
|
| - rtp_info.header.timestamp += kBlockSize16kHz;
|
| - receive_timestamp += kBlockSize16kHz;
|
| - }
|
| - NetEqNetworkStatistics network_stats;
|
| - ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats));
|
| - EXPECT_EQ(kNumSyncPackets * 10 + algorithmic_delay_ms_,
|
| - network_stats.current_buffer_size_ms);
|
| -
|
| - // Rewind |rtp_info| to that of the first sync packet.
|
| - memcpy(&rtp_info, &first_sync_packet_rtp_info, sizeof(rtp_info));
|
| -
|
| - // Insert.
|
| - for (int n = 0; n < kNumSyncPackets; ++n) {
|
| - ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, receive_timestamp));
|
| - rtp_info.header.sequenceNumber++;
|
| - rtp_info.header.timestamp += kBlockSize16kHz;
|
| - receive_timestamp += kBlockSize16kHz;
|
| - }
|
| -
|
| - // Decode.
|
| - for (int n = 0; n < kNumSyncPackets; ++n) {
|
| - ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
|
| - ASSERT_FALSE(muted);
|
| - ASSERT_EQ(kBlockSize16kHz, output.samples_per_channel_);
|
| - ASSERT_EQ(1u, output.num_channels_);
|
| - EXPECT_TRUE(IsAllNonZero(
|
| - output.data_, output.samples_per_channel_ * output.num_channels_));
|
| - }
|
| -}
|
| -
|
| void NetEqDecodingTest::WrapTest(uint16_t start_seq_no,
|
| uint32_t start_timestamp,
|
| const std::set<uint16_t>& drop_seq_numbers,
|
|
|