Index: webrtc/audio/audio_send_stream.cc |
diff --git a/webrtc/audio/audio_send_stream.cc b/webrtc/audio/audio_send_stream.cc |
index 28541ca62dc0290e0b27bef73e323f3928939c1b..d413a962b70dcbc9c36c81b0035b3ada98d87fa1 100644 |
--- a/webrtc/audio/audio_send_stream.cc |
+++ b/webrtc/audio/audio_send_stream.cc |
@@ -28,7 +28,7 @@ |
#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" |
#include "webrtc/modules/congestion_controller/include/send_side_congestion_controller.h" |
#include "webrtc/modules/pacing/paced_sender.h" |
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
+#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" |
#include "webrtc/voice_engine/channel_proxy.h" |
#include "webrtc/voice_engine/include/voe_base.h" |
#include "webrtc/voice_engine/transmit_mixer.h" |
@@ -421,6 +421,10 @@ bool AudioSendStream::SetupSendCodec(AudioSendStream* stream, |
cng_config.speech_encoder = std::move(encoder); |
cng_config.vad_mode = Vad::kVadNormal; |
encoder.reset(new AudioEncoderCng(std::move(cng_config))); |
+ |
+ stream->RegisterCngPayloadType( |
+ *spec.cng_payload_type, |
+ new_config.send_codec_spec->format.clockrate_hz); |
} |
stream->channel_proxy_->SetEncoder(new_config.send_codec_spec->payload_type, |
@@ -498,6 +502,14 @@ void AudioSendStream::ReconfigureCNG(AudioSendStream* stream, |
return; |
} |
+ // Register the CNG payload type if it's been added, don't do anything if CNG |
+ // is removed. Payload types must not be redefined. |
+ if (new_config.send_codec_spec->cng_payload_type) { |
+ stream->RegisterCngPayloadType( |
+ *new_config.send_codec_spec->cng_payload_type, |
+ new_config.send_codec_spec->format.clockrate_hz); |
+ } |
+ |
// Wrap or unwrap the encoder in an AudioEncoderCNG. |
stream->channel_proxy_->ModifyEncoder( |
[&](std::unique_ptr<AudioEncoder>* encoder_ptr) { |
@@ -572,5 +584,21 @@ void AudioSendStream::RemoveBitrateObserver() { |
thread_sync_event.Wait(rtc::Event::kForever); |
} |
+void AudioSendStream::RegisterCngPayloadType(int payload_type, |
+ int clockrate_hz) { |
+ RtpRtcp* rtpRtcpModule = nullptr; |
+ RtpReceiver* rtpReceiver = nullptr; // Unused, but required for call. |
+ channel_proxy_->GetRtpRtcp(&rtpRtcpModule, &rtpReceiver); |
+ const CodecInst codec = {payload_type, "CN", clockrate_hz, 0, 1, 0}; |
+ if (rtpRtcpModule->RegisterSendPayload(codec) != 0) { |
+ rtpRtcpModule->DeRegisterSendPayload(codec.pltype); |
+ if (rtpRtcpModule->RegisterSendPayload(codec) != 0) { |
+ LOG(LS_ERROR) << "RegisterCngPayloadType() failed to register CN to " |
+ "RTP/RTCP module"; |
+ } |
+ } |
+} |
+ |
+ |
} // namespace internal |
} // namespace webrtc |