diff --git a/webrtc/modules/audio_coding/acm2/acm_receiver.cc b/webrtc/modules/audio_coding/acm2/acm_receiver.cc index 2ae75485e0..b89091f362 100644 --- a/webrtc/modules/audio_coding/acm2/acm_receiver.cc +++ b/webrtc/modules/audio_coding/acm2/acm_receiver.cc @@ -245,27 +245,12 @@ void AcmReceiver::FlushBuffers() { neteq_->FlushBuffers(); } -// If failed in removing one of the codecs, this method continues to remove as -// many as it can. -int AcmReceiver::RemoveAllCodecs() { - int ret_val = 0; +void AcmReceiver::RemoveAllCodecs() { rtc::CritScope lock(&crit_sect_); - for (auto it = decoders_.begin(); it != decoders_.end(); ) { - auto cur = it; - ++it; // it will be valid even if we erase cur - if (neteq_->RemovePayloadType(cur->second.payload_type) == 0) { - decoders_.erase(cur); - } else { - LOG_F(LS_ERROR) << "Cannot remove payload " - << static_cast(cur->second.payload_type); - ret_val = -1; - } - } - - // No codec is registered, invalidate last audio decoder. + neteq_->RemoveAllPayloadTypes(); + decoders_.clear(); last_audio_decoder_ = rtc::Optional(); last_packet_sample_rate_hz_ = rtc::Optional(); - return ret_val; } int AcmReceiver::RemoveCodec(uint8_t payload_type) { diff --git a/webrtc/modules/audio_coding/acm2/acm_receiver.h b/webrtc/modules/audio_coding/acm2/acm_receiver.h index 5b864c2b70..ee3f81da59 100644 --- a/webrtc/modules/audio_coding/acm2/acm_receiver.h +++ b/webrtc/modules/audio_coding/acm2/acm_receiver.h @@ -186,7 +186,7 @@ class AcmReceiver { // // Remove all registered codecs. // - int RemoveAllCodecs(); + void RemoveAllCodecs(); // Returns the RTP timestamp for the last sample delivered by GetAudio(). // The return value will be empty if no valid timestamp is available. diff --git a/webrtc/modules/audio_coding/acm2/audio_coding_module.cc b/webrtc/modules/audio_coding/acm2/audio_coding_module.cc index 4784a8721f..73f03a47ad 100644 --- a/webrtc/modules/audio_coding/acm2/audio_coding_module.cc +++ b/webrtc/modules/audio_coding/acm2/audio_coding_module.cc @@ -948,10 +948,8 @@ int AudioCodingModuleImpl::InitializeReceiverSafe() { // If the receiver is already initialized then we want to destroy any // existing decoders. After a call to this function, we should have a clean // start-up. - if (receiver_initialized_) { - if (receiver_.RemoveAllCodecs() < 0) - return -1; - } + if (receiver_initialized_) + receiver_.RemoveAllCodecs(); receiver_.ResetInitialDelay(); receiver_.SetMinimumDelay(0); receiver_.SetMaximumDelay(0); diff --git a/webrtc/modules/audio_coding/neteq/decoder_database.cc b/webrtc/modules/audio_coding/neteq/decoder_database.cc index b189e4bb56..f5fbad3446 100644 --- a/webrtc/modules/audio_coding/neteq/decoder_database.cc +++ b/webrtc/modules/audio_coding/neteq/decoder_database.cc @@ -169,6 +169,12 @@ int DecoderDatabase::Remove(uint8_t rtp_payload_type) { return kOK; } +void DecoderDatabase::RemoveAll() { + decoders_.clear(); + active_decoder_type_ = -1; // No active decoder. + active_cng_decoder_type_ = -1; // No active CNG decoder. +} + const DecoderDatabase::DecoderInfo* DecoderDatabase::GetDecoderInfo( uint8_t rtp_payload_type) const { DecoderMap::const_iterator it = decoders_.find(rtp_payload_type); diff --git a/webrtc/modules/audio_coding/neteq/decoder_database.h b/webrtc/modules/audio_coding/neteq/decoder_database.h index 6d277c95c9..38498f5143 100644 --- a/webrtc/modules/audio_coding/neteq/decoder_database.h +++ b/webrtc/modules/audio_coding/neteq/decoder_database.h @@ -136,6 +136,9 @@ class DecoderDatabase { // Returns kDecoderNotFound or kOK depending on the outcome of the operation. virtual int Remove(uint8_t rtp_payload_type); + // Remove all entries. + void RemoveAll(); + // Returns a pointer to the DecoderInfo struct for |rtp_payload_type|. If // no decoder is registered with that |rtp_payload_type|, NULL is returned. virtual const DecoderInfo* GetDecoderInfo(uint8_t rtp_payload_type) const; diff --git a/webrtc/modules/audio_coding/neteq/include/neteq.h b/webrtc/modules/audio_coding/neteq/include/neteq.h index 1f6205f1e4..eb08151a5d 100644 --- a/webrtc/modules/audio_coding/neteq/include/neteq.h +++ b/webrtc/modules/audio_coding/neteq/include/neteq.h @@ -183,6 +183,9 @@ class NetEq { // -1 on failure. virtual int RemovePayloadType(uint8_t rtp_payload_type) = 0; + // Removes all payload types from the codec database. + virtual void RemoveAllPayloadTypes() = 0; + // Sets a minimum delay in millisecond for packet buffer. The minimum is // maintained unless a higher latency is dictated by channel condition. // Returns true if the minimum is successfully applied, otherwise false is diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl.cc b/webrtc/modules/audio_coding/neteq/neteq_impl.cc index 71eea2114c..5e2116409d 100644 --- a/webrtc/modules/audio_coding/neteq/neteq_impl.cc +++ b/webrtc/modules/audio_coding/neteq/neteq_impl.cc @@ -291,6 +291,11 @@ int NetEqImpl::RemovePayloadType(uint8_t rtp_payload_type) { return kFail; } +void NetEqImpl::RemoveAllPayloadTypes() { + rtc::CritScope lock(&crit_sect_); + decoder_database_->RemoveAll(); +} + bool NetEqImpl::SetMinimumDelay(int delay_ms) { rtc::CritScope lock(&crit_sect_); if (delay_ms >= 0 && delay_ms < 10000) { diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl.h b/webrtc/modules/audio_coding/neteq/neteq_impl.h index 8795ef5210..7903ba665c 100644 --- a/webrtc/modules/audio_coding/neteq/neteq_impl.h +++ b/webrtc/modules/audio_coding/neteq/neteq_impl.h @@ -123,6 +123,8 @@ class NetEqImpl : public webrtc::NetEq { // -1 on failure. int RemovePayloadType(uint8_t rtp_payload_type) override; + void RemoveAllPayloadTypes() override; + bool SetMinimumDelay(int delay_ms) override; bool SetMaximumDelay(int delay_ms) override;