OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 25 matching lines...) Expand all Loading... | |
36 #include "webrtc/voice_engine/include/voe_external_media.h" | 36 #include "webrtc/voice_engine/include/voe_external_media.h" |
37 #include "webrtc/voice_engine/include/voe_rtp_rtcp.h" | 37 #include "webrtc/voice_engine/include/voe_rtp_rtcp.h" |
38 #include "webrtc/voice_engine/output_mixer.h" | 38 #include "webrtc/voice_engine/output_mixer.h" |
39 #include "webrtc/voice_engine/statistics.h" | 39 #include "webrtc/voice_engine/statistics.h" |
40 #include "webrtc/voice_engine/transmit_mixer.h" | 40 #include "webrtc/voice_engine/transmit_mixer.h" |
41 #include "webrtc/voice_engine/utility.h" | 41 #include "webrtc/voice_engine/utility.h" |
42 | 42 |
43 namespace webrtc { | 43 namespace webrtc { |
44 namespace voe { | 44 namespace voe { |
45 | 45 |
46 namespace { | |
47 | |
48 bool RegisterReceiveCodec(std::unique_ptr<AudioCodingModule>* acm, | |
49 acm2::RentACodec* rac, | |
50 const CodecInst& ci) { | |
51 const int result = | |
52 (*acm)->RegisterReceiveCodec(ci, [&] { return rac->RentIsacDecoder(); }); | |
53 return result == 0; | |
54 } | |
55 | |
56 } // namespace | |
57 | |
46 const int kTelephoneEventAttenuationdB = 10; | 58 const int kTelephoneEventAttenuationdB = 10; |
47 | 59 |
48 class TransportFeedbackProxy : public TransportFeedbackObserver { | 60 class TransportFeedbackProxy : public TransportFeedbackObserver { |
49 public: | 61 public: |
50 TransportFeedbackProxy() : feedback_observer_(nullptr) { | 62 TransportFeedbackProxy() : feedback_observer_(nullptr) { |
51 pacer_thread_.DetachFromThread(); | 63 pacer_thread_.DetachFromThread(); |
52 network_thread_.DetachFromThread(); | 64 network_thread_.DetachFromThread(); |
53 } | 65 } |
54 | 66 |
55 void SetTransportFeedbackObserver( | 67 void SetTransportFeedbackObserver( |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
384 receiveCodec.pltype = payloadType; | 396 receiveCodec.pltype = payloadType; |
385 receiveCodec.plfreq = frequency; | 397 receiveCodec.plfreq = frequency; |
386 receiveCodec.channels = channels; | 398 receiveCodec.channels = channels; |
387 receiveCodec.rate = rate; | 399 receiveCodec.rate = rate; |
388 strncpy(receiveCodec.plname, payloadName, RTP_PAYLOAD_NAME_SIZE - 1); | 400 strncpy(receiveCodec.plname, payloadName, RTP_PAYLOAD_NAME_SIZE - 1); |
389 | 401 |
390 audio_coding_->Codec(payloadName, &dummyCodec, frequency, channels); | 402 audio_coding_->Codec(payloadName, &dummyCodec, frequency, channels); |
391 receiveCodec.pacsize = dummyCodec.pacsize; | 403 receiveCodec.pacsize = dummyCodec.pacsize; |
392 | 404 |
393 // Register the new codec to the ACM | 405 // Register the new codec to the ACM |
394 if (audio_coding_->RegisterReceiveCodec(receiveCodec) == -1) { | 406 if (!RegisterReceiveCodec(&audio_coding_, &rent_a_codec_, receiveCodec)) { |
395 WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), | 407 WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), |
396 "Channel::OnInitializeDecoder() invalid codec (" | 408 "Channel::OnInitializeDecoder() invalid codec (" |
397 "pt=%d, name=%s) received - 1", | 409 "pt=%d, name=%s) received - 1", |
398 payloadType, payloadName); | 410 payloadType, payloadName); |
399 _engineStatisticsPtr->SetLastError(VE_AUDIO_CODING_MODULE_ERROR); | 411 _engineStatisticsPtr->SetLastError(VE_AUDIO_CODING_MODULE_ERROR); |
400 return -1; | 412 return -1; |
401 } | 413 } |
402 | 414 |
403 return 0; | 415 return 0; |
404 } | 416 } |
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
959 codec.rate); | 971 codec.rate); |
960 } | 972 } |
961 | 973 |
962 // Ensure that PCMU is used as default codec on the sending side | 974 // Ensure that PCMU is used as default codec on the sending side |
963 if (!STR_CASE_CMP(codec.plname, "PCMU") && (codec.channels == 1)) { | 975 if (!STR_CASE_CMP(codec.plname, "PCMU") && (codec.channels == 1)) { |
964 SetSendCodec(codec); | 976 SetSendCodec(codec); |
965 } | 977 } |
966 | 978 |
967 // Register default PT for outband 'telephone-event' | 979 // Register default PT for outband 'telephone-event' |
968 if (!STR_CASE_CMP(codec.plname, "telephone-event")) { | 980 if (!STR_CASE_CMP(codec.plname, "telephone-event")) { |
969 if ((_rtpRtcpModule->RegisterSendPayload(codec) == -1) || | 981 if (_rtpRtcpModule->RegisterSendPayload(codec) == -1 || |
970 (audio_coding_->RegisterReceiveCodec(codec) == -1)) { | 982 !RegisterReceiveCodec(&audio_coding_, &rent_a_codec_, codec)) { |
971 WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), | 983 WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), |
972 "Channel::Init() failed to register outband " | 984 "Channel::Init() failed to register outband " |
973 "'telephone-event' (%d/%d) correctly", | 985 "'telephone-event' (%d/%d) correctly", |
974 codec.pltype, codec.plfreq); | 986 codec.pltype, codec.plfreq); |
975 } | 987 } |
976 } | 988 } |
977 | 989 |
978 if (!STR_CASE_CMP(codec.plname, "CN")) { | 990 if (!STR_CASE_CMP(codec.plname, "CN")) { |
979 if ((audio_coding_->RegisterSendCodec(codec) == -1) || | 991 if (!codec_manager_.RegisterEncoder(codec) || |
980 (audio_coding_->RegisterReceiveCodec(codec) == -1) || | 992 !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get()) || |
981 (_rtpRtcpModule->RegisterSendPayload(codec) == -1)) { | 993 !RegisterReceiveCodec(&audio_coding_, &rent_a_codec_, codec) || |
994 _rtpRtcpModule->RegisterSendPayload(codec) == -1) { | |
982 WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), | 995 WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), |
983 "Channel::Init() failed to register CN (%d/%d) " | 996 "Channel::Init() failed to register CN (%d/%d) " |
984 "correctly - 1", | 997 "correctly - 1", |
985 codec.pltype, codec.plfreq); | 998 codec.pltype, codec.plfreq); |
986 } | 999 } |
987 } | 1000 } |
988 #ifdef WEBRTC_CODEC_RED | 1001 #ifdef WEBRTC_CODEC_RED |
989 // Register RED to the receiving side of the ACM. | 1002 // Register RED to the receiving side of the ACM. |
990 // We will not receive an OnInitializeDecoder() callback for RED. | 1003 // We will not receive an OnInitializeDecoder() callback for RED. |
991 if (!STR_CASE_CMP(codec.plname, "RED")) { | 1004 if (!STR_CASE_CMP(codec.plname, "RED")) { |
992 if (audio_coding_->RegisterReceiveCodec(codec) == -1) { | 1005 if (!RegisterReceiveCodec(&audio_coding_, &rent_a_codec_, codec)) { |
993 WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), | 1006 WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId), |
994 "Channel::Init() failed to register RED (%d/%d) " | 1007 "Channel::Init() failed to register RED (%d/%d) " |
995 "correctly", | 1008 "correctly", |
996 codec.pltype, codec.plfreq); | 1009 codec.pltype, codec.plfreq); |
997 } | 1010 } |
998 } | 1011 } |
999 #endif | 1012 #endif |
1000 } | 1013 } |
1001 | 1014 |
1002 if (rx_audioproc_->noise_suppression()->set_level(kDefaultNsMode) != 0) { | 1015 if (rx_audioproc_->noise_suppression()->set_level(kDefaultNsMode) != 0) { |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1188 _engineStatisticsPtr->SetLastError( | 1201 _engineStatisticsPtr->SetLastError( |
1189 VE_INVALID_OPERATION, kTraceWarning, | 1202 VE_INVALID_OPERATION, kTraceWarning, |
1190 "DeRegisterVoiceEngineObserver() observer already disabled"); | 1203 "DeRegisterVoiceEngineObserver() observer already disabled"); |
1191 return 0; | 1204 return 0; |
1192 } | 1205 } |
1193 _voiceEngineObserverPtr = NULL; | 1206 _voiceEngineObserverPtr = NULL; |
1194 return 0; | 1207 return 0; |
1195 } | 1208 } |
1196 | 1209 |
1197 int32_t Channel::GetSendCodec(CodecInst& codec) { | 1210 int32_t Channel::GetSendCodec(CodecInst& codec) { |
1198 auto send_codec = audio_coding_->SendCodec(); | 1211 auto send_codec = codec_manager_.GetCodecInst(); |
1199 if (send_codec) { | 1212 if (send_codec) { |
1200 codec = *send_codec; | 1213 codec = *send_codec; |
1201 return 0; | 1214 return 0; |
1202 } | 1215 } |
1203 return -1; | 1216 return -1; |
1204 } | 1217 } |
1205 | 1218 |
1206 int32_t Channel::GetRecCodec(CodecInst& codec) { | 1219 int32_t Channel::GetRecCodec(CodecInst& codec) { |
1207 return (audio_coding_->ReceiveCodec(&codec)); | 1220 return (audio_coding_->ReceiveCodec(&codec)); |
1208 } | 1221 } |
1209 | 1222 |
1210 int32_t Channel::SetSendCodec(const CodecInst& codec) { | 1223 int32_t Channel::SetSendCodec(const CodecInst& codec) { |
1211 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), | 1224 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
1212 "Channel::SetSendCodec()"); | 1225 "Channel::SetSendCodec()"); |
1213 | 1226 |
1214 if (audio_coding_->RegisterSendCodec(codec) != 0) { | 1227 if (!codec_manager_.RegisterEncoder(codec) || |
1228 !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) { | |
1215 WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId), | 1229 WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId), |
1216 "SetSendCodec() failed to register codec to ACM"); | 1230 "SetSendCodec() failed to register codec to ACM"); |
1217 return -1; | 1231 return -1; |
1218 } | 1232 } |
1219 | 1233 |
1220 if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) { | 1234 if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) { |
1221 _rtpRtcpModule->DeRegisterSendPayload(codec.pltype); | 1235 _rtpRtcpModule->DeRegisterSendPayload(codec.pltype); |
1222 if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) { | 1236 if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) { |
1223 WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId), | 1237 WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId), |
1224 "SetSendCodec() failed to register codec to" | 1238 "SetSendCodec() failed to register codec to" |
(...skipping 26 matching lines...) Expand all Loading... | |
1251 0) { | 1265 0) { |
1252 assert(false); // This should not happen. | 1266 assert(false); // This should not happen. |
1253 } | 1267 } |
1254 } | 1268 } |
1255 | 1269 |
1256 int32_t Channel::SetVADStatus(bool enableVAD, | 1270 int32_t Channel::SetVADStatus(bool enableVAD, |
1257 ACMVADMode mode, | 1271 ACMVADMode mode, |
1258 bool disableDTX) { | 1272 bool disableDTX) { |
1259 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), | 1273 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
1260 "Channel::SetVADStatus(mode=%d)", mode); | 1274 "Channel::SetVADStatus(mode=%d)", mode); |
1261 assert(!(disableDTX && enableVAD)); // disableDTX mode is deprecated. | 1275 RTC_DCHECK(!(disableDTX && enableVAD)); // disableDTX mode is deprecated. |
1262 // To disable VAD, DTX must be disabled too | 1276 if (!codec_manager_.SetVAD(enableVAD, mode) || |
1263 disableDTX = ((enableVAD == false) ? true : disableDTX); | 1277 !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) { |
1264 if (audio_coding_->SetVAD(!disableDTX, enableVAD, mode) != 0) { | |
1265 _engineStatisticsPtr->SetLastError(VE_AUDIO_CODING_MODULE_ERROR, | 1278 _engineStatisticsPtr->SetLastError(VE_AUDIO_CODING_MODULE_ERROR, |
1266 kTraceError, | 1279 kTraceError, |
1267 "SetVADStatus() failed to set VAD"); | 1280 "SetVADStatus() failed to set VAD"); |
1268 return -1; | 1281 return -1; |
1269 } | 1282 } |
1270 return 0; | 1283 return 0; |
1271 } | 1284 } |
1272 | 1285 |
1273 int32_t Channel::GetVADStatus(bool& enabledVAD, | 1286 int32_t Channel::GetVADStatus(bool& enabledVAD, |
1274 ACMVADMode& mode, | 1287 ACMVADMode& mode, |
1275 bool& disabledDTX) { | 1288 bool& disabledDTX) { |
1276 if (audio_coding_->VAD(&disabledDTX, &enabledVAD, &mode) != 0) { | 1289 const auto* params = codec_manager_.GetStackParams(); |
1277 _engineStatisticsPtr->SetLastError( | 1290 enabledVAD = params->use_cng; |
1278 VE_AUDIO_CODING_MODULE_ERROR, kTraceError, | 1291 mode = params->vad_mode; |
1279 "GetVADStatus() failed to get VAD status"); | 1292 disabledDTX = !params->use_cng; |
1280 return -1; | |
1281 } | |
1282 disabledDTX = !disabledDTX; | |
1283 return 0; | 1293 return 0; |
1284 } | 1294 } |
1285 | 1295 |
1286 int32_t Channel::SetRecPayloadType(const CodecInst& codec) { | 1296 int32_t Channel::SetRecPayloadType(const CodecInst& codec) { |
1287 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), | 1297 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
1288 "Channel::SetRecPayloadType()"); | 1298 "Channel::SetRecPayloadType()"); |
1289 | 1299 |
1290 if (channel_state_.Get().playing) { | 1300 if (channel_state_.Get().playing) { |
1291 _engineStatisticsPtr->SetLastError( | 1301 _engineStatisticsPtr->SetLastError( |
1292 VE_ALREADY_PLAYING, kTraceError, | 1302 VE_ALREADY_PLAYING, kTraceError, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1325 "SetRecPayloadType() ACM deregistration failed - 1"); | 1335 "SetRecPayloadType() ACM deregistration failed - 1"); |
1326 return -1; | 1336 return -1; |
1327 } | 1337 } |
1328 return 0; | 1338 return 0; |
1329 } | 1339 } |
1330 | 1340 |
1331 if (rtp_receiver_->RegisterReceivePayload( | 1341 if (rtp_receiver_->RegisterReceivePayload( |
1332 codec.plname, codec.pltype, codec.plfreq, codec.channels, | 1342 codec.plname, codec.pltype, codec.plfreq, codec.channels, |
1333 (codec.rate < 0) ? 0 : codec.rate) != 0) { | 1343 (codec.rate < 0) ? 0 : codec.rate) != 0) { |
1334 // First attempt to register failed => de-register and try again | 1344 // First attempt to register failed => de-register and try again |
1345 // TODO(kwiberg): Retrying is probably not necessary, since | |
1346 // AcmReceiver::AddCodec also retries. | |
1335 rtp_receiver_->DeRegisterReceivePayload(codec.pltype); | 1347 rtp_receiver_->DeRegisterReceivePayload(codec.pltype); |
1336 if (rtp_receiver_->RegisterReceivePayload( | 1348 if (rtp_receiver_->RegisterReceivePayload( |
1337 codec.plname, codec.pltype, codec.plfreq, codec.channels, | 1349 codec.plname, codec.pltype, codec.plfreq, codec.channels, |
1338 (codec.rate < 0) ? 0 : codec.rate) != 0) { | 1350 (codec.rate < 0) ? 0 : codec.rate) != 0) { |
1339 _engineStatisticsPtr->SetLastError( | 1351 _engineStatisticsPtr->SetLastError( |
1340 VE_RTP_RTCP_MODULE_ERROR, kTraceError, | 1352 VE_RTP_RTCP_MODULE_ERROR, kTraceError, |
1341 "SetRecPayloadType() RTP/RTCP-module registration failed"); | 1353 "SetRecPayloadType() RTP/RTCP-module registration failed"); |
1342 return -1; | 1354 return -1; |
1343 } | 1355 } |
1344 } | 1356 } |
1345 if (audio_coding_->RegisterReceiveCodec(codec) != 0) { | 1357 if (!RegisterReceiveCodec(&audio_coding_, &rent_a_codec_, codec)) { |
1346 audio_coding_->UnregisterReceiveCodec(codec.pltype); | 1358 audio_coding_->UnregisterReceiveCodec(codec.pltype); |
1347 if (audio_coding_->RegisterReceiveCodec(codec) != 0) { | 1359 if (!RegisterReceiveCodec(&audio_coding_, &rent_a_codec_, codec)) { |
1348 _engineStatisticsPtr->SetLastError( | 1360 _engineStatisticsPtr->SetLastError( |
1349 VE_AUDIO_CODING_MODULE_ERROR, kTraceError, | 1361 VE_AUDIO_CODING_MODULE_ERROR, kTraceError, |
1350 "SetRecPayloadType() ACM registration failed - 1"); | 1362 "SetRecPayloadType() ACM registration failed - 1"); |
1351 return -1; | 1363 return -1; |
1352 } | 1364 } |
1353 } | 1365 } |
1354 return 0; | 1366 return 0; |
1355 } | 1367 } |
1356 | 1368 |
1357 int32_t Channel::GetRecPayloadType(CodecInst& codec) { | 1369 int32_t Channel::GetRecPayloadType(CodecInst& codec) { |
(...skipping 26 matching lines...) Expand all Loading... | |
1384 _engineStatisticsPtr->SetLastError( | 1396 _engineStatisticsPtr->SetLastError( |
1385 VE_AUDIO_CODING_MODULE_ERROR, kTraceError, | 1397 VE_AUDIO_CODING_MODULE_ERROR, kTraceError, |
1386 "SetSendCNPayloadType() failed to retrieve default CN codec " | 1398 "SetSendCNPayloadType() failed to retrieve default CN codec " |
1387 "settings"); | 1399 "settings"); |
1388 return -1; | 1400 return -1; |
1389 } | 1401 } |
1390 | 1402 |
1391 // Modify the payload type (must be set to dynamic range) | 1403 // Modify the payload type (must be set to dynamic range) |
1392 codec.pltype = type; | 1404 codec.pltype = type; |
1393 | 1405 |
1394 if (audio_coding_->RegisterSendCodec(codec) != 0) { | 1406 if (!codec_manager_.RegisterEncoder(codec) || |
1407 !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) { | |
1395 _engineStatisticsPtr->SetLastError( | 1408 _engineStatisticsPtr->SetLastError( |
1396 VE_AUDIO_CODING_MODULE_ERROR, kTraceError, | 1409 VE_AUDIO_CODING_MODULE_ERROR, kTraceError, |
1397 "SetSendCNPayloadType() failed to register CN to ACM"); | 1410 "SetSendCNPayloadType() failed to register CN to ACM"); |
1398 return -1; | 1411 return -1; |
1399 } | 1412 } |
1400 | 1413 |
1401 if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) { | 1414 if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) { |
1402 _rtpRtcpModule->DeRegisterSendPayload(codec.pltype); | 1415 _rtpRtcpModule->DeRegisterSendPayload(codec.pltype); |
1403 if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) { | 1416 if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) { |
1404 _engineStatisticsPtr->SetLastError( | 1417 _engineStatisticsPtr->SetLastError( |
(...skipping 1442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2847 } | 2860 } |
2848 | 2861 |
2849 if (SetRedPayloadType(redPayloadtype) < 0) { | 2862 if (SetRedPayloadType(redPayloadtype) < 0) { |
2850 _engineStatisticsPtr->SetLastError( | 2863 _engineStatisticsPtr->SetLastError( |
2851 VE_CODEC_ERROR, kTraceError, | 2864 VE_CODEC_ERROR, kTraceError, |
2852 "SetSecondarySendCodec() Failed to register RED ACM"); | 2865 "SetSecondarySendCodec() Failed to register RED ACM"); |
2853 return -1; | 2866 return -1; |
2854 } | 2867 } |
2855 } | 2868 } |
2856 | 2869 |
2857 if (audio_coding_->SetREDStatus(enable) != 0) { | 2870 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
| |
2871 !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) { | |
2858 _engineStatisticsPtr->SetLastError( | 2872 _engineStatisticsPtr->SetLastError( |
2859 VE_AUDIO_CODING_MODULE_ERROR, kTraceError, | 2873 VE_AUDIO_CODING_MODULE_ERROR, kTraceError, |
2860 "SetREDStatus() failed to set RED state in the ACM"); | 2874 "SetREDStatus() failed to set RED state in the ACM"); |
2861 return -1; | 2875 return -1; |
2862 } | 2876 } |
2863 return 0; | 2877 return 0; |
2864 } | 2878 } |
2865 | 2879 |
2866 int Channel::GetREDStatus(bool& enabled, int& redPayloadtype) { | 2880 int Channel::GetREDStatus(bool& enabled, int& redPayloadtype) { |
2867 enabled = audio_coding_->REDStatus(); | 2881 enabled = codec_manager_.GetStackParams()->use_red; |
2868 if (enabled) { | 2882 if (enabled) { |
2869 int8_t payloadType = 0; | 2883 int8_t payloadType = 0; |
2870 if (_rtpRtcpModule->SendREDPayloadType(&payloadType) != 0) { | 2884 if (_rtpRtcpModule->SendREDPayloadType(&payloadType) != 0) { |
2871 _engineStatisticsPtr->SetLastError( | 2885 _engineStatisticsPtr->SetLastError( |
2872 VE_RTP_RTCP_MODULE_ERROR, kTraceError, | 2886 VE_RTP_RTCP_MODULE_ERROR, kTraceError, |
2873 "GetREDStatus() failed to retrieve RED PT from RTP/RTCP " | 2887 "GetREDStatus() failed to retrieve RED PT from RTP/RTCP " |
2874 "module"); | 2888 "module"); |
2875 return -1; | 2889 return -1; |
2876 } | 2890 } |
2877 redPayloadtype = payloadType; | 2891 redPayloadtype = payloadType; |
2878 return 0; | 2892 return 0; |
2879 } | 2893 } |
2880 return 0; | 2894 return 0; |
2881 } | 2895 } |
2882 | 2896 |
2883 int Channel::SetCodecFECStatus(bool enable) { | 2897 int Channel::SetCodecFECStatus(bool enable) { |
2884 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), | 2898 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
2885 "Channel::SetCodecFECStatus()"); | 2899 "Channel::SetCodecFECStatus()"); |
2886 | 2900 |
2887 if (audio_coding_->SetCodecFEC(enable) != 0) { | 2901 if (!codec_manager_.SetCodecFEC(enable) || |
2902 !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) { | |
2888 _engineStatisticsPtr->SetLastError( | 2903 _engineStatisticsPtr->SetLastError( |
2889 VE_AUDIO_CODING_MODULE_ERROR, kTraceError, | 2904 VE_AUDIO_CODING_MODULE_ERROR, kTraceError, |
2890 "SetCodecFECStatus() failed to set FEC state"); | 2905 "SetCodecFECStatus() failed to set FEC state"); |
2891 return -1; | 2906 return -1; |
2892 } | 2907 } |
2893 return 0; | 2908 return 0; |
2894 } | 2909 } |
2895 | 2910 |
2896 bool Channel::GetCodecFECStatus() { | 2911 bool Channel::GetCodecFECStatus() { |
2897 bool enabled = audio_coding_->CodecFEC(); | 2912 return codec_manager_.GetStackParams()->use_codec_fec; |
2898 return enabled; | |
2899 } | 2913 } |
2900 | 2914 |
2901 void Channel::SetNACKStatus(bool enable, int maxNumberOfPackets) { | 2915 void Channel::SetNACKStatus(bool enable, int maxNumberOfPackets) { |
2902 // None of these functions can fail. | 2916 // None of these functions can fail. |
2903 // If pacing is enabled we always store packets. | 2917 // If pacing is enabled we always store packets. |
2904 if (!pacing_enabled_) | 2918 if (!pacing_enabled_) |
2905 _rtpRtcpModule->SetStorePacketsStatus(enable, maxNumberOfPackets); | 2919 _rtpRtcpModule->SetStorePacketsStatus(enable, maxNumberOfPackets); |
2906 rtp_receive_statistics_->SetMaxReorderingThreshold(maxNumberOfPackets); | 2920 rtp_receive_statistics_->SetMaxReorderingThreshold(maxNumberOfPackets); |
2907 rtp_receiver_->SetNACKStatus(enable ? kNackRtcp : kNackOff); | 2921 rtp_receiver_->SetNACKStatus(enable ? kNackRtcp : kNackOff); |
2908 if (enable) | 2922 if (enable) |
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3429 } | 3443 } |
3430 | 3444 |
3431 if (!found_red) { | 3445 if (!found_red) { |
3432 _engineStatisticsPtr->SetLastError( | 3446 _engineStatisticsPtr->SetLastError( |
3433 VE_CODEC_ERROR, kTraceError, | 3447 VE_CODEC_ERROR, kTraceError, |
3434 "SetRedPayloadType() RED is not supported"); | 3448 "SetRedPayloadType() RED is not supported"); |
3435 return -1; | 3449 return -1; |
3436 } | 3450 } |
3437 | 3451 |
3438 codec.pltype = red_payload_type; | 3452 codec.pltype = red_payload_type; |
3439 if (audio_coding_->RegisterSendCodec(codec) < 0) { | 3453 if (!codec_manager_.RegisterEncoder(codec) || |
3454 !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) { | |
3440 _engineStatisticsPtr->SetLastError( | 3455 _engineStatisticsPtr->SetLastError( |
3441 VE_AUDIO_CODING_MODULE_ERROR, kTraceError, | 3456 VE_AUDIO_CODING_MODULE_ERROR, kTraceError, |
3442 "SetRedPayloadType() RED registration in ACM module failed"); | 3457 "SetRedPayloadType() RED registration in ACM module failed"); |
3443 return -1; | 3458 return -1; |
3444 } | 3459 } |
3445 | 3460 |
3446 if (_rtpRtcpModule->SetSendREDPayloadType(red_payload_type) != 0) { | 3461 if (_rtpRtcpModule->SetSendREDPayloadType(red_payload_type) != 0) { |
3447 _engineStatisticsPtr->SetLastError( | 3462 _engineStatisticsPtr->SetLastError( |
3448 VE_RTP_RTCP_MODULE_ERROR, kTraceError, | 3463 VE_RTP_RTCP_MODULE_ERROR, kTraceError, |
3449 "SetRedPayloadType() RED registration in RTP/RTCP module failed"); | 3464 "SetRedPayloadType() RED registration in RTP/RTCP module failed"); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3528 int64_t min_rtt = 0; | 3543 int64_t min_rtt = 0; |
3529 if (_rtpRtcpModule->RTT(remoteSSRC, &rtt, &avg_rtt, &min_rtt, &max_rtt) != | 3544 if (_rtpRtcpModule->RTT(remoteSSRC, &rtt, &avg_rtt, &min_rtt, &max_rtt) != |
3530 0) { | 3545 0) { |
3531 return 0; | 3546 return 0; |
3532 } | 3547 } |
3533 return rtt; | 3548 return rtt; |
3534 } | 3549 } |
3535 | 3550 |
3536 } // namespace voe | 3551 } // namespace voe |
3537 } // namespace webrtc | 3552 } // namespace webrtc |
OLD | NEW |