From d8a03facf6986a011c8f889c63d87f9216a1e912 Mon Sep 17 00:00:00 2001 From: Henrik Lundin Date: Wed, 3 Jun 2015 11:55:45 +0200 Subject: [PATCH] Implement NetEq's CurrentDelay function This was not implemented before. It returns the current total delay (packet buffer and sync buffer) of NetEq. This is the same information that was already available in NetEqNetworkStatistics::current_buffer_size_ms, that can be obtained through NetEq::NetworkStatistics(). But, since the current delay is a key metric of NetEq, it is convenient to have it available in a simpler way. R=kwiberg@webrtc.org, minyue@webrtc.org Review URL: https://webrtc-codereview.appspot.com/51149004 Cr-Commit-Position: refs/heads/master@{#9359} --- .../modules/audio_coding/neteq/interface/neteq.h | 4 ++-- webrtc/modules/audio_coding/neteq/neteq_impl.cc | 16 ++++++++++++++-- webrtc/modules/audio_coding/neteq/neteq_impl.h | 2 +- .../neteq/neteq_network_stats_unittest.cc | 3 +++ .../modules/audio_coding/neteq/neteq_unittest.cc | 2 ++ 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/webrtc/modules/audio_coding/neteq/interface/neteq.h b/webrtc/modules/audio_coding/neteq/interface/neteq.h index 88bf2087ff..93e8172ab4 100644 --- a/webrtc/modules/audio_coding/neteq/interface/neteq.h +++ b/webrtc/modules/audio_coding/neteq/interface/neteq.h @@ -210,8 +210,8 @@ class NetEq { // Not implemented. virtual int TargetDelay() = 0; - // Not implemented. - virtual int CurrentDelay() = 0; + // Returns the current total delay (packet buffer and sync buffer) in ms. + virtual int CurrentDelayMs() const = 0; // Sets the playout mode to |mode|. // Deprecated. Set the mode in the Config struct passed to the constructor. diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl.cc b/webrtc/modules/audio_coding/neteq/neteq_impl.cc index 1351e66634..636594e729 100644 --- a/webrtc/modules/audio_coding/neteq/neteq_impl.cc +++ b/webrtc/modules/audio_coding/neteq/neteq_impl.cc @@ -15,6 +15,7 @@ #include +#include "webrtc/base/checks.h" #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h" #include "webrtc/modules/audio_coding/codecs/audio_decoder.h" #include "webrtc/modules/audio_coding/neteq/accelerate.h" @@ -291,8 +292,19 @@ int NetEqImpl::TargetDelay() { return kNotImplemented; } -int NetEqImpl::CurrentDelay() { - return kNotImplemented; +int NetEqImpl::CurrentDelayMs() const { + CriticalSectionScoped lock(crit_sect_.get()); + if (fs_hz_ == 0) + return 0; + // Sum up the samples in the packet buffer with the future length of the sync + // buffer, and divide the sum by the sample rate. + const int delay_samples = + packet_buffer_->NumSamplesInBuffer(decoder_database_.get(), + decoder_frame_length_) + + static_cast(sync_buffer_->FutureLength()); + // The division below will truncate. + const int delay_ms = delay_samples / rtc::CheckedDivExact(fs_hz_, 1000); + return delay_ms; } // Deprecated. diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl.h b/webrtc/modules/audio_coding/neteq/neteq_impl.h index 55ba067221..4c4660a678 100644 --- a/webrtc/modules/audio_coding/neteq/neteq_impl.h +++ b/webrtc/modules/audio_coding/neteq/neteq_impl.h @@ -138,7 +138,7 @@ class NetEqImpl : public webrtc::NetEq { int TargetDelay() override; - int CurrentDelay() override; + int CurrentDelayMs() const override; // Sets the playout mode to |mode|. // Deprecated. diff --git a/webrtc/modules/audio_coding/neteq/neteq_network_stats_unittest.cc b/webrtc/modules/audio_coding/neteq/neteq_network_stats_unittest.cc index e1a0f69dfa..95f6489a99 100644 --- a/webrtc/modules/audio_coding/neteq/neteq_network_stats_unittest.cc +++ b/webrtc/modules/audio_coding/neteq/neteq_network_stats_unittest.cc @@ -170,6 +170,9 @@ struct NetEqNetworkStatsCheck { CHECK_NETEQ_NETWORK_STATS(added_zero_samples); #undef CHECK_NETEQ_NETWORK_STATS + + // Compare with CurrentDelay, which should be identical. + EXPECT_EQ(stats.current_buffer_size_ms, neteq()->CurrentDelayMs()); } void RunTest(int num_loops, NetEqNetworkStatsCheck expects) { diff --git a/webrtc/modules/audio_coding/neteq/neteq_unittest.cc b/webrtc/modules/audio_coding/neteq/neteq_unittest.cc index b3d6f25f89..678e3a0743 100644 --- a/webrtc/modules/audio_coding/neteq/neteq_unittest.cc +++ b/webrtc/modules/audio_coding/neteq/neteq_unittest.cc @@ -404,6 +404,8 @@ void NetEqDecodingTest::DecodeAndCompare(const std::string& rtp_file, ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats)); ASSERT_NO_FATAL_FAILURE( network_stat_files.ProcessReference(network_stats)); + // Compare with CurrentDelay, which should be identical. + EXPECT_EQ(network_stats.current_buffer_size_ms, neteq_->CurrentDelayMs()); // Process RTCPstat. RtcpStatistics rtcp_stats;