From abe95ba323e27f7cb758c75a974dd9b4e2a7edd6 Mon Sep 17 00:00:00 2001 From: kwiberg Date: Thu, 2 Jun 2016 02:58:59 -0700 Subject: [PATCH] AudioDecoderIsacT: Require caller to always specify sample rate This gets rid of the complex & icky state where the sample rate is not yet determined. BUG=webrtc:5801 Review-Url: https://codereview.webrtc.org/2020353003 Cr-Commit-Position: refs/heads/master@{#13011} --- .../acm2/audio_coding_module_impl.cc | 2 +- .../modules/audio_coding/acm2/rent_a_codec.cc | 11 ++++-- .../modules/audio_coding/acm2/rent_a_codec.h | 2 +- .../codecs/isac/audio_decoder_isac_t.h | 8 +--- .../codecs/isac/audio_decoder_isac_t_impl.h | 38 +++---------------- webrtc/modules/utility/source/coder.cc | 5 ++- .../test/fuzzers/audio_decoder_isac_fuzzer.cc | 2 +- ...dio_decoder_isac_incoming_packet_fuzzer.cc | 2 +- .../fuzzers/audio_decoder_isacfix_fuzzer.cc | 2 +- webrtc/voice_engine/channel.cc | 4 +- 10 files changed, 24 insertions(+), 52 deletions(-) diff --git a/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.cc b/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.cc index bc7197d8e7..85458e8120 100644 --- a/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.cc +++ b/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.cc @@ -710,7 +710,7 @@ int AudioCodingModuleImpl::RegisterReceiveCodec(const CodecInst& codec) { rtc::CritScope lock(&acm_crit_sect_); auto* ef = encoder_factory_.get(); return RegisterReceiveCodecUnlocked( - codec, [ef] { return ef->rent_a_codec.RentIsacDecoder(); }); + codec, [&] { return ef->rent_a_codec.RentIsacDecoder(codec.plfreq); }); } int AudioCodingModuleImpl::RegisterReceiveCodec( diff --git a/webrtc/modules/audio_coding/acm2/rent_a_codec.cc b/webrtc/modules/audio_coding/acm2/rent_a_codec.cc index a61f15949d..e7aebcd14b 100644 --- a/webrtc/modules/audio_coding/acm2/rent_a_codec.cc +++ b/webrtc/modules/audio_coding/acm2/rent_a_codec.cc @@ -279,11 +279,14 @@ std::unique_ptr CreateCngEncoder( } std::unique_ptr CreateIsacDecoder( + int sample_rate_hz, const rtc::scoped_refptr& bwinfo) { #if defined(WEBRTC_CODEC_ISACFX) - return std::unique_ptr(new AudioDecoderIsacFix(bwinfo)); + return std::unique_ptr( + new AudioDecoderIsacFix(sample_rate_hz, bwinfo)); #elif defined(WEBRTC_CODEC_ISAC) - return std::unique_ptr(new AudioDecoderIsac(bwinfo)); + return std::unique_ptr( + new AudioDecoderIsac(sample_rate_hz, bwinfo)); #else FATAL() << "iSAC is not supported."; return std::unique_ptr(); @@ -357,8 +360,8 @@ std::unique_ptr RentACodec::RentEncoderStack( return encoder_stack; } -std::unique_ptr RentACodec::RentIsacDecoder() { - return CreateIsacDecoder(isac_bandwidth_info_); +std::unique_ptr RentACodec::RentIsacDecoder(int sample_rate_hz) { + return CreateIsacDecoder(sample_rate_hz, isac_bandwidth_info_); } } // namespace acm2 diff --git a/webrtc/modules/audio_coding/acm2/rent_a_codec.h b/webrtc/modules/audio_coding/acm2/rent_a_codec.h index bac37afa96..daa56a43a6 100644 --- a/webrtc/modules/audio_coding/acm2/rent_a_codec.h +++ b/webrtc/modules/audio_coding/acm2/rent_a_codec.h @@ -220,7 +220,7 @@ class RentACodec { std::unique_ptr RentEncoderStack(StackParameters* param); // Creates and returns an iSAC decoder. - std::unique_ptr RentIsacDecoder(); + std::unique_ptr RentIsacDecoder(int sample_rate_hz); private: std::unique_ptr speech_encoder_; diff --git a/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h b/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h index 264cca2bf3..b6b16ddb54 100644 --- a/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h +++ b/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h @@ -26,9 +26,6 @@ namespace webrtc { template class AudioDecoderIsacT final : public AudioDecoder { public: - AudioDecoderIsacT(); - explicit AudioDecoderIsacT( - const rtc::scoped_refptr& bwinfo); explicit AudioDecoderIsacT(int sample_rate_hz); AudioDecoderIsacT(int sample_rate_hz, const rtc::scoped_refptr& bwinfo); @@ -52,11 +49,8 @@ class AudioDecoderIsacT final : public AudioDecoder { SpeechType* speech_type) override; private: - AudioDecoderIsacT(rtc::Optional sample_rate_hz, - const rtc::scoped_refptr& bwinfo); - typename T::instance_type* isac_state_; - rtc::Optional sample_rate_hz_; + int sample_rate_hz_; rtc::scoped_refptr bwinfo_; RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoderIsacT); diff --git a/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h b/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h index 431632112a..e19f882006 100644 --- a/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h +++ b/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h @@ -17,33 +17,17 @@ namespace webrtc { -template -AudioDecoderIsacT::AudioDecoderIsacT() - : AudioDecoderIsacT(rtc::Optional(), nullptr) {} - -template -AudioDecoderIsacT::AudioDecoderIsacT( - const rtc::scoped_refptr& bwinfo) - : AudioDecoderIsacT(rtc::Optional(), bwinfo) {} - template AudioDecoderIsacT::AudioDecoderIsacT(int sample_rate_hz) - : AudioDecoderIsacT(rtc::Optional(sample_rate_hz), nullptr) {} + : AudioDecoderIsacT(sample_rate_hz, nullptr) {} template AudioDecoderIsacT::AudioDecoderIsacT( int sample_rate_hz, const rtc::scoped_refptr& bwinfo) - : AudioDecoderIsacT(rtc::Optional(sample_rate_hz), bwinfo) {} - -template -AudioDecoderIsacT::AudioDecoderIsacT( - rtc::Optional sample_rate_hz, - const rtc::scoped_refptr& bwinfo) : sample_rate_hz_(sample_rate_hz), bwinfo_(bwinfo) { - RTC_CHECK(!sample_rate_hz || *sample_rate_hz == 16000 || - *sample_rate_hz == 32000) - << "Unsupported sample rate " << *sample_rate_hz; + RTC_CHECK(sample_rate_hz == 16000 || sample_rate_hz == 32000) + << "Unsupported sample rate " << sample_rate_hz; RTC_CHECK_EQ(0, T::Create(&isac_state_)); T::DecoderInit(isac_state_); if (bwinfo_) { @@ -51,9 +35,7 @@ AudioDecoderIsacT::AudioDecoderIsacT( T::GetBandwidthInfo(isac_state_, &bi); bwinfo_->Set(bi); } - if (sample_rate_hz_) { - RTC_CHECK_EQ(0, T::SetDecSampRate(isac_state_, *sample_rate_hz_)); - } + RTC_CHECK_EQ(0, T::SetDecSampRate(isac_state_, sample_rate_hz_)); } template @@ -67,14 +49,7 @@ int AudioDecoderIsacT::DecodeInternal(const uint8_t* encoded, int sample_rate_hz, int16_t* decoded, SpeechType* speech_type) { - if (sample_rate_hz_) { - RTC_CHECK_EQ(*sample_rate_hz_, sample_rate_hz); - } else { - RTC_CHECK(sample_rate_hz == 16000 || sample_rate_hz == 32000) - << "Unsupported sample rate " << sample_rate_hz; - sample_rate_hz_ = rtc::Optional(sample_rate_hz); - RTC_CHECK_EQ(0, T::SetDecSampRate(isac_state_, *sample_rate_hz_)); - } + RTC_CHECK_EQ(sample_rate_hz_, sample_rate_hz); int16_t temp_type = 1; // Default is speech. int ret = T::DecodeInternal(isac_state_, encoded, encoded_len, decoded, &temp_type); @@ -121,8 +96,7 @@ int AudioDecoderIsacT::ErrorCode() { template int AudioDecoderIsacT::SampleRateHz() const { - RTC_CHECK(sample_rate_hz_) << "Sample rate not set yet!"; - return *sample_rate_hz_; + return sample_rate_hz_; } template diff --git a/webrtc/modules/utility/source/coder.cc b/webrtc/modules/utility/source/coder.cc index 248cd488b6..f2ae43eb10 100644 --- a/webrtc/modules/utility/source/coder.cc +++ b/webrtc/modules/utility/source/coder.cc @@ -45,8 +45,9 @@ int32_t AudioCoder::SetEncodeCodec(const CodecInst& codec_inst) { } int32_t AudioCoder::SetDecodeCodec(const CodecInst& codec_inst) { - if (acm_->RegisterReceiveCodec( - codec_inst, [&] { return rent_a_codec_.RentIsacDecoder(); }) == -1) { + if (acm_->RegisterReceiveCodec(codec_inst, [&] { + return rent_a_codec_.RentIsacDecoder(codec_inst.plfreq); + }) == -1) { return -1; } memcpy(&receive_codec_, &codec_inst, sizeof(CodecInst)); diff --git a/webrtc/test/fuzzers/audio_decoder_isac_fuzzer.cc b/webrtc/test/fuzzers/audio_decoder_isac_fuzzer.cc index ba6e7f0cb8..b013a34617 100644 --- a/webrtc/test/fuzzers/audio_decoder_isac_fuzzer.cc +++ b/webrtc/test/fuzzers/audio_decoder_isac_fuzzer.cc @@ -13,10 +13,10 @@ namespace webrtc { void FuzzOneInput(const uint8_t* data, size_t size) { - AudioDecoderIsac dec(nullptr); const int sample_rate_hz = size % 2 == 0 ? 16000 : 32000; // 16 or 32 kHz. static const size_t kAllocatedOuputSizeSamples = 32000 / 10; // 100 ms. int16_t output[kAllocatedOuputSizeSamples]; + AudioDecoderIsac dec(sample_rate_hz); FuzzAudioDecoder(DecoderFunctionType::kNormalDecode, data, size, &dec, sample_rate_hz, sizeof(output), output); } diff --git a/webrtc/test/fuzzers/audio_decoder_isac_incoming_packet_fuzzer.cc b/webrtc/test/fuzzers/audio_decoder_isac_incoming_packet_fuzzer.cc index 7a239f0361..9e490d3d4a 100644 --- a/webrtc/test/fuzzers/audio_decoder_isac_incoming_packet_fuzzer.cc +++ b/webrtc/test/fuzzers/audio_decoder_isac_incoming_packet_fuzzer.cc @@ -13,7 +13,7 @@ namespace webrtc { void FuzzOneInput(const uint8_t* data, size_t size) { - AudioDecoderIsac dec(nullptr); + AudioDecoderIsac dec(16000); FuzzAudioDecoderIncomingPacket(data, size, &dec); } } // namespace webrtc diff --git a/webrtc/test/fuzzers/audio_decoder_isacfix_fuzzer.cc b/webrtc/test/fuzzers/audio_decoder_isacfix_fuzzer.cc index c930aa8fba..25ab3f454d 100644 --- a/webrtc/test/fuzzers/audio_decoder_isacfix_fuzzer.cc +++ b/webrtc/test/fuzzers/audio_decoder_isacfix_fuzzer.cc @@ -13,10 +13,10 @@ namespace webrtc { void FuzzOneInput(const uint8_t* data, size_t size) { - AudioDecoderIsacFix dec(nullptr); static const int kSampleRateHz = 16000; static const size_t kAllocatedOuputSizeSamples = 16000 / 10; // 100 ms. int16_t output[kAllocatedOuputSizeSamples]; + AudioDecoderIsacFix dec(kSampleRateHz); FuzzAudioDecoder(DecoderFunctionType::kNormalDecode, data, size, &dec, kSampleRateHz, sizeof(output), output); } diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc index b514dd71d0..a17f546f4e 100644 --- a/webrtc/voice_engine/channel.cc +++ b/webrtc/voice_engine/channel.cc @@ -49,8 +49,8 @@ namespace { bool RegisterReceiveCodec(std::unique_ptr* acm, acm2::RentACodec* rac, const CodecInst& ci) { - const int result = - (*acm)->RegisterReceiveCodec(ci, [&] { return rac->RentIsacDecoder(); }); + const int result = (*acm)->RegisterReceiveCodec( + ci, [&] { return rac->RentIsacDecoder(ci.plfreq); }); return result == 0; }