Chromium Code Reviews| 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 9a882aac374a93c05bff8f7fbd866984e2c3c58f..2ae75485e0ff928e2c7029ff4b7d0e1baef41883 100644 | 
| --- a/webrtc/modules/audio_coding/acm2/acm_receiver.cc | 
| +++ b/webrtc/modules/audio_coding/acm2/acm_receiver.cc | 
| @@ -32,23 +32,8 @@ namespace webrtc { | 
| namespace acm2 { | 
| -namespace { | 
| - | 
| -// Is the given codec a CNG codec? | 
| -// TODO(kwiberg): Move to RentACodec. | 
| -bool IsCng(int codec_id) { | 
| - auto i = RentACodec::CodecIdFromIndex(codec_id); | 
| - return (i && (*i == RentACodec::CodecId::kCNNB || | 
| - *i == RentACodec::CodecId::kCNWB || | 
| - *i == RentACodec::CodecId::kCNSWB || | 
| - *i == RentACodec::CodecId::kCNFB)); | 
| -} | 
| - | 
| -} // namespace | 
| - | 
| AcmReceiver::AcmReceiver(const AudioCodingModule::Config& config) | 
| - : last_audio_decoder_(nullptr), | 
| - last_audio_buffer_(new int16_t[AudioFrame::kMaxDataSizeSamples]), | 
| + : last_audio_buffer_(new int16_t[AudioFrame::kMaxDataSizeSamples]), | 
| neteq_(NetEq::Create(config.neteq_config, config.decoder_factory)), | 
| clock_(config.clock), | 
| resampled_last_output_frame_(true) { | 
| @@ -95,29 +80,25 @@ int AcmReceiver::InsertPacket(const WebRtcRTPHeader& rtp_header, | 
| { | 
| rtc::CritScope lock(&crit_sect_); | 
| - const Decoder* decoder = RtpHeaderToDecoder(*header, incoming_payload[0]); | 
| - if (!decoder) { | 
| + const rtc::Optional<CodecInst> ci = | 
| + RtpHeaderToDecoder(*header, incoming_payload[0]); | 
| + if (!ci) { | 
| LOG_F(LS_ERROR) << "Payload-type " | 
| << static_cast<int>(header->payloadType) | 
| << " is not registered."; | 
| return -1; | 
| } | 
| - const int sample_rate_hz = [&decoder] { | 
| - const auto ci = RentACodec::CodecIdFromIndex(decoder->acm_codec_id); | 
| - return ci ? RentACodec::CodecInstById(*ci)->plfreq : -1; | 
| - }(); | 
| - receive_timestamp = NowInTimestamp(sample_rate_hz); | 
| - | 
| - // If this is a CNG while the audio codec is not mono, skip pushing in | 
| - // packets into NetEq. | 
| - if (IsCng(decoder->acm_codec_id) && last_audio_decoder_ && | 
| - last_audio_decoder_->channels > 1) | 
| + receive_timestamp = NowInTimestamp(ci->plfreq); | 
| + | 
| + if (STR_CASE_CMP(ci->plname, "cn") == 0) { | 
| + if (last_audio_decoder_ && last_audio_decoder_->channels > 1) { | 
| 
 
hlundin-webrtc
2016/09/19 11:37:36
This is functionality best kept inside NetEq. ACM
 
kwiberg-webrtc
2016/09/19 12:18:34
Moving this into NetEq would mean that AcmReceiver
 
hlundin-webrtc
2016/09/19 12:22:03
Acknowledged.
 
 | 
| + // This is a CNG and the audio codec is not mono, so skip pushing in | 
| + // packets into NetEq. | 
| return 0; | 
| - if (!IsCng(decoder->acm_codec_id) && | 
| - decoder->acm_codec_id != | 
| - *RentACodec::CodecIndexFromId(RentACodec::CodecId::kAVT)) { | 
| - last_audio_decoder_ = decoder; | 
| - last_packet_sample_rate_hz_ = rtc::Optional<int>(decoder->sample_rate_hz); | 
| + } | 
| + } else { | 
| + last_audio_decoder_ = ci; | 
| + last_packet_sample_rate_hz_ = rtc::Optional<int>(ci->plfreq); | 
| } | 
| } // |crit_sect_| is released. | 
| @@ -282,7 +263,7 @@ int AcmReceiver::RemoveAllCodecs() { | 
| } | 
| // No codec is registered, invalidate last audio decoder. | 
| - last_audio_decoder_ = nullptr; | 
| + last_audio_decoder_ = rtc::Optional<CodecInst>(); | 
| last_packet_sample_rate_hz_ = rtc::Optional<int>(); | 
| return ret_val; | 
| } | 
| @@ -297,8 +278,8 @@ int AcmReceiver::RemoveCodec(uint8_t payload_type) { | 
| LOG(LERROR) << "AcmReceiver::RemoveCodec" << static_cast<int>(payload_type); | 
| return -1; | 
| } | 
| - if (last_audio_decoder_ == &it->second) { | 
| - last_audio_decoder_ = nullptr; | 
| + if (last_audio_decoder_ && payload_type == last_audio_decoder_->pltype) { | 
| + last_audio_decoder_ = rtc::Optional<CodecInst>(); | 
| last_packet_sample_rate_hz_ = rtc::Optional<int>(); | 
| } | 
| decoders_.erase(it); | 
| @@ -318,11 +299,7 @@ int AcmReceiver::LastAudioCodec(CodecInst* codec) const { | 
| if (!last_audio_decoder_) { | 
| return -1; | 
| } | 
| - *codec = *RentACodec::CodecInstById( | 
| - *RentACodec::CodecIdFromIndex(last_audio_decoder_->acm_codec_id)); | 
| - codec->pltype = last_audio_decoder_->payload_type; | 
| - codec->channels = last_audio_decoder_->channels; | 
| - codec->plfreq = last_audio_decoder_->sample_rate_hz; | 
| + *codec = *last_audio_decoder_; | 
| return 0; | 
| } | 
| @@ -386,20 +363,17 @@ void AcmReceiver::ResetInitialDelay() { | 
| // TODO(turajs): Should NetEq Buffer be flushed? | 
| } | 
| -const AcmReceiver::Decoder* AcmReceiver::RtpHeaderToDecoder( | 
| +const rtc::Optional<CodecInst> AcmReceiver::RtpHeaderToDecoder( | 
| const RTPHeader& rtp_header, | 
| uint8_t payload_type) const { | 
| 
 
hlundin-webrtc
2016/09/19 11:37:36
Rename to "first_payload_byte". This code is very
 
kwiberg-webrtc
2016/09/19 12:18:34
Good idea.
 
 | 
| - auto it = decoders_.find(rtp_header.payloadType); | 
| - const auto red_index = | 
| - RentACodec::CodecIndexFromId(RentACodec::CodecId::kRED); | 
| - if (red_index && // This ensures that RED is defined in WebRTC. | 
| - it != decoders_.end() && it->second.acm_codec_id == *red_index) { | 
| - // This is a RED packet, get the payload of the audio codec. | 
| - it = decoders_.find(payload_type & 0x7F); | 
| + const rtc::Optional<CodecInst> ci = | 
| + neteq_->GetDecoder(rtp_header.payloadType); | 
| + if (ci && STR_CASE_CMP(ci->plname, "red") == 0) { | 
| + // This is a RED packet. Get the payload of the audio codec. | 
| + return neteq_->GetDecoder(payload_type & 0x7f); | 
| + } else { | 
| + return ci; | 
| } | 
| - | 
| - // Check if the payload is registered. | 
| - return it != decoders_.end() ? &it->second : nullptr; | 
| } | 
| uint32_t AcmReceiver::NowInTimestamp(int decoder_sampling_rate) const { |