Chromium Code Reviews| Index: webrtc/voice_engine/channel.cc | 
| diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc | 
| index c91d0d6dc8814abf380b01db075495fe19020a28..c56cda91a8a050ce005596a190b66d90c883311f 100644 | 
| --- a/webrtc/voice_engine/channel.cc | 
| +++ b/webrtc/voice_engine/channel.cc | 
| @@ -43,6 +43,18 @@ | 
| namespace webrtc { | 
| namespace voe { | 
| +namespace { | 
| + | 
| +bool RegisterReceiveCodec(std::unique_ptr<AudioCodingModule>* acm, | 
| + acm2::RentACodec* rac, | 
| + const CodecInst& ci) { | 
| + const int result = | 
| + (*acm)->RegisterReceiveCodec(ci, [&] { return rac->RentIsacDecoder(); }); | 
| + return result == 0; | 
| +} | 
| + | 
| +} // namespace | 
| + | 
| const int kTelephoneEventAttenuationdB = 10; | 
| class TransportFeedbackProxy : public TransportFeedbackObserver { | 
| @@ -391,7 +403,7 @@ int32_t Channel::OnInitializeDecoder( | 
| receiveCodec.pacsize = dummyCodec.pacsize; | 
| // Register the new codec to the ACM | 
| - if (audio_coding_->RegisterReceiveCodec(receiveCodec) == -1) { | 
| + if (!RegisterReceiveCodec(&audio_coding_, &rent_a_codec_, receiveCodec)) { | 
| WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), | 
| "Channel::OnInitializeDecoder() invalid codec (" | 
| "pt=%d, name=%s) received - 1", | 
| @@ -966,8 +978,8 @@ int32_t Channel::Init() { | 
| // Register default PT for outband 'telephone-event' | 
| if (!STR_CASE_CMP(codec.plname, "telephone-event")) { | 
| - if ((_rtpRtcpModule->RegisterSendPayload(codec) == -1) || | 
| - (audio_coding_->RegisterReceiveCodec(codec) == -1)) { | 
| + if (_rtpRtcpModule->RegisterSendPayload(codec) == -1 || | 
| + !RegisterReceiveCodec(&audio_coding_, &rent_a_codec_, codec)) { | 
| WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), | 
| "Channel::Init() failed to register outband " | 
| "'telephone-event' (%d/%d) correctly", | 
| @@ -976,9 +988,10 @@ int32_t Channel::Init() { | 
| } | 
| if (!STR_CASE_CMP(codec.plname, "CN")) { | 
| - if ((audio_coding_->RegisterSendCodec(codec) == -1) || | 
| - (audio_coding_->RegisterReceiveCodec(codec) == -1) || | 
| - (_rtpRtcpModule->RegisterSendPayload(codec) == -1)) { | 
| + if (!codec_manager_.RegisterEncoder(codec) || | 
| + !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get()) || | 
| + !RegisterReceiveCodec(&audio_coding_, &rent_a_codec_, codec) || | 
| + _rtpRtcpModule->RegisterSendPayload(codec) == -1) { | 
| WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), | 
| "Channel::Init() failed to register CN (%d/%d) " | 
| "correctly - 1", | 
| @@ -989,7 +1002,7 @@ int32_t Channel::Init() { | 
| // Register RED to the receiving side of the ACM. | 
| // We will not receive an OnInitializeDecoder() callback for RED. | 
| if (!STR_CASE_CMP(codec.plname, "RED")) { | 
| - if (audio_coding_->RegisterReceiveCodec(codec) == -1) { | 
| + if (!RegisterReceiveCodec(&audio_coding_, &rent_a_codec_, codec)) { | 
| WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), | 
| "Channel::Init() failed to register RED (%d/%d) " | 
| "correctly", | 
| @@ -1195,7 +1208,7 @@ int32_t Channel::DeRegisterVoiceEngineObserver() { | 
| } | 
| int32_t Channel::GetSendCodec(CodecInst& codec) { | 
| - auto send_codec = audio_coding_->SendCodec(); | 
| + auto send_codec = codec_manager_.GetCodecInst(); | 
| if (send_codec) { | 
| codec = *send_codec; | 
| return 0; | 
| @@ -1211,7 +1224,8 @@ int32_t Channel::SetSendCodec(const CodecInst& codec) { | 
| WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), | 
| "Channel::SetSendCodec()"); | 
| - if (audio_coding_->RegisterSendCodec(codec) != 0) { | 
| + if (!codec_manager_.RegisterEncoder(codec) || | 
| + !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) { | 
| WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId), | 
| "SetSendCodec() failed to register codec to ACM"); | 
| return -1; | 
| @@ -1258,10 +1272,9 @@ int32_t Channel::SetVADStatus(bool enableVAD, | 
| bool disableDTX) { | 
| WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), | 
| "Channel::SetVADStatus(mode=%d)", mode); | 
| - assert(!(disableDTX && enableVAD)); // disableDTX mode is deprecated. | 
| - // To disable VAD, DTX must be disabled too | 
| - disableDTX = ((enableVAD == false) ? true : disableDTX); | 
| - if (audio_coding_->SetVAD(!disableDTX, enableVAD, mode) != 0) { | 
| + RTC_DCHECK(!(disableDTX && enableVAD)); // disableDTX mode is deprecated. | 
| + if (!codec_manager_.SetVAD(enableVAD, mode) || | 
| + !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) { | 
| _engineStatisticsPtr->SetLastError(VE_AUDIO_CODING_MODULE_ERROR, | 
| kTraceError, | 
| "SetVADStatus() failed to set VAD"); | 
| @@ -1273,13 +1286,10 @@ int32_t Channel::SetVADStatus(bool enableVAD, | 
| int32_t Channel::GetVADStatus(bool& enabledVAD, | 
| ACMVADMode& mode, | 
| bool& disabledDTX) { | 
| - if (audio_coding_->VAD(&disabledDTX, &enabledVAD, &mode) != 0) { | 
| - _engineStatisticsPtr->SetLastError( | 
| - VE_AUDIO_CODING_MODULE_ERROR, kTraceError, | 
| - "GetVADStatus() failed to get VAD status"); | 
| - return -1; | 
| - } | 
| - disabledDTX = !disabledDTX; | 
| + const auto* params = codec_manager_.GetStackParams(); | 
| + enabledVAD = params->use_cng; | 
| + mode = params->vad_mode; | 
| + disabledDTX = !params->use_cng; | 
| return 0; | 
| } | 
| @@ -1332,6 +1342,8 @@ int32_t Channel::SetRecPayloadType(const CodecInst& codec) { | 
| codec.plname, codec.pltype, codec.plfreq, codec.channels, | 
| (codec.rate < 0) ? 0 : codec.rate) != 0) { | 
| // First attempt to register failed => de-register and try again | 
| + // TODO(kwiberg): Retrying is probably not necessary, since | 
| + // AcmReceiver::AddCodec also retries. | 
| rtp_receiver_->DeRegisterReceivePayload(codec.pltype); | 
| if (rtp_receiver_->RegisterReceivePayload( | 
| codec.plname, codec.pltype, codec.plfreq, codec.channels, | 
| @@ -1342,9 +1354,9 @@ int32_t Channel::SetRecPayloadType(const CodecInst& codec) { | 
| return -1; | 
| } | 
| } | 
| - if (audio_coding_->RegisterReceiveCodec(codec) != 0) { | 
| + if (!RegisterReceiveCodec(&audio_coding_, &rent_a_codec_, codec)) { | 
| audio_coding_->UnregisterReceiveCodec(codec.pltype); | 
| - if (audio_coding_->RegisterReceiveCodec(codec) != 0) { | 
| + if (!RegisterReceiveCodec(&audio_coding_, &rent_a_codec_, codec)) { | 
| _engineStatisticsPtr->SetLastError( | 
| VE_AUDIO_CODING_MODULE_ERROR, kTraceError, | 
| "SetRecPayloadType() ACM registration failed - 1"); | 
| @@ -1391,7 +1403,8 @@ int32_t Channel::SetSendCNPayloadType(int type, PayloadFrequencies frequency) { | 
| // Modify the payload type (must be set to dynamic range) | 
| codec.pltype = type; | 
| - if (audio_coding_->RegisterSendCodec(codec) != 0) { | 
| + if (!codec_manager_.RegisterEncoder(codec) || | 
| + !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) { | 
| _engineStatisticsPtr->SetLastError( | 
| VE_AUDIO_CODING_MODULE_ERROR, kTraceError, | 
| "SetSendCNPayloadType() failed to register CN to ACM"); | 
| @@ -2854,7 +2867,8 @@ int Channel::SetREDStatus(bool enable, int redPayloadtype) { | 
| } | 
| } | 
| - if (audio_coding_->SetREDStatus(enable) != 0) { | 
| + if (!codec_manager_.SetCopyRed(enable) || | 
| 
 
the sun
2016/04/06 11:58:25
Nit: should this be RED, not Red?
 
kwiberg-webrtc
2016/04/06 12:15:29
Style guide says: "Prefer to capitalize acronyms a
 
the sun
2016/04/06 13:05:59
Thanks for looking that up for me! :)
Ok, then it
 
kwiberg-webrtc
2016/04/06 14:10:40
It just says you should prefer it, not that you mu
 
 | 
| + !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) { | 
| _engineStatisticsPtr->SetLastError( | 
| VE_AUDIO_CODING_MODULE_ERROR, kTraceError, | 
| "SetREDStatus() failed to set RED state in the ACM"); | 
| @@ -2864,7 +2878,7 @@ int Channel::SetREDStatus(bool enable, int redPayloadtype) { | 
| } | 
| int Channel::GetREDStatus(bool& enabled, int& redPayloadtype) { | 
| - enabled = audio_coding_->REDStatus(); | 
| + enabled = codec_manager_.GetStackParams()->use_red; | 
| if (enabled) { | 
| int8_t payloadType = 0; | 
| if (_rtpRtcpModule->SendREDPayloadType(&payloadType) != 0) { | 
| @@ -2884,7 +2898,8 @@ int Channel::SetCodecFECStatus(bool enable) { | 
| WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), | 
| "Channel::SetCodecFECStatus()"); | 
| - if (audio_coding_->SetCodecFEC(enable) != 0) { | 
| + if (!codec_manager_.SetCodecFEC(enable) || | 
| + !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) { | 
| _engineStatisticsPtr->SetLastError( | 
| VE_AUDIO_CODING_MODULE_ERROR, kTraceError, | 
| "SetCodecFECStatus() failed to set FEC state"); | 
| @@ -2894,8 +2909,7 @@ int Channel::SetCodecFECStatus(bool enable) { | 
| } | 
| bool Channel::GetCodecFECStatus() { | 
| - bool enabled = audio_coding_->CodecFEC(); | 
| - return enabled; | 
| + return codec_manager_.GetStackParams()->use_codec_fec; | 
| } | 
| void Channel::SetNACKStatus(bool enable, int maxNumberOfPackets) { | 
| @@ -3436,7 +3450,8 @@ int Channel::SetRedPayloadType(int red_payload_type) { | 
| } | 
| codec.pltype = red_payload_type; | 
| - if (audio_coding_->RegisterSendCodec(codec) < 0) { | 
| + if (!codec_manager_.RegisterEncoder(codec) || | 
| + !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) { | 
| _engineStatisticsPtr->SetLastError( | 
| VE_AUDIO_CODING_MODULE_ERROR, kTraceError, | 
| "SetRedPayloadType() RED registration in ACM module failed"); |