| 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) ||
|
| + !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");
|
|
|