Index: webrtc/modules/audio_coding/acm2/acm_receiver.cc |
diff --git a/webrtc/modules/audio_coding/acm2/acm_receiver.cc b/webrtc/modules/audio_coding/acm2/acm_receiver.cc |
index b89091f3626374d8f3fe0693c5437f8b2e989d2e..2ae75485e0ff928e2c7029ff4b7d0e1baef41883 100644 |
--- a/webrtc/modules/audio_coding/acm2/acm_receiver.cc |
+++ b/webrtc/modules/audio_coding/acm2/acm_receiver.cc |
@@ -245,12 +245,27 @@ |
neteq_->FlushBuffers(); |
} |
-void AcmReceiver::RemoveAllCodecs() { |
- rtc::CritScope lock(&crit_sect_); |
- neteq_->RemoveAllPayloadTypes(); |
- decoders_.clear(); |
+// 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; |
+ 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<int>(cur->second.payload_type); |
+ ret_val = -1; |
+ } |
+ } |
+ |
+ // No codec is registered, invalidate last audio decoder. |
last_audio_decoder_ = rtc::Optional<CodecInst>(); |
last_packet_sample_rate_hz_ = rtc::Optional<int>(); |
+ return ret_val; |
} |
int AcmReceiver::RemoveCodec(uint8_t payload_type) { |