Index: webrtc/modules/audio_coding/neteq/decoder_database.cc |
diff --git a/webrtc/modules/audio_coding/neteq/decoder_database.cc b/webrtc/modules/audio_coding/neteq/decoder_database.cc |
index d147d676ed250307ab5aca7496b0308528c8ab9e..8cd438656a73efcf44237f6e50000b7bdda6e5ba 100644 |
--- a/webrtc/modules/audio_coding/neteq/decoder_database.cc |
+++ b/webrtc/modules/audio_coding/neteq/decoder_database.cc |
@@ -123,6 +123,38 @@ void DecoderDatabase::Reset() { |
active_cng_decoder_type_ = -1; |
} |
+std::vector<int> DecoderDatabase::SetCodecs( |
+ const std::map<int, SdpAudioFormat>& codecs) { |
+ // First collect all payload types that we'll remove or reassign, then remove |
+ // them from the database. |
+ std::vector<int> changed_payload_types; |
+ for (const std::pair<uint8_t, const DecoderInfo&> kv : decoders_) { |
+ auto i = codecs.find(kv.first); |
+ if (i == codecs.end() || i->second != kv.second.GetFormat()) { |
+ changed_payload_types.push_back(kv.first); |
+ } |
+ } |
+ for (int pl_type : changed_payload_types) { |
+ Remove(pl_type); |
+ } |
+ |
+ // Enter the new and changed payload type mappings into the database. |
+ for (const auto& kv : codecs) { |
+ const int& rtp_payload_type = kv.first; |
+ const SdpAudioFormat& audio_format = kv.second; |
+ RTC_DCHECK_GE(rtp_payload_type, 0); |
+ RTC_DCHECK_LE(rtp_payload_type, 0x7f); |
+ if (decoders_.count(rtp_payload_type) == 0) { |
+ decoders_.insert(std::make_pair( |
+ rtp_payload_type, DecoderInfo(audio_format, decoder_factory_.get()))); |
+ } else { |
+ // The mapping for this payload type hasn't changed. |
+ } |
+ } |
+ |
+ return changed_payload_types; |
+} |
+ |
int DecoderDatabase::RegisterPayload(uint8_t rtp_payload_type, |
NetEqDecoder codec_type, |
const std::string& name) { |