Fix iSAC/48000 issue with ACM2.

Registeration of iSAC into NetEq is through injecting and external AudioDecoder. This is because iSAC encoder and decoder need to share instances for bandwidth estimator to work. When external decoder is registerred, the sampling rate of the decoder had to be specified. iSAC/48000 decoder has a native sampling rate of 32000 Hz, but it has been registered as 48000 Hz decoder.

This CL fixing this issue by letting NetEq to obtain sampling rate of an external coder according to its existing database.

BUG=3143
TEST=voe_cmd_test,modules_unittest,try-bots
R=henrik.lundin@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/12139004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5936 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
turaj@webrtc.org 2014-04-17 23:30:49 +00:00
parent 29540b1879
commit a596a389ea
6 changed files with 7 additions and 11 deletions

View File

@ -505,8 +505,7 @@ int32_t AcmReceiver::AddCodec(int acm_codec_id,
ret_val = neteq_->RegisterPayloadType(neteq_decoder, payload_type);
} else {
ret_val = neteq_->RegisterExternalDecoder(
audio_decoder, neteq_decoder,
ACMCodecDB::database_[acm_codec_id].plfreq, payload_type);
audio_decoder, neteq_decoder, payload_type);
}
if (ret_val != NetEq::kOK) {
LOG_FERR3(LS_ERROR, "AcmReceiver::AddCodec", acm_codec_id, payload_type,

View File

@ -161,11 +161,10 @@ class NetEq {
// Provides an externally created decoder object |decoder| to insert in the
// decoder database. The decoder implements a decoder of type |codec| and
// associates it with |rtp_payload_type|. The decoder operates at the
// frequency |sample_rate_hz|. Returns kOK on success, kFail on failure.
// associates it with |rtp_payload_type|. Returns kOK on success,
// kFail on failure.
virtual int RegisterExternalDecoder(AudioDecoder* decoder,
enum NetEqDecoder codec,
int sample_rate_hz,
uint8_t rtp_payload_type) = 0;
// Removes |rtp_payload_type| from the codec database. Returns 0 on success,

View File

@ -80,7 +80,6 @@ class NetEqExternalDecoderTest : public ::testing::Test {
ASSERT_EQ(NetEq::kOK,
neteq_external_->RegisterExternalDecoder(external_decoder_,
decoder,
sample_rate_hz_,
kPayloadType));
ASSERT_EQ(NetEq::kOK,
neteq_->RegisterPayloadType(decoder, kPayloadType));

View File

@ -201,7 +201,6 @@ int NetEqImpl::RegisterPayloadType(enum NetEqDecoder codec,
int NetEqImpl::RegisterExternalDecoder(AudioDecoder* decoder,
enum NetEqDecoder codec,
int sample_rate_hz,
uint8_t rtp_payload_type) {
CriticalSectionScoped lock(crit_sect_.get());
LOG_API2(static_cast<int>(rtp_payload_type), codec);
@ -210,6 +209,7 @@ int NetEqImpl::RegisterExternalDecoder(AudioDecoder* decoder,
assert(false);
return kFail;
}
const int sample_rate_hz = AudioDecoder::CodecSampleRateHz(codec);
int ret = decoder_database_->InsertExternal(rtp_payload_type, codec,
sample_rate_hz, decoder);
if (ret != DecoderDatabase::kOK) {

View File

@ -115,11 +115,10 @@ class NetEqImpl : public webrtc::NetEq {
// Provides an externally created decoder object |decoder| to insert in the
// decoder database. The decoder implements a decoder of type |codec| and
// associates it with |rtp_payload_type|. The decoder operates at the
// frequency |sample_rate_hz|. Returns kOK on success, kFail on failure.
// associates it with |rtp_payload_type|. Returns kOK on success, kFail on
// failure.
virtual int RegisterExternalDecoder(AudioDecoder* decoder,
enum NetEqDecoder codec,
int sample_rate_hz,
uint8_t rtp_payload_type);
// Removes |rtp_payload_type| from the codec database. Returns 0 on success,

View File

@ -452,7 +452,7 @@ TEST_F(NetEqImplTest, VerifyTimestampPropagation) {
EXPECT_EQ(NetEq::kOK,
neteq_->RegisterExternalDecoder(
&decoder_, kDecoderPCM16B, 8000, kPayloadType));
&decoder_, kDecoderPCM16B, kPayloadType));
// Insert one packet.
EXPECT_EQ(NetEq::kOK,