Adding a config struct to NetEq
With this change, the parameters sent to the NetEq::Create method are collected in one NetEq::Config struct. The benefit is that it is easier to set, change and override default values, and easier to expand with more parameters in the future. BUG=3083 R=turaj@webrtc.org Review URL: https://webrtc-codereview.appspot.com/11949004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@5902 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
@@ -35,7 +35,6 @@ namespace acm2 {
|
||||
|
||||
namespace {
|
||||
|
||||
const int kNeteqInitSampleRateHz = 16000;
|
||||
const int kNackThresholdPackets = 2;
|
||||
|
||||
// |vad_activity_| field of |audio_frame| is set to |previous_audio_activity_|
|
||||
@@ -119,13 +118,14 @@ bool IsCng(int codec_id) {
|
||||
|
||||
AcmReceiver::AcmReceiver()
|
||||
: id_(0),
|
||||
neteq_(NetEq::Create(kNeteqInitSampleRateHz)),
|
||||
neteq_config_(),
|
||||
neteq_(NetEq::Create(neteq_config_)),
|
||||
last_audio_decoder_(-1), // Invalid value.
|
||||
decode_lock_(RWLockWrapper::CreateRWLock()),
|
||||
neteq_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
|
||||
vad_enabled_(true),
|
||||
previous_audio_activity_(AudioFrame::kVadPassive),
|
||||
current_sample_rate_hz_(kNeteqInitSampleRateHz),
|
||||
current_sample_rate_hz_(neteq_config_.sample_rate_hz),
|
||||
nack_(),
|
||||
nack_enabled_(false),
|
||||
av_sync_(false),
|
||||
@@ -774,7 +774,7 @@ bool AcmReceiver::GetSilence(int desired_sample_rate_hz, AudioFrame* frame) {
|
||||
current_sample_rate_hz_ = ACMCodecDB::database_[last_audio_decoder_].plfreq;
|
||||
frame->num_channels_ = decoders_[last_audio_decoder_].channels;
|
||||
} else {
|
||||
current_sample_rate_hz_ = kNeteqInitSampleRateHz;
|
||||
current_sample_rate_hz_ = neteq_config_.sample_rate_hz;
|
||||
frame->num_channels_ = 1;
|
||||
}
|
||||
|
||||
|
@@ -340,6 +340,7 @@ class AcmReceiver {
|
||||
void InsertStreamOfSyncPackets(InitialDelayManager::SyncStream* sync_stream);
|
||||
|
||||
int id_;
|
||||
NetEq::Config neteq_config_;
|
||||
NetEq* neteq_;
|
||||
Decoder decoders_[ACMCodecDB::kMaxNumCodecs];
|
||||
int last_audio_decoder_;
|
||||
|
@@ -67,6 +67,15 @@ enum NetEqBackgroundNoiseMode {
|
||||
// This is the interface class for NetEq.
|
||||
class NetEq {
|
||||
public:
|
||||
struct Config {
|
||||
Config()
|
||||
: sample_rate_hz(16000),
|
||||
enable_audio_classifier(false) {}
|
||||
|
||||
int sample_rate_hz; // Initial vale. Will change with input data.
|
||||
bool enable_audio_classifier;
|
||||
};
|
||||
|
||||
enum ReturnCodes {
|
||||
kOK = 0,
|
||||
kFail = -1,
|
||||
@@ -105,11 +114,10 @@ class NetEq {
|
||||
static const int kMaxNumPacketsInBuffer = 50; // TODO(hlundin): Remove.
|
||||
static const int kMaxBytesInBuffer = 113280; // TODO(hlundin): Remove.
|
||||
|
||||
// Creates a new NetEq object, starting at the sample rate |sample_rate_hz|.
|
||||
// (Note that it will still change the sample rate depending on what payloads
|
||||
// are being inserted; |sample_rate_hz| is just for startup configuration.)
|
||||
static NetEq* Create(int sample_rate_hz,
|
||||
bool enable_audio_classifier = false);
|
||||
// Creates a new NetEq object, with parameters set in |config|. The |config|
|
||||
// object will only have to be valid for the duration of the call to this
|
||||
// method.
|
||||
static NetEq* Create(const NetEq::Config& config);
|
||||
|
||||
virtual ~NetEq() {}
|
||||
|
||||
|
@@ -28,13 +28,13 @@ namespace webrtc {
|
||||
|
||||
// Creates all classes needed and inject them into a new NetEqImpl object.
|
||||
// Return the new object.
|
||||
NetEq* NetEq::Create(int sample_rate_hz, bool enable_audio_classifier) {
|
||||
NetEq* NetEq::Create(const NetEq::Config& config) {
|
||||
BufferLevelFilter* buffer_level_filter = new BufferLevelFilter;
|
||||
DecoderDatabase* decoder_database = new DecoderDatabase;
|
||||
DelayPeakDetector* delay_peak_detector = new DelayPeakDetector;
|
||||
DelayManager* delay_manager = new DelayManager(kMaxNumPacketsInBuffer,
|
||||
delay_peak_detector);
|
||||
DtmfBuffer* dtmf_buffer = new DtmfBuffer(sample_rate_hz);
|
||||
DtmfBuffer* dtmf_buffer = new DtmfBuffer(config.sample_rate_hz);
|
||||
DtmfToneGenerator* dtmf_tone_generator = new DtmfToneGenerator;
|
||||
PacketBuffer* packet_buffer = new PacketBuffer(kMaxNumPacketsInBuffer,
|
||||
kMaxBytesInBuffer);
|
||||
@@ -44,7 +44,7 @@ NetEq* NetEq::Create(int sample_rate_hz, bool enable_audio_classifier) {
|
||||
ExpandFactory* expand_factory = new ExpandFactory;
|
||||
PreemptiveExpandFactory* preemptive_expand_factory =
|
||||
new PreemptiveExpandFactory;
|
||||
return new NetEqImpl(sample_rate_hz,
|
||||
return new NetEqImpl(config.sample_rate_hz,
|
||||
buffer_level_filter,
|
||||
decoder_database,
|
||||
delay_manager,
|
||||
|
@@ -45,13 +45,15 @@ class NetEqExternalDecoderTest : public ::testing::Test {
|
||||
frame_size_ms_(10),
|
||||
frame_size_samples_(frame_size_ms_ * samples_per_ms_),
|
||||
output_size_samples_(frame_size_ms_ * samples_per_ms_),
|
||||
neteq_external_(NetEq::Create(sample_rate_hz_)),
|
||||
neteq_(NetEq::Create(sample_rate_hz_)),
|
||||
external_decoder_(new MockExternalPcm16B(kDecoderPCM16Bswb32kHz)),
|
||||
rtp_generator_(samples_per_ms_),
|
||||
payload_size_bytes_(0),
|
||||
last_send_time_(0),
|
||||
last_arrival_time_(0) {
|
||||
NetEq::Config config;
|
||||
config.sample_rate_hz = sample_rate_hz_;
|
||||
neteq_external_ = NetEq::Create(config);
|
||||
neteq_ = NetEq::Create(config);
|
||||
input_ = new int16_t[frame_size_samples_];
|
||||
encoded_ = new uint8_t[2 * frame_size_samples_];
|
||||
}
|
||||
|
@@ -48,9 +48,9 @@ int DeletePacketsAndReturnOk(PacketList* packet_list) {
|
||||
|
||||
class NetEqImplTest : public ::testing::Test {
|
||||
protected:
|
||||
static const int kInitSampleRateHz = 8000;
|
||||
NetEqImplTest()
|
||||
: neteq_(NULL),
|
||||
config_(),
|
||||
mock_buffer_level_filter_(NULL),
|
||||
buffer_level_filter_(NULL),
|
||||
use_mock_buffer_level_filter_(true),
|
||||
@@ -75,7 +75,9 @@ class NetEqImplTest : public ::testing::Test {
|
||||
mock_payload_splitter_(NULL),
|
||||
payload_splitter_(NULL),
|
||||
use_mock_payload_splitter_(true),
|
||||
timestamp_scaler_(NULL) {}
|
||||
timestamp_scaler_(NULL) {
|
||||
config_.sample_rate_hz = 8000;
|
||||
}
|
||||
|
||||
void CreateInstance() {
|
||||
if (use_mock_buffer_level_filter_) {
|
||||
@@ -109,10 +111,10 @@ class NetEqImplTest : public ::testing::Test {
|
||||
new DelayManager(NetEq::kMaxNumPacketsInBuffer, delay_peak_detector_);
|
||||
}
|
||||
if (use_mock_dtmf_buffer_) {
|
||||
mock_dtmf_buffer_ = new MockDtmfBuffer(kInitSampleRateHz);
|
||||
mock_dtmf_buffer_ = new MockDtmfBuffer(config_.sample_rate_hz);
|
||||
dtmf_buffer_ = mock_dtmf_buffer_;
|
||||
} else {
|
||||
dtmf_buffer_ = new DtmfBuffer(kInitSampleRateHz);
|
||||
dtmf_buffer_ = new DtmfBuffer(config_.sample_rate_hz);
|
||||
}
|
||||
if (use_mock_dtmf_tone_generator_) {
|
||||
mock_dtmf_tone_generator_ = new MockDtmfToneGenerator;
|
||||
@@ -140,7 +142,7 @@ class NetEqImplTest : public ::testing::Test {
|
||||
PreemptiveExpandFactory* preemptive_expand_factory =
|
||||
new PreemptiveExpandFactory;
|
||||
|
||||
neteq_ = new NetEqImpl(kInitSampleRateHz,
|
||||
neteq_ = new NetEqImpl(config_.sample_rate_hz,
|
||||
buffer_level_filter_,
|
||||
decoder_database_,
|
||||
delay_manager_,
|
||||
@@ -194,6 +196,7 @@ class NetEqImplTest : public ::testing::Test {
|
||||
}
|
||||
|
||||
NetEqImpl* neteq_;
|
||||
NetEq::Config config_;
|
||||
MockBufferLevelFilter* mock_buffer_level_filter_;
|
||||
BufferLevelFilter* buffer_level_filter_;
|
||||
bool use_mock_buffer_level_filter_;
|
||||
@@ -225,7 +228,8 @@ class NetEqImplTest : public ::testing::Test {
|
||||
// This tests the interface class NetEq.
|
||||
// TODO(hlundin): Move to separate file?
|
||||
TEST(NetEq, CreateAndDestroy) {
|
||||
NetEq* neteq = NetEq::Create(8000);
|
||||
NetEq::Config config;
|
||||
NetEq* neteq = NetEq::Create(config);
|
||||
delete neteq;
|
||||
}
|
||||
|
||||
|
@@ -54,14 +54,16 @@ class NetEqStereoTest : public ::testing::TestWithParam<TestParameters> {
|
||||
frame_size_ms_(GetParam().frame_size),
|
||||
frame_size_samples_(frame_size_ms_ * samples_per_ms_),
|
||||
output_size_samples_(10 * samples_per_ms_),
|
||||
neteq_mono_(NetEq::Create(sample_rate_hz_)),
|
||||
neteq_(NetEq::Create(sample_rate_hz_)),
|
||||
rtp_generator_mono_(samples_per_ms_),
|
||||
rtp_generator_(samples_per_ms_),
|
||||
payload_size_bytes_(0),
|
||||
multi_payload_size_bytes_(0),
|
||||
last_send_time_(0),
|
||||
last_arrival_time_(0) {
|
||||
NetEq::Config config;
|
||||
config.sample_rate_hz = sample_rate_hz_;
|
||||
neteq_mono_ = NetEq::Create(config);
|
||||
neteq_ = NetEq::Create(config);
|
||||
input_ = new int16_t[frame_size_samples_];
|
||||
encoded_ = new uint8_t[2 * frame_size_samples_];
|
||||
input_multi_channel_ = new int16_t[frame_size_samples_ * num_channels_];
|
||||
|
@@ -254,7 +254,9 @@ NetEqDecodingTest::NetEqDecodingTest()
|
||||
}
|
||||
|
||||
void NetEqDecodingTest::SetUp() {
|
||||
neteq_ = NetEq::Create(kInitSampleRateHz);
|
||||
NetEq::Config config;
|
||||
config.sample_rate_hz = kInitSampleRateHz;
|
||||
neteq_ = NetEq::Create(config);
|
||||
NetEqNetworkStatistics stat;
|
||||
ASSERT_EQ(0, neteq_->NetworkStatistics(&stat));
|
||||
algorithmic_delay_ms_ = stat.current_buffer_size_ms;
|
||||
|
@@ -36,7 +36,9 @@ int64_t NetEqPerformanceTest::Run(int runtime_ms,
|
||||
const int kPayloadType = 95;
|
||||
|
||||
// Initialize NetEq instance.
|
||||
NetEq* neteq = NetEq::Create(kSampRateHz);
|
||||
NetEq::Config config;
|
||||
config.sample_rate_hz = kSampRateHz;
|
||||
NetEq* neteq = NetEq::Create(config);
|
||||
// Register decoder in |neteq|.
|
||||
if (neteq->RegisterPayloadType(kDecoderType, kPayloadType) != 0)
|
||||
return -1;
|
||||
|
@@ -42,8 +42,10 @@ NetEqQualityTest::NetEqQualityTest(int block_duration_ms,
|
||||
in_file_(new InputAudioFile(in_filename_)),
|
||||
out_file_(NULL),
|
||||
rtp_generator_(new RtpGenerator(in_sampling_khz_, 0, 0,
|
||||
decodable_time_ms_)),
|
||||
neteq_(NetEq::Create(out_sampling_khz_ * 1000)) {
|
||||
decodable_time_ms_)) {
|
||||
NetEq::Config config;
|
||||
config.sample_rate_hz = out_sampling_khz_ * 1000;
|
||||
neteq_.reset(NetEq::Create(config));
|
||||
max_payload_bytes_ = in_size_samples_ * channels_ * sizeof(int16_t);
|
||||
in_data_.reset(new int16_t[in_size_samples_ * channels_]);
|
||||
payload_.reset(new uint8_t[max_payload_bytes_]);
|
||||
|
@@ -176,7 +176,9 @@ int main(int argc, char* argv[]) {
|
||||
|
||||
// Initialize NetEq instance.
|
||||
int sample_rate_hz = 16000;
|
||||
NetEq* neteq = NetEq::Create(sample_rate_hz);
|
||||
NetEq::Config config;
|
||||
config.sample_rate_hz = sample_rate_hz;
|
||||
NetEq* neteq = NetEq::Create(config);
|
||||
RegisterPayloadTypes(neteq);
|
||||
|
||||
// Read first packet.
|
||||
|
Reference in New Issue
Block a user