Index: webrtc/modules/audio_coding/neteq/neteq_impl.cc |
diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl.cc b/webrtc/modules/audio_coding/neteq/neteq_impl.cc |
index db37e716d66dde966a4cac42f10dd47166c4f42c..b6ec655af3f073aadb1a4c5676127addb6d61d50 100644 |
--- a/webrtc/modules/audio_coding/neteq/neteq_impl.cc |
+++ b/webrtc/modules/audio_coding/neteq/neteq_impl.cc |
@@ -14,6 +14,7 @@ |
#include <memory.h> // memset |
#include <algorithm> |
+#include <vector> |
#include "webrtc/base/checks.h" |
#include "webrtc/base/logging.h" |
@@ -664,13 +665,15 @@ int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header, |
} |
} |
- // Update bandwidth estimate, if the packet is not sync-packet. |
- if (!packet_list.empty() && !packet_list.front()->sync_packet) { |
+ // Update bandwidth estimate, if the packet is not sync-packet nor comfort |
+ // noise. |
+ if (!packet_list.empty() && !packet_list.front()->sync_packet && |
+ !decoder_database_->IsComfortNoise(main_header.payloadType)) { |
// The list can be empty here if we got nothing but DTMF payloads. |
AudioDecoder* decoder = |
decoder_database_->GetDecoder(main_header.payloadType); |
assert(decoder); // Should always get a valid object, since we have |
- // already checked that the payload types are known. |
+ // already checked that the payload types are known. |
decoder->IncomingPacket(packet_list.front()->payload, |
packet_list.front()->payload_length, |
packet_list.front()->header.sequenceNumber, |
@@ -728,14 +731,18 @@ int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header, |
const RTPHeader* rtp_header = packet_buffer_->NextRtpHeader(); |
assert(rtp_header); |
int payload_type = rtp_header->payloadType; |
- AudioDecoder* decoder = decoder_database_->GetDecoder(payload_type); |
- assert(decoder); // Payloads are already checked to be valid. |
+ size_t channels = 1; |
+ if (!decoder_database_->IsComfortNoise(payload_type)) { |
+ AudioDecoder* decoder = decoder_database_->GetDecoder(payload_type); |
+ assert(decoder); // Payloads are already checked to be valid. |
+ channels = decoder->Channels(); |
+ } |
const DecoderDatabase::DecoderInfo* decoder_info = |
decoder_database_->GetDecoderInfo(payload_type); |
assert(decoder_info); |
if (decoder_info->fs_hz != fs_hz_ || |
- decoder->Channels() != algorithm_buffer_->Channels()) { |
- SetSampleRateAndChannels(decoder_info->fs_hz, decoder->Channels()); |
+ channels != algorithm_buffer_->Channels()) { |
+ SetSampleRateAndChannels(decoder_info->fs_hz, channels); |
} |
if (nack_enabled_) { |
RTC_DCHECK(nack_); |
@@ -1297,7 +1304,7 @@ int NetEqImpl::Decode(PacketList* packet_list, Operations* operation, |
decoder->Reset(); |
// Reset comfort noise decoder. |
- AudioDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder(); |
+ ComfortNoiseDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder(); |
if (cng_decoder) |
cng_decoder->Reset(); |
@@ -1955,7 +1962,7 @@ int NetEqImpl::ExtractPackets(size_t required_samples, |
stats_.SecondaryDecodedSamples(packet_duration); |
} |
} |
- } else { |
+ } else if (!decoder_database_->IsComfortNoise(packet->header.payloadType)) { |
LOG(LS_WARNING) << "Unknown payload type " |
<< static_cast<int>(packet->header.payloadType); |
assert(false); |
@@ -2023,7 +2030,7 @@ void NetEqImpl::SetSampleRateAndChannels(int fs_hz, size_t channels) { |
mute_factor_array_[i] = 16384; // 1.0 in Q14. |
} |
- AudioDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder(); |
+ ComfortNoiseDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder(); |
if (cng_decoder) |
cng_decoder->Reset(); |