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 92d4bab1e4a573fb3c84ef53fa724ebfeabe860c..44e0b4db59d3851f4a369a4eb3ac212a0ef751b2 100644 |
--- a/webrtc/modules/audio_coding/neteq/decoder_database.cc |
+++ b/webrtc/modules/audio_coding/neteq/decoder_database.cc |
@@ -24,8 +24,29 @@ DecoderDatabase::DecoderDatabase() |
DecoderDatabase::~DecoderDatabase() {} |
-DecoderDatabase::DecoderInfo::~DecoderInfo() { |
- if (!external) delete decoder; |
+DecoderDatabase::DecoderInfo::DecoderInfo(NetEqDecoder ct, |
+ const std::string& nm, |
+ int fs, |
+ AudioDecoder* ext_dec) |
+ : codec_type(ct), |
+ name(nm), |
+ fs_hz(fs), |
+ rtp_sample_rate_hz(fs), |
+ external_decoder(ext_dec) {} |
+ |
+DecoderDatabase::DecoderInfo::DecoderInfo(DecoderInfo&&) = default; |
+DecoderDatabase::DecoderInfo::~DecoderInfo() = default; |
+ |
+AudioDecoder* DecoderDatabase::DecoderInfo::GetDecoder() { |
+ if (external_decoder) { |
+ RTC_DCHECK(!decoder_); |
+ return external_decoder; |
+ } |
+ if (!decoder_) { |
+ decoder_.reset(CreateAudioDecoder(codec_type)); |
+ } |
+ RTC_DCHECK(decoder_); |
+ return decoder_.get(); |
} |
bool DecoderDatabase::Empty() const { return decoders_.empty(); } |
@@ -48,8 +69,9 @@ int DecoderDatabase::RegisterPayload(uint8_t rtp_payload_type, |
return kCodecNotSupported; |
} |
const int fs_hz = CodecSampleRateHz(codec_type); |
- DecoderInfo info(codec_type, name, fs_hz, NULL, false); |
- auto ret = decoders_.insert(std::make_pair(rtp_payload_type, info)); |
+ DecoderInfo info(codec_type, name, fs_hz, nullptr); |
+ auto ret = |
+ decoders_.insert(std::make_pair(rtp_payload_type, std::move(info))); |
if (ret.second == false) { |
// Database already contains a decoder with type |rtp_payload_type|. |
return kDecoderExists; |
@@ -75,8 +97,8 @@ int DecoderDatabase::InsertExternal(uint8_t rtp_payload_type, |
return kInvalidPointer; |
} |
std::pair<DecoderMap::iterator, bool> ret; |
- DecoderInfo info(codec_type, codec_name, fs_hz, decoder, true); |
- ret = decoders_.insert(std::make_pair(rtp_payload_type, info)); |
+ DecoderInfo info(codec_type, codec_name, fs_hz, decoder); |
+ ret = decoders_.insert(std::make_pair(rtp_payload_type, std::move(info))); |
if (ret.second == false) { |
// Database already contains a decoder with type |rtp_payload_type|. |
return kDecoderExists; |
@@ -132,13 +154,7 @@ AudioDecoder* DecoderDatabase::GetDecoder(uint8_t rtp_payload_type) { |
return NULL; |
} |
DecoderInfo* info = &(*it).second; |
- if (!info->decoder) { |
- // Create the decoder object. |
- AudioDecoder* decoder = CreateAudioDecoder(info->codec_type); |
- assert(decoder); // Should not be able to have an unsupported codec here. |
- info->decoder = decoder; |
- } |
- return info->decoder; |
+ return info->GetDecoder(); |
} |
bool DecoderDatabase::IsType(uint8_t rtp_payload_type, |
@@ -191,12 +207,7 @@ int DecoderDatabase::SetActiveDecoder(uint8_t rtp_payload_type, |
assert(false); |
return kDecoderNotFound; |
} |
- if (!(*it).second.external) { |
- // Delete the AudioDecoder object, unless it is an externally created |
- // decoder. |
- delete (*it).second.decoder; |
- (*it).second.decoder = NULL; |
- } |
+ it->second.DropDecoder(); |
*new_decoder = true; |
} |
active_decoder_ = rtp_payload_type; |
@@ -226,12 +237,7 @@ int DecoderDatabase::SetActiveCngDecoder(uint8_t rtp_payload_type) { |
assert(false); |
return kDecoderNotFound; |
} |
- if (!(*it).second.external) { |
- // Delete the AudioDecoder object, unless it is an externally created |
- // decoder. |
- delete (*it).second.decoder; |
- (*it).second.decoder = NULL; |
- } |
+ it->second.DropDecoder(); |
} |
active_cng_decoder_ = rtp_payload_type; |
return kOK; |