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;