From fd7c0a566a98c936005d3490bb92768a4abbb217 Mon Sep 17 00:00:00 2001 From: Ivo Creusen Date: Fri, 20 Oct 2017 12:35:04 +0200 Subject: [PATCH] Avoid NetEq triggering a Framelength change when receiving an FEC packet. Internally in NetEq, an FEC packet looks very similar to a split packet, which caused NetEq to miscalculate the frame length of FEC packets. This incorrect framelength calculation was incorrectly handled as a framelength change by NetEq. Bug: webrtc:8410 Change-Id: Icaea961d055e49d7726b87811881db0b9149805b Reviewed-on: https://webrtc-review.googlesource.com/12420 Commit-Queue: Ivo Creusen Reviewed-by: Henrik Lundin Cr-Commit-Position: refs/heads/master@{#20373} --- modules/audio_coding/neteq/neteq_impl.cc | 15 +++++++------- .../audio_coding/neteq/neteq_impl_unittest.cc | 4 ---- modules/audio_coding/neteq/neteq_unittest.cc | 20 +++++++++---------- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/modules/audio_coding/neteq/neteq_impl.cc b/modules/audio_coding/neteq/neteq_impl.cc index 36d6b27aff..e7757ae5b1 100644 --- a/modules/audio_coding/neteq/neteq_impl.cc +++ b/modules/audio_coding/neteq/neteq_impl.cc @@ -730,9 +730,12 @@ int NetEqImpl::InsertPacketInternal(const RTPHeader& rtp_header, } } + // Calculate the number of primary (non-FEC/RED) packets. + const int number_of_primary_packets = std::count_if( + parsed_packet_list.begin(), parsed_packet_list.end(), + [](const Packet& in) { return in.priority.codec_level == 0; }); + // Insert packets in buffer. - const size_t buffer_length_before_insert = - packet_buffer_->NumPacketsInBuffer(); const int ret = packet_buffer_->InsertPacketList( &parsed_packet_list, *decoder_database_, ¤t_rtp_payload_type_, ¤t_cng_rtp_payload_type_, &stats_); @@ -795,13 +798,9 @@ int NetEqImpl::InsertPacketInternal(const RTPHeader& rtp_header, dec_info->IsDtmf()); if (delay_manager_->last_pack_cng_or_dtmf() == 0) { // Calculate the total speech length carried in each packet. - const size_t buffer_length_after_insert = - packet_buffer_->NumPacketsInBuffer(); - - if (buffer_length_after_insert > buffer_length_before_insert) { + if (number_of_primary_packets > 0) { const size_t packet_length_samples = - (buffer_length_after_insert - buffer_length_before_insert) * - decoder_frame_length_; + number_of_primary_packets * decoder_frame_length_; if (packet_length_samples != decision_logic_->packet_length_samples()) { decision_logic_->set_packet_length_samples(packet_length_samples); delay_manager_->SetPacketAudioLength( diff --git a/modules/audio_coding/neteq/neteq_impl_unittest.cc b/modules/audio_coding/neteq/neteq_impl_unittest.cc index e8d9b10dd8..53c2b3c567 100644 --- a/modules/audio_coding/neteq/neteq_impl_unittest.cc +++ b/modules/audio_coding/neteq/neteq_impl_unittest.cc @@ -342,10 +342,6 @@ TEST_F(NetEqImplTest, InsertPacket) { .WillRepeatedly(Return(&info)); // Expectations for packet buffer. - EXPECT_CALL(*mock_packet_buffer_, NumPacketsInBuffer()) - .WillOnce(Return(0)) // First packet. - .WillOnce(Return(1)) // Second packet. - .WillOnce(Return(2)); // Second packet, checking after it was inserted. EXPECT_CALL(*mock_packet_buffer_, Empty()) .WillOnce(Return(false)); // Called once after first packet is inserted. EXPECT_CALL(*mock_packet_buffer_, Flush()) diff --git a/modules/audio_coding/neteq/neteq_unittest.cc b/modules/audio_coding/neteq/neteq_unittest.cc index 592323e9a5..bb8c4e9b4c 100644 --- a/modules/audio_coding/neteq/neteq_unittest.cc +++ b/modules/audio_coding/neteq/neteq_unittest.cc @@ -500,18 +500,18 @@ TEST_F(NetEqDecodingTest, MAYBE_TestOpusBitExactness) { webrtc::test::ResourcePath("audio_coding/neteq_opus", "rtp"); const std::string output_checksum = PlatformChecksum( - "721e1e0c6effe4b2401536a4eef11512c9fb709c", - "2e3c3e451532967e981fbc39b8cfb55e1df1ff7f", - "f403940a1936bff040d1d158624f69bdccbc3423", - "721e1e0c6effe4b2401536a4eef11512c9fb709c", - "721e1e0c6effe4b2401536a4eef11512c9fb709c"); + "7ea28d7edf9395f4ac8e8d8dd3a9e5c620b1bf48", + "5b1e691ab1c4465c742d6d944bc71e3b1c0e4c0e", + "b096114dd8c233eaf2b0ce9802ac95af13933772", + "7ea28d7edf9395f4ac8e8d8dd3a9e5c620b1bf48", + "7ea28d7edf9395f4ac8e8d8dd3a9e5c620b1bf48"); const std::string network_stats_checksum = - PlatformChecksum("4e749c46e2611877120ac7a20cbbe555cfbd70ea", - "1edee6d07e0005327c32a77f9b3c0c1f03780e9f", - "ff806c574f82a089dec4c37ea1224b1eb0822d23", - "4e749c46e2611877120ac7a20cbbe555cfbd70ea", - "4e749c46e2611877120ac7a20cbbe555cfbd70ea"); + PlatformChecksum("9e72233c78baf685e500dd6c94212b30a4c5f27d", + "9a37270e4242fbd31e80bb47dc5e7ab82cf2d557", + "4f1e9734bc80a290faaf9d611efcb8d7802dbc4f", + "9e72233c78baf685e500dd6c94212b30a4c5f27d", + "9e72233c78baf685e500dd6c94212b30a4c5f27d"); const std::string rtcp_stats_checksum = PlatformChecksum( "e37c797e3de6a64dda88c9ade7a013d022a2e1e0",