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 {
|
namespace {
|
||||||
|
|
||||||
const int kNeteqInitSampleRateHz = 16000;
|
|
||||||
const int kNackThresholdPackets = 2;
|
const int kNackThresholdPackets = 2;
|
||||||
|
|
||||||
// |vad_activity_| field of |audio_frame| is set to |previous_audio_activity_|
|
// |vad_activity_| field of |audio_frame| is set to |previous_audio_activity_|
|
||||||
@@ -119,13 +118,14 @@ bool IsCng(int codec_id) {
|
|||||||
|
|
||||||
AcmReceiver::AcmReceiver()
|
AcmReceiver::AcmReceiver()
|
||||||
: id_(0),
|
: id_(0),
|
||||||
neteq_(NetEq::Create(kNeteqInitSampleRateHz)),
|
neteq_config_(),
|
||||||
|
neteq_(NetEq::Create(neteq_config_)),
|
||||||
last_audio_decoder_(-1), // Invalid value.
|
last_audio_decoder_(-1), // Invalid value.
|
||||||
decode_lock_(RWLockWrapper::CreateRWLock()),
|
decode_lock_(RWLockWrapper::CreateRWLock()),
|
||||||
neteq_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
|
neteq_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
|
||||||
vad_enabled_(true),
|
vad_enabled_(true),
|
||||||
previous_audio_activity_(AudioFrame::kVadPassive),
|
previous_audio_activity_(AudioFrame::kVadPassive),
|
||||||
current_sample_rate_hz_(kNeteqInitSampleRateHz),
|
current_sample_rate_hz_(neteq_config_.sample_rate_hz),
|
||||||
nack_(),
|
nack_(),
|
||||||
nack_enabled_(false),
|
nack_enabled_(false),
|
||||||
av_sync_(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;
|
current_sample_rate_hz_ = ACMCodecDB::database_[last_audio_decoder_].plfreq;
|
||||||
frame->num_channels_ = decoders_[last_audio_decoder_].channels;
|
frame->num_channels_ = decoders_[last_audio_decoder_].channels;
|
||||||
} else {
|
} else {
|
||||||
current_sample_rate_hz_ = kNeteqInitSampleRateHz;
|
current_sample_rate_hz_ = neteq_config_.sample_rate_hz;
|
||||||
frame->num_channels_ = 1;
|
frame->num_channels_ = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -340,6 +340,7 @@ class AcmReceiver {
|
|||||||
void InsertStreamOfSyncPackets(InitialDelayManager::SyncStream* sync_stream);
|
void InsertStreamOfSyncPackets(InitialDelayManager::SyncStream* sync_stream);
|
||||||
|
|
||||||
int id_;
|
int id_;
|
||||||
|
NetEq::Config neteq_config_;
|
||||||
NetEq* neteq_;
|
NetEq* neteq_;
|
||||||
Decoder decoders_[ACMCodecDB::kMaxNumCodecs];
|
Decoder decoders_[ACMCodecDB::kMaxNumCodecs];
|
||||||
int last_audio_decoder_;
|
int last_audio_decoder_;
|
||||||
|
@@ -67,6 +67,15 @@ enum NetEqBackgroundNoiseMode {
|
|||||||
// This is the interface class for NetEq.
|
// This is the interface class for NetEq.
|
||||||
class NetEq {
|
class NetEq {
|
||||||
public:
|
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 {
|
enum ReturnCodes {
|
||||||
kOK = 0,
|
kOK = 0,
|
||||||
kFail = -1,
|
kFail = -1,
|
||||||
@@ -105,11 +114,10 @@ class NetEq {
|
|||||||
static const int kMaxNumPacketsInBuffer = 50; // TODO(hlundin): Remove.
|
static const int kMaxNumPacketsInBuffer = 50; // TODO(hlundin): Remove.
|
||||||
static const int kMaxBytesInBuffer = 113280; // TODO(hlundin): Remove.
|
static const int kMaxBytesInBuffer = 113280; // TODO(hlundin): Remove.
|
||||||
|
|
||||||
// Creates a new NetEq object, starting at the sample rate |sample_rate_hz|.
|
// Creates a new NetEq object, with parameters set in |config|. The |config|
|
||||||
// (Note that it will still change the sample rate depending on what payloads
|
// object will only have to be valid for the duration of the call to this
|
||||||
// are being inserted; |sample_rate_hz| is just for startup configuration.)
|
// method.
|
||||||
static NetEq* Create(int sample_rate_hz,
|
static NetEq* Create(const NetEq::Config& config);
|
||||||
bool enable_audio_classifier = false);
|
|
||||||
|
|
||||||
virtual ~NetEq() {}
|
virtual ~NetEq() {}
|
||||||
|
|
||||||
|
@@ -28,13 +28,13 @@ namespace webrtc {
|
|||||||
|
|
||||||
// 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(int sample_rate_hz, bool enable_audio_classifier) {
|
NetEq* NetEq::Create(const NetEq::Config& config) {
|
||||||
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;
|
||||||
DelayManager* delay_manager = new DelayManager(kMaxNumPacketsInBuffer,
|
DelayManager* delay_manager = new DelayManager(kMaxNumPacketsInBuffer,
|
||||||
delay_peak_detector);
|
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;
|
DtmfToneGenerator* dtmf_tone_generator = new DtmfToneGenerator;
|
||||||
PacketBuffer* packet_buffer = new PacketBuffer(kMaxNumPacketsInBuffer,
|
PacketBuffer* packet_buffer = new PacketBuffer(kMaxNumPacketsInBuffer,
|
||||||
kMaxBytesInBuffer);
|
kMaxBytesInBuffer);
|
||||||
@@ -44,7 +44,7 @@ NetEq* NetEq::Create(int sample_rate_hz, bool enable_audio_classifier) {
|
|||||||
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(sample_rate_hz,
|
return new NetEqImpl(config.sample_rate_hz,
|
||||||
buffer_level_filter,
|
buffer_level_filter,
|
||||||
decoder_database,
|
decoder_database,
|
||||||
delay_manager,
|
delay_manager,
|
||||||
|
@@ -45,13 +45,15 @@ class NetEqExternalDecoderTest : public ::testing::Test {
|
|||||||
frame_size_ms_(10),
|
frame_size_ms_(10),
|
||||||
frame_size_samples_(frame_size_ms_ * samples_per_ms_),
|
frame_size_samples_(frame_size_ms_ * samples_per_ms_),
|
||||||
output_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)),
|
external_decoder_(new MockExternalPcm16B(kDecoderPCM16Bswb32kHz)),
|
||||||
rtp_generator_(samples_per_ms_),
|
rtp_generator_(samples_per_ms_),
|
||||||
payload_size_bytes_(0),
|
payload_size_bytes_(0),
|
||||||
last_send_time_(0),
|
last_send_time_(0),
|
||||||
last_arrival_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_];
|
input_ = new int16_t[frame_size_samples_];
|
||||||
encoded_ = new uint8_t[2 * 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 {
|
class NetEqImplTest : public ::testing::Test {
|
||||||
protected:
|
protected:
|
||||||
static const int kInitSampleRateHz = 8000;
|
|
||||||
NetEqImplTest()
|
NetEqImplTest()
|
||||||
: neteq_(NULL),
|
: neteq_(NULL),
|
||||||
|
config_(),
|
||||||
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),
|
||||||
@@ -75,7 +75,9 @@ class NetEqImplTest : public ::testing::Test {
|
|||||||
mock_payload_splitter_(NULL),
|
mock_payload_splitter_(NULL),
|
||||||
payload_splitter_(NULL),
|
payload_splitter_(NULL),
|
||||||
use_mock_payload_splitter_(true),
|
use_mock_payload_splitter_(true),
|
||||||
timestamp_scaler_(NULL) {}
|
timestamp_scaler_(NULL) {
|
||||||
|
config_.sample_rate_hz = 8000;
|
||||||
|
}
|
||||||
|
|
||||||
void CreateInstance() {
|
void CreateInstance() {
|
||||||
if (use_mock_buffer_level_filter_) {
|
if (use_mock_buffer_level_filter_) {
|
||||||
@@ -109,10 +111,10 @@ class NetEqImplTest : public ::testing::Test {
|
|||||||
new DelayManager(NetEq::kMaxNumPacketsInBuffer, delay_peak_detector_);
|
new DelayManager(NetEq::kMaxNumPacketsInBuffer, delay_peak_detector_);
|
||||||
}
|
}
|
||||||
if (use_mock_dtmf_buffer_) {
|
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_;
|
dtmf_buffer_ = mock_dtmf_buffer_;
|
||||||
} else {
|
} else {
|
||||||
dtmf_buffer_ = new DtmfBuffer(kInitSampleRateHz);
|
dtmf_buffer_ = new DtmfBuffer(config_.sample_rate_hz);
|
||||||
}
|
}
|
||||||
if (use_mock_dtmf_tone_generator_) {
|
if (use_mock_dtmf_tone_generator_) {
|
||||||
mock_dtmf_tone_generator_ = new MockDtmfToneGenerator;
|
mock_dtmf_tone_generator_ = new MockDtmfToneGenerator;
|
||||||
@@ -140,7 +142,7 @@ class NetEqImplTest : public ::testing::Test {
|
|||||||
PreemptiveExpandFactory* preemptive_expand_factory =
|
PreemptiveExpandFactory* preemptive_expand_factory =
|
||||||
new PreemptiveExpandFactory;
|
new PreemptiveExpandFactory;
|
||||||
|
|
||||||
neteq_ = new NetEqImpl(kInitSampleRateHz,
|
neteq_ = new NetEqImpl(config_.sample_rate_hz,
|
||||||
buffer_level_filter_,
|
buffer_level_filter_,
|
||||||
decoder_database_,
|
decoder_database_,
|
||||||
delay_manager_,
|
delay_manager_,
|
||||||
@@ -194,6 +196,7 @@ class NetEqImplTest : public ::testing::Test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
NetEqImpl* neteq_;
|
NetEqImpl* neteq_;
|
||||||
|
NetEq::Config config_;
|
||||||
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_;
|
||||||
@@ -225,7 +228,8 @@ class NetEqImplTest : public ::testing::Test {
|
|||||||
// This tests the interface class NetEq.
|
// This tests the interface class NetEq.
|
||||||
// TODO(hlundin): Move to separate file?
|
// TODO(hlundin): Move to separate file?
|
||||||
TEST(NetEq, CreateAndDestroy) {
|
TEST(NetEq, CreateAndDestroy) {
|
||||||
NetEq* neteq = NetEq::Create(8000);
|
NetEq::Config config;
|
||||||
|
NetEq* neteq = NetEq::Create(config);
|
||||||
delete neteq;
|
delete neteq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -54,14 +54,16 @@ class NetEqStereoTest : public ::testing::TestWithParam<TestParameters> {
|
|||||||
frame_size_ms_(GetParam().frame_size),
|
frame_size_ms_(GetParam().frame_size),
|
||||||
frame_size_samples_(frame_size_ms_ * samples_per_ms_),
|
frame_size_samples_(frame_size_ms_ * samples_per_ms_),
|
||||||
output_size_samples_(10 * 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_mono_(samples_per_ms_),
|
||||||
rtp_generator_(samples_per_ms_),
|
rtp_generator_(samples_per_ms_),
|
||||||
payload_size_bytes_(0),
|
payload_size_bytes_(0),
|
||||||
multi_payload_size_bytes_(0),
|
multi_payload_size_bytes_(0),
|
||||||
last_send_time_(0),
|
last_send_time_(0),
|
||||||
last_arrival_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_];
|
input_ = new int16_t[frame_size_samples_];
|
||||||
encoded_ = new uint8_t[2 * frame_size_samples_];
|
encoded_ = new uint8_t[2 * frame_size_samples_];
|
||||||
input_multi_channel_ = new int16_t[frame_size_samples_ * num_channels_];
|
input_multi_channel_ = new int16_t[frame_size_samples_ * num_channels_];
|
||||||
|
@@ -254,7 +254,9 @@ NetEqDecodingTest::NetEqDecodingTest()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NetEqDecodingTest::SetUp() {
|
void NetEqDecodingTest::SetUp() {
|
||||||
neteq_ = NetEq::Create(kInitSampleRateHz);
|
NetEq::Config config;
|
||||||
|
config.sample_rate_hz = kInitSampleRateHz;
|
||||||
|
neteq_ = NetEq::Create(config);
|
||||||
NetEqNetworkStatistics stat;
|
NetEqNetworkStatistics stat;
|
||||||
ASSERT_EQ(0, neteq_->NetworkStatistics(&stat));
|
ASSERT_EQ(0, neteq_->NetworkStatistics(&stat));
|
||||||
algorithmic_delay_ms_ = stat.current_buffer_size_ms;
|
algorithmic_delay_ms_ = stat.current_buffer_size_ms;
|
||||||
|
@@ -36,7 +36,9 @@ int64_t NetEqPerformanceTest::Run(int runtime_ms,
|
|||||||
const int kPayloadType = 95;
|
const int kPayloadType = 95;
|
||||||
|
|
||||||
// Initialize NetEq instance.
|
// 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|.
|
// Register decoder in |neteq|.
|
||||||
if (neteq->RegisterPayloadType(kDecoderType, kPayloadType) != 0)
|
if (neteq->RegisterPayloadType(kDecoderType, kPayloadType) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@@ -42,8 +42,10 @@ NetEqQualityTest::NetEqQualityTest(int block_duration_ms,
|
|||||||
in_file_(new InputAudioFile(in_filename_)),
|
in_file_(new InputAudioFile(in_filename_)),
|
||||||
out_file_(NULL),
|
out_file_(NULL),
|
||||||
rtp_generator_(new RtpGenerator(in_sampling_khz_, 0, 0,
|
rtp_generator_(new RtpGenerator(in_sampling_khz_, 0, 0,
|
||||||
decodable_time_ms_)),
|
decodable_time_ms_)) {
|
||||||
neteq_(NetEq::Create(out_sampling_khz_ * 1000)) {
|
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);
|
max_payload_bytes_ = in_size_samples_ * channels_ * sizeof(int16_t);
|
||||||
in_data_.reset(new int16_t[in_size_samples_ * channels_]);
|
in_data_.reset(new int16_t[in_size_samples_ * channels_]);
|
||||||
payload_.reset(new uint8_t[max_payload_bytes_]);
|
payload_.reset(new uint8_t[max_payload_bytes_]);
|
||||||
|
@@ -176,7 +176,9 @@ int main(int argc, char* argv[]) {
|
|||||||
|
|
||||||
// Initialize NetEq instance.
|
// Initialize NetEq instance.
|
||||||
int sample_rate_hz = 16000;
|
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);
|
RegisterPayloadTypes(neteq);
|
||||||
|
|
||||||
// Read first packet.
|
// Read first packet.
|
||||||
|
Reference in New Issue
Block a user