From d9faa46d5723a14a40300daa9b6d78f4abfd659c Mon Sep 17 00:00:00 2001 From: "henrik.lundin@webrtc.org" Date: Tue, 14 Jan 2014 10:18:45 +0000 Subject: [PATCH] Changing to using factory methods for some classes in NetEq In this CL, the Expand, Accelerate and PreemptiveExpand objects are created using factory methods. The factory methods are injected into NetEqImpl on creation. This is a step towards implementing a no-decode operation. BUG=2776 R=turaj@webrtc.org Review URL: https://webrtc-codereview.appspot.com/6999005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@5382 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../modules/audio_coding/neteq4/accelerate.cc | 7 +++++ .../modules/audio_coding/neteq4/accelerate.h | 9 ++++++ webrtc/modules/audio_coding/neteq4/expand.cc | 10 +++++++ webrtc/modules/audio_coding/neteq4/expand.h | 11 ++++++++ .../audio_coding/neteq4/expand_unittest.cc | 13 +++++++++ webrtc/modules/audio_coding/neteq4/neteq.cc | 12 +++++++- .../modules/audio_coding/neteq4/neteq_impl.cc | 20 +++++++++---- .../modules/audio_coding/neteq4/neteq_impl.h | 11 +++++++- .../neteq4/neteq_impl_unittest.cc | 13 ++++++++- .../audio_coding/neteq4/preemptive_expand.cc | 7 +++++ .../audio_coding/neteq4/preemptive_expand.h | 10 +++++++ .../neteq4/time_stretch_unittest.cc | 28 +++++++++++++++---- 12 files changed, 137 insertions(+), 14 deletions(-) diff --git a/webrtc/modules/audio_coding/neteq4/accelerate.cc b/webrtc/modules/audio_coding/neteq4/accelerate.cc index 88cfa4dad..eb546e976 100644 --- a/webrtc/modules/audio_coding/neteq4/accelerate.cc +++ b/webrtc/modules/audio_coding/neteq4/accelerate.cc @@ -78,4 +78,11 @@ Accelerate::ReturnCodes Accelerate::CheckCriteriaAndStretch( } } +Accelerate* AccelerateFactory::Create( + int sample_rate_hz, + size_t num_channels, + const BackgroundNoise& background_noise) const { + return new Accelerate(sample_rate_hz, num_channels, background_noise); +} + } // namespace webrtc diff --git a/webrtc/modules/audio_coding/neteq4/accelerate.h b/webrtc/modules/audio_coding/neteq4/accelerate.h index 83e3e3845..81f1abb53 100644 --- a/webrtc/modules/audio_coding/neteq4/accelerate.h +++ b/webrtc/modules/audio_coding/neteq4/accelerate.h @@ -64,5 +64,14 @@ class Accelerate : public TimeStretch { DISALLOW_COPY_AND_ASSIGN(Accelerate); }; +struct AccelerateFactory { + AccelerateFactory() {} + virtual ~AccelerateFactory() {} + + virtual Accelerate* Create(int sample_rate_hz, + size_t num_channels, + const BackgroundNoise& background_noise) const; +}; + } // namespace webrtc #endif // WEBRTC_MODULES_AUDIO_CODING_NETEQ4_ACCELERATE_H_ diff --git a/webrtc/modules/audio_coding/neteq4/expand.cc b/webrtc/modules/audio_coding/neteq4/expand.cc index 73f2ef85a..cba99243d 100644 --- a/webrtc/modules/audio_coding/neteq4/expand.cc +++ b/webrtc/modules/audio_coding/neteq4/expand.cc @@ -864,4 +864,14 @@ void Expand::UpdateLagIndex() { } } +Expand* ExpandFactory::Create(BackgroundNoise* background_noise, + SyncBuffer* sync_buffer, + RandomVector* random_vector, + int fs, + size_t num_channels) const { + return new Expand(background_noise, sync_buffer, random_vector, fs, + num_channels); +} + + } // namespace webrtc diff --git a/webrtc/modules/audio_coding/neteq4/expand.h b/webrtc/modules/audio_coding/neteq4/expand.h index 25ae61903..d5bff9d49 100644 --- a/webrtc/modules/audio_coding/neteq4/expand.h +++ b/webrtc/modules/audio_coding/neteq4/expand.h @@ -153,5 +153,16 @@ class Expand { DISALLOW_COPY_AND_ASSIGN(Expand); }; +struct ExpandFactory { + ExpandFactory() {} + virtual ~ExpandFactory() {} + + virtual Expand* Create(BackgroundNoise* background_noise, + SyncBuffer* sync_buffer, + RandomVector* random_vector, + int fs, + size_t num_channels) const; +}; + } // namespace webrtc #endif // WEBRTC_MODULES_AUDIO_CODING_NETEQ4_EXPAND_H_ diff --git a/webrtc/modules/audio_coding/neteq4/expand_unittest.cc b/webrtc/modules/audio_coding/neteq4/expand_unittest.cc index a63ed142f..353af2cf4 100644 --- a/webrtc/modules/audio_coding/neteq4/expand_unittest.cc +++ b/webrtc/modules/audio_coding/neteq4/expand_unittest.cc @@ -28,6 +28,19 @@ TEST(Expand, CreateAndDestroy) { Expand expand(&bgn, &sync_buffer, &random_vector, fs, channels); } +TEST(Expand, CreateUsingFactory) { + int fs = 8000; + size_t channels = 1; + BackgroundNoise bgn(channels); + SyncBuffer sync_buffer(1, 1000); + RandomVector random_vector; + ExpandFactory expand_factory; + Expand* expand = + expand_factory.Create(&bgn, &sync_buffer, &random_vector, fs, channels); + EXPECT_TRUE(expand != NULL); + delete expand; +} + // TODO(hlundin): Write more tests. } // namespace webrtc diff --git a/webrtc/modules/audio_coding/neteq4/neteq.cc b/webrtc/modules/audio_coding/neteq4/neteq.cc index 1ec71a2a6..a64f01b25 100644 --- a/webrtc/modules/audio_coding/neteq4/neteq.cc +++ b/webrtc/modules/audio_coding/neteq4/neteq.cc @@ -10,15 +10,18 @@ #include "webrtc/modules/audio_coding/neteq4/interface/neteq.h" +#include "webrtc/modules/audio_coding/neteq4/accelerate.h" #include "webrtc/modules/audio_coding/neteq4/buffer_level_filter.h" #include "webrtc/modules/audio_coding/neteq4/decoder_database.h" #include "webrtc/modules/audio_coding/neteq4/delay_manager.h" #include "webrtc/modules/audio_coding/neteq4/delay_peak_detector.h" #include "webrtc/modules/audio_coding/neteq4/dtmf_buffer.h" #include "webrtc/modules/audio_coding/neteq4/dtmf_tone_generator.h" +#include "webrtc/modules/audio_coding/neteq4/expand.h" #include "webrtc/modules/audio_coding/neteq4/neteq_impl.h" #include "webrtc/modules/audio_coding/neteq4/packet_buffer.h" #include "webrtc/modules/audio_coding/neteq4/payload_splitter.h" +#include "webrtc/modules/audio_coding/neteq4/preemptive_expand.h" #include "webrtc/modules/audio_coding/neteq4/timestamp_scaler.h" namespace webrtc { @@ -37,6 +40,10 @@ NetEq* NetEq::Create(int sample_rate_hz) { kMaxBytesInBuffer); PayloadSplitter* payload_splitter = new PayloadSplitter; TimestampScaler* timestamp_scaler = new TimestampScaler(*decoder_database); + AccelerateFactory* accelerate_factory = new AccelerateFactory; + ExpandFactory* expand_factory = new ExpandFactory; + PreemptiveExpandFactory* preemptive_expand_factory = + new PreemptiveExpandFactory; return new NetEqImpl(sample_rate_hz, buffer_level_filter, decoder_database, @@ -46,7 +53,10 @@ NetEq* NetEq::Create(int sample_rate_hz) { dtmf_tone_generator, packet_buffer, payload_splitter, - timestamp_scaler); + timestamp_scaler, + accelerate_factory, + expand_factory, + preemptive_expand_factory); } } // namespace webrtc diff --git a/webrtc/modules/audio_coding/neteq4/neteq_impl.cc b/webrtc/modules/audio_coding/neteq4/neteq_impl.cc index cd69fc9e3..d6fce18cc 100644 --- a/webrtc/modules/audio_coding/neteq4/neteq_impl.cc +++ b/webrtc/modules/audio_coding/neteq4/neteq_impl.cc @@ -58,7 +58,10 @@ NetEqImpl::NetEqImpl(int fs, DtmfToneGenerator* dtmf_tone_generator, PacketBuffer* packet_buffer, PayloadSplitter* payload_splitter, - TimestampScaler* timestamp_scaler) + TimestampScaler* timestamp_scaler, + AccelerateFactory* accelerate_factory, + ExpandFactory* expand_factory, + PreemptiveExpandFactory* preemptive_expand_factory) : buffer_level_filter_(buffer_level_filter), decoder_database_(decoder_database), delay_manager_(delay_manager), @@ -69,6 +72,9 @@ NetEqImpl::NetEqImpl(int fs, payload_splitter_(payload_splitter), timestamp_scaler_(timestamp_scaler), vad_(new PostDecodeVad()), + expand_factory_(expand_factory), + accelerate_factory_(accelerate_factory), + preemptive_expand_factory_(preemptive_expand_factory), last_mode_(kModeNormal), mute_factor_array_(NULL), decoded_buffer_length_(kMaxFrameSize), @@ -1853,8 +1859,9 @@ void NetEqImpl::SetSampleRateAndChannels(int fs_hz, size_t channels) { random_vector_.Reset(); // Delete Expand object and create a new one. - expand_.reset(new Expand(background_noise_.get(), sync_buffer_.get(), - &random_vector_, fs_hz, channels)); + expand_.reset(expand_factory_->Create(background_noise_.get(), + sync_buffer_.get(), &random_vector_, + fs_hz, channels)); // Move index so that we create a small set of future samples (all 0). sync_buffer_->set_next_index(sync_buffer_->next_index() - expand_->overlap_length()); @@ -1862,9 +1869,10 @@ void NetEqImpl::SetSampleRateAndChannels(int fs_hz, size_t channels) { normal_.reset(new Normal(fs_hz, decoder_database_.get(), *background_noise_, expand_.get())); merge_.reset(new Merge(fs_hz, channels, expand_.get(), sync_buffer_.get())); - accelerate_.reset(new Accelerate(fs_hz, channels, *background_noise_)); - preemptive_expand_.reset(new PreemptiveExpand(fs_hz, channels, - *background_noise_)); + accelerate_.reset( + accelerate_factory_->Create(fs_hz, channels, *background_noise_)); + preemptive_expand_.reset( + preemptive_expand_factory_->Create(fs_hz, channels, *background_noise_)); // Delete ComfortNoise object and create a new one. comfort_noise_.reset(new ComfortNoise(fs_hz, decoder_database_.get(), diff --git a/webrtc/modules/audio_coding/neteq4/neteq_impl.h b/webrtc/modules/audio_coding/neteq4/neteq_impl.h index 83dd58b5a..c17ff1e29 100644 --- a/webrtc/modules/audio_coding/neteq4/neteq_impl.h +++ b/webrtc/modules/audio_coding/neteq4/neteq_impl.h @@ -48,7 +48,10 @@ class PreemptiveExpand; class RandomVector; class SyncBuffer; class TimestampScaler; +struct AccelerateFactory; struct DtmfEvent; +struct ExpandFactory; +struct PreemptiveExpandFactory; class NetEqImpl : public webrtc::NetEq { public: @@ -63,7 +66,10 @@ class NetEqImpl : public webrtc::NetEq { DtmfToneGenerator* dtmf_tone_generator, PacketBuffer* packet_buffer, PayloadSplitter* payload_splitter, - TimestampScaler* timestamp_scaler); + TimestampScaler* timestamp_scaler, + AccelerateFactory* accelerate_factory, + ExpandFactory* expand_factory, + PreemptiveExpandFactory* preemptive_expand_factory); virtual ~NetEqImpl(); @@ -315,10 +321,13 @@ class NetEqImpl : public webrtc::NetEq { scoped_ptr algorithm_buffer_; scoped_ptr sync_buffer_; scoped_ptr expand_; + scoped_ptr expand_factory_; scoped_ptr normal_; scoped_ptr merge_; scoped_ptr accelerate_; + scoped_ptr accelerate_factory_; scoped_ptr preemptive_expand_; + scoped_ptr preemptive_expand_factory_; RandomVector random_vector_; scoped_ptr comfort_noise_; Rtcp rtcp_; diff --git a/webrtc/modules/audio_coding/neteq4/neteq_impl_unittest.cc b/webrtc/modules/audio_coding/neteq4/neteq_impl_unittest.cc index 7a8205391..0fbcedbed 100644 --- a/webrtc/modules/audio_coding/neteq4/neteq_impl_unittest.cc +++ b/webrtc/modules/audio_coding/neteq4/neteq_impl_unittest.cc @@ -13,6 +13,8 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "webrtc/modules/audio_coding/neteq4/accelerate.h" +#include "webrtc/modules/audio_coding/neteq4/expand.h" #include "webrtc/modules/audio_coding/neteq4/mock/mock_audio_decoder.h" #include "webrtc/modules/audio_coding/neteq4/mock/mock_buffer_level_filter.h" #include "webrtc/modules/audio_coding/neteq4/mock/mock_decoder_database.h" @@ -22,6 +24,7 @@ #include "webrtc/modules/audio_coding/neteq4/mock/mock_dtmf_tone_generator.h" #include "webrtc/modules/audio_coding/neteq4/mock/mock_packet_buffer.h" #include "webrtc/modules/audio_coding/neteq4/mock/mock_payload_splitter.h" +#include "webrtc/modules/audio_coding/neteq4/preemptive_expand.h" #include "webrtc/modules/audio_coding/neteq4/timestamp_scaler.h" using ::testing::Return; @@ -60,6 +63,11 @@ class NetEqImplTest : public ::testing::Test { timestamp_scaler_ = new TimestampScaler(*decoder_database_); EXPECT_CALL(*decoder_database_, GetActiveCngDecoder()) .WillOnce(ReturnNull()); + AccelerateFactory* accelerate_factory = new AccelerateFactory; + ExpandFactory* expand_factory = new ExpandFactory; + PreemptiveExpandFactory* preemptive_expand_factory = + new PreemptiveExpandFactory; + neteq_ = new NetEqImpl(kInitSampleRateHz, buffer_level_filter_, decoder_database_, @@ -69,7 +77,10 @@ class NetEqImplTest : public ::testing::Test { dtmf_tone_generator_, packet_buffer_, payload_splitter_, - timestamp_scaler_); + timestamp_scaler_, + accelerate_factory, + expand_factory, + preemptive_expand_factory); } virtual ~NetEqImplTest() { diff --git a/webrtc/modules/audio_coding/neteq4/preemptive_expand.cc b/webrtc/modules/audio_coding/neteq4/preemptive_expand.cc index ac787eb1d..c7ce31040 100644 --- a/webrtc/modules/audio_coding/neteq4/preemptive_expand.cc +++ b/webrtc/modules/audio_coding/neteq4/preemptive_expand.cc @@ -98,4 +98,11 @@ PreemptiveExpand::ReturnCodes PreemptiveExpand::CheckCriteriaAndStretch( } } +PreemptiveExpand* PreemptiveExpandFactory::Create( + int sample_rate_hz, + size_t num_channels, + const BackgroundNoise& background_noise) const { + return new PreemptiveExpand(sample_rate_hz, num_channels, background_noise); +} + } // namespace webrtc diff --git a/webrtc/modules/audio_coding/neteq4/preemptive_expand.h b/webrtc/modules/audio_coding/neteq4/preemptive_expand.h index 4cd92cc0b..241425e81 100644 --- a/webrtc/modules/audio_coding/neteq4/preemptive_expand.h +++ b/webrtc/modules/audio_coding/neteq4/preemptive_expand.h @@ -70,5 +70,15 @@ class PreemptiveExpand : public TimeStretch { DISALLOW_COPY_AND_ASSIGN(PreemptiveExpand); }; +struct PreemptiveExpandFactory { + PreemptiveExpandFactory() {} + virtual ~PreemptiveExpandFactory() {} + + virtual PreemptiveExpand* Create( + int sample_rate_hz, + size_t num_channels, + const BackgroundNoise& background_noise) const; +}; + } // namespace webrtc #endif // WEBRTC_MODULES_AUDIO_CODING_NETEQ4_PREEMPTIVE_EXPAND_H_ diff --git a/webrtc/modules/audio_coding/neteq4/time_stretch_unittest.cc b/webrtc/modules/audio_coding/neteq4/time_stretch_unittest.cc index cf8131f3a..188c18b71 100644 --- a/webrtc/modules/audio_coding/neteq4/time_stretch_unittest.cc +++ b/webrtc/modules/audio_coding/neteq4/time_stretch_unittest.cc @@ -19,11 +19,29 @@ namespace webrtc { TEST(TimeStretch, CreateAndDestroy) { - int sample_rate = 8000; - size_t num_channels = 1; - BackgroundNoise bgn(num_channels); - Accelerate accelerate(sample_rate, num_channels, bgn); - PreemptiveExpand preemptive_expand(sample_rate, num_channels, bgn); + const int kSampleRate = 8000; + const size_t kNumChannels = 1; + BackgroundNoise bgn(kNumChannels); + Accelerate accelerate(kSampleRate, kNumChannels, bgn); + PreemptiveExpand preemptive_expand(kSampleRate, kNumChannels, bgn); +} + +TEST(TimeStretch, CreateUsingFactory) { + const int kSampleRate = 8000; + const size_t kNumChannels = 1; + BackgroundNoise bgn(kNumChannels); + + AccelerateFactory accelerate_factory; + Accelerate* accelerate = + accelerate_factory.Create(kSampleRate, kNumChannels, bgn); + EXPECT_TRUE(accelerate != NULL); + delete accelerate; + + PreemptiveExpandFactory preemptive_expand_factory; + PreemptiveExpand* preemptive_expand = + preemptive_expand_factory.Create(kSampleRate, kNumChannels, bgn); + EXPECT_TRUE(preemptive_expand != NULL); + delete preemptive_expand; } // TODO(hlundin): Write more tests.