AcmReceiver: Ask NetEq to delete all decoders at once instead of one by one

It requires a new NetEq method, but it can no longer fail. And we no
longer need to use AcmReceiver::decoders_, which we're trying to
eliminate.

(This is a re-land of https://codereview.webrtc.org/2342313002.)

BUG=webrtc:5801

Review-Url: https://codereview.webrtc.org/2348233002
Cr-Commit-Position: refs/heads/master@{#14304}
This commit is contained in:
kwiberg
2016-09-20 04:02:25 -07:00
committed by Commit bot
parent 6f0f616b53
commit 6b19b560ac
11 changed files with 47 additions and 23 deletions

View File

@ -246,27 +246,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<int>(cur->second.payload_type);
ret_val = -1;
}
}
// No codec is registered, invalidate last audio decoder.
neteq_->RemoveAllPayloadTypes();
decoders_.clear();
last_audio_decoder_ = rtc::Optional<CodecInst>();
last_packet_sample_rate_hz_ = rtc::Optional<int>();
return ret_val;
}
int AcmReceiver::RemoveCodec(uint8_t payload_type) {

View File

@ -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.

View File

@ -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);