Add a TickTimer object to NetEqImpl

The TickTimer is incremented on each call to GetAudioInternal(). Other
than that, the new object is not used yet.

Also adding a unit test in NetEqImplTest to verify that the tick timer
is incremented in the call to NetEq::GetAudio.

BUG=webrtc:5608

Review URL: https://codereview.webrtc.org/1903153005

Cr-Commit-Position: refs/heads/master@{#12493}
This commit is contained in:
henrik.lundin
2016-04-25 10:11:38 -07:00
committed by Commit bot
parent 1c27c6bf4c
commit ed4972116c
4 changed files with 33 additions and 27 deletions

View File

@ -24,6 +24,7 @@
#include "webrtc/modules/audio_coding/neteq/packet_buffer.h" #include "webrtc/modules/audio_coding/neteq/packet_buffer.h"
#include "webrtc/modules/audio_coding/neteq/payload_splitter.h" #include "webrtc/modules/audio_coding/neteq/payload_splitter.h"
#include "webrtc/modules/audio_coding/neteq/preemptive_expand.h" #include "webrtc/modules/audio_coding/neteq/preemptive_expand.h"
#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
#include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h" #include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h"
namespace webrtc { namespace webrtc {
@ -44,6 +45,7 @@ std::string NetEq::Config::ToString() const {
// Creates all classes needed and inject them into a new NetEqImpl object. // Creates all classes needed and inject them into a new NetEqImpl object.
// Return the new object. // Return the new object.
NetEq* NetEq::Create(const NetEq::Config& config) { NetEq* NetEq::Create(const NetEq::Config& config) {
std::unique_ptr<TickTimer> tick_timer(new TickTimer);
BufferLevelFilter* buffer_level_filter = new BufferLevelFilter; BufferLevelFilter* buffer_level_filter = new BufferLevelFilter;
DecoderDatabase* decoder_database = new DecoderDatabase; DecoderDatabase* decoder_database = new DecoderDatabase;
DelayPeakDetector* delay_peak_detector = new DelayPeakDetector; DelayPeakDetector* delay_peak_detector = new DelayPeakDetector;
@ -59,19 +61,11 @@ NetEq* NetEq::Create(const NetEq::Config& config) {
ExpandFactory* expand_factory = new ExpandFactory; ExpandFactory* expand_factory = new ExpandFactory;
PreemptiveExpandFactory* preemptive_expand_factory = PreemptiveExpandFactory* preemptive_expand_factory =
new PreemptiveExpandFactory; new PreemptiveExpandFactory;
return new NetEqImpl(config, return new NetEqImpl(config, std::move(tick_timer), buffer_level_filter,
buffer_level_filter, decoder_database, delay_manager, delay_peak_detector,
decoder_database, dtmf_buffer, dtmf_tone_generator, packet_buffer,
delay_manager, payload_splitter, timestamp_scaler, accelerate_factory,
delay_peak_detector, expand_factory, preemptive_expand_factory);
dtmf_buffer,
dtmf_tone_generator,
packet_buffer,
payload_splitter,
timestamp_scaler,
accelerate_factory,
expand_factory,
preemptive_expand_factory);
} }
} // namespace webrtc } // namespace webrtc

View File

@ -43,6 +43,7 @@
#include "webrtc/modules/audio_coding/neteq/post_decode_vad.h" #include "webrtc/modules/audio_coding/neteq/post_decode_vad.h"
#include "webrtc/modules/audio_coding/neteq/preemptive_expand.h" #include "webrtc/modules/audio_coding/neteq/preemptive_expand.h"
#include "webrtc/modules/audio_coding/neteq/sync_buffer.h" #include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
#include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h" #include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h"
#include "webrtc/modules/include/module_common_types.h" #include "webrtc/modules/include/module_common_types.h"
@ -54,6 +55,7 @@
namespace webrtc { namespace webrtc {
NetEqImpl::NetEqImpl(const NetEq::Config& config, NetEqImpl::NetEqImpl(const NetEq::Config& config,
std::unique_ptr<TickTimer> tick_timer,
BufferLevelFilter* buffer_level_filter, BufferLevelFilter* buffer_level_filter,
DecoderDatabase* decoder_database, DecoderDatabase* decoder_database,
DelayManager* delay_manager, DelayManager* delay_manager,
@ -67,7 +69,8 @@ NetEqImpl::NetEqImpl(const NetEq::Config& config,
ExpandFactory* expand_factory, ExpandFactory* expand_factory,
PreemptiveExpandFactory* preemptive_expand_factory, PreemptiveExpandFactory* preemptive_expand_factory,
bool create_components) bool create_components)
: buffer_level_filter_(buffer_level_filter), : tick_timer_(std::move(tick_timer)),
buffer_level_filter_(buffer_level_filter),
decoder_database_(decoder_database), decoder_database_(decoder_database),
delay_manager_(delay_manager), delay_manager_(delay_manager),
delay_peak_detector_(delay_peak_detector), delay_peak_detector_(delay_peak_detector),
@ -795,6 +798,7 @@ int NetEqImpl::GetAudioInternal(AudioFrame* audio_frame) {
DtmfEvent dtmf_event; DtmfEvent dtmf_event;
Operations operation; Operations operation;
bool play_dtmf; bool play_dtmf;
tick_timer_->Increment();
int return_value = GetDecision(&operation, &packet_list, &dtmf_event, int return_value = GetDecision(&operation, &packet_list, &dtmf_event,
&play_dtmf); &play_dtmf);
if (return_value != 0) { if (return_value != 0) {

View File

@ -24,6 +24,7 @@
#include "webrtc/modules/audio_coding/neteq/random_vector.h" #include "webrtc/modules/audio_coding/neteq/random_vector.h"
#include "webrtc/modules/audio_coding/neteq/rtcp.h" #include "webrtc/modules/audio_coding/neteq/rtcp.h"
#include "webrtc/modules/audio_coding/neteq/statistics_calculator.h" #include "webrtc/modules/audio_coding/neteq/statistics_calculator.h"
#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
#include "webrtc/typedefs.h" #include "webrtc/typedefs.h"
namespace webrtc { namespace webrtc {
@ -68,6 +69,7 @@ class NetEqImpl : public webrtc::NetEq {
// Creates a new NetEqImpl object. The object will assume ownership of all // Creates a new NetEqImpl object. The object will assume ownership of all
// injected dependencies, and will delete them when done. // injected dependencies, and will delete them when done.
NetEqImpl(const NetEq::Config& config, NetEqImpl(const NetEq::Config& config,
std::unique_ptr<TickTimer> tick_timer,
BufferLevelFilter* buffer_level_filter, BufferLevelFilter* buffer_level_filter,
DecoderDatabase* decoder_database, DecoderDatabase* decoder_database,
DelayManager* delay_manager, DelayManager* delay_manager,
@ -328,6 +330,7 @@ class NetEqImpl : public webrtc::NetEq {
virtual void CreateDecisionLogic() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_); virtual void CreateDecisionLogic() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
rtc::CriticalSection crit_sect_; rtc::CriticalSection crit_sect_;
const std::unique_ptr<TickTimer> tick_timer_ GUARDED_BY(crit_sect_);
const std::unique_ptr<BufferLevelFilter> buffer_level_filter_ const std::unique_ptr<BufferLevelFilter> buffer_level_filter_
GUARDED_BY(crit_sect_); GUARDED_BY(crit_sect_);
const std::unique_ptr<DecoderDatabase> decoder_database_ const std::unique_ptr<DecoderDatabase> decoder_database_

View File

@ -57,6 +57,7 @@ class NetEqImplTest : public ::testing::Test {
NetEqImplTest() NetEqImplTest()
: neteq_(NULL), : neteq_(NULL),
config_(), config_(),
tick_timer_(new TickTimer),
mock_buffer_level_filter_(NULL), mock_buffer_level_filter_(NULL),
buffer_level_filter_(NULL), buffer_level_filter_(NULL),
use_mock_buffer_level_filter_(true), use_mock_buffer_level_filter_(true),
@ -146,19 +147,12 @@ class NetEqImplTest : public ::testing::Test {
PreemptiveExpandFactory* preemptive_expand_factory = PreemptiveExpandFactory* preemptive_expand_factory =
new PreemptiveExpandFactory; new PreemptiveExpandFactory;
neteq_ = new NetEqImpl(config_, neteq_ = new NetEqImpl(
buffer_level_filter_, config_, std::unique_ptr<TickTimer>(tick_timer_), buffer_level_filter_,
decoder_database_, decoder_database_, delay_manager_, delay_peak_detector_, dtmf_buffer_,
delay_manager_, dtmf_tone_generator_, packet_buffer_, payload_splitter_,
delay_peak_detector_, timestamp_scaler_, accelerate_factory, expand_factory,
dtmf_buffer_, preemptive_expand_factory);
dtmf_tone_generator_,
packet_buffer_,
payload_splitter_,
timestamp_scaler_,
accelerate_factory,
expand_factory,
preemptive_expand_factory);
ASSERT_TRUE(neteq_ != NULL); ASSERT_TRUE(neteq_ != NULL);
} }
@ -201,6 +195,7 @@ class NetEqImplTest : public ::testing::Test {
NetEqImpl* neteq_; NetEqImpl* neteq_;
NetEq::Config config_; NetEq::Config config_;
TickTimer* tick_timer_;
MockBufferLevelFilter* mock_buffer_level_filter_; MockBufferLevelFilter* mock_buffer_level_filter_;
BufferLevelFilter* buffer_level_filter_; BufferLevelFilter* buffer_level_filter_;
bool use_mock_buffer_level_filter_; bool use_mock_buffer_level_filter_;
@ -1198,4 +1193,14 @@ TEST_F(NetEqImplTest, InitialLastOutputSampleRate) {
EXPECT_EQ(48000, neteq_->last_output_sample_rate_hz()); EXPECT_EQ(48000, neteq_->last_output_sample_rate_hz());
} }
TEST_F(NetEqImplTest, TickTimerIncrement) {
UseNoMocks();
CreateInstance();
ASSERT_TRUE(tick_timer_);
EXPECT_EQ(0u, tick_timer_->ticks());
AudioFrame output;
EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output));
EXPECT_EQ(1u, tick_timer_->ticks());
}
}// namespace webrtc }// namespace webrtc