Index: webrtc/media/engine/webrtcvoiceengine.cc |
diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc |
index 7b3e0ef8379194e0fb7d8017bf3592fdd4680952..a4a5e130d51cddfd0887fe65730a10be48ebc75f 100644 |
--- a/webrtc/media/engine/webrtcvoiceengine.cc |
+++ b/webrtc/media/engine/webrtcvoiceengine.cc |
@@ -61,9 +61,6 @@ const int kDefaultAudioDeviceId = -1; |
const int kDefaultAudioDeviceId = 0; |
#endif |
-// Parameter used for NACK. |
-// This value is equivalent to 5 seconds of audio data at 20 ms per packet. |
-const int kNackMaxPackets = 250; |
constexpr int kNackRtpHistoryMs = 5000; |
// Codec parameters for Opus. |
@@ -1267,6 +1264,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { |
uint32_t remote_ssrc, |
uint32_t local_ssrc, |
bool use_transport_cc, |
+ bool use_nack, |
const std::string& sync_group, |
const std::vector<webrtc::RtpExtension>& extensions, |
webrtc::Call* call, |
@@ -1281,7 +1279,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { |
config_.voe_channel_id = ch; |
config_.sync_group = sync_group; |
config_.decoder_factory = decoder_factory; |
- RecreateAudioReceiveStream(use_transport_cc, extensions); |
+ RecreateAudioReceiveStream(use_transport_cc, use_nack, extensions); |
} |
~WebRtcAudioReceiveStream() { |
@@ -1292,11 +1290,16 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { |
void RecreateAudioReceiveStream( |
const std::vector<webrtc::RtpExtension>& extensions) { |
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
- RecreateAudioReceiveStream(config_.rtp.transport_cc, extensions); |
+ RecreateAudioReceiveStream(config_.rtp.transport_cc, |
+ config_.rtp.nack.rtp_history_ms != 0, |
+ extensions); |
} |
- void RecreateAudioReceiveStream(bool use_transport_cc) { |
+ |
+ void RecreateAudioReceiveStream(bool use_transport_cc, bool use_nack) { |
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
- RecreateAudioReceiveStream(use_transport_cc, config_.rtp.extensions); |
+ RecreateAudioReceiveStream(use_transport_cc, |
+ use_nack, |
+ config_.rtp.extensions); |
} |
webrtc::AudioReceiveStream::Stats GetStats() const { |
@@ -1318,14 +1321,16 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { |
private: |
void RecreateAudioReceiveStream( |
bool use_transport_cc, |
+ bool use_nack, |
const std::vector<webrtc::RtpExtension>& extensions) { |
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
if (stream_) { |
call_->DestroyAudioReceiveStream(stream_); |
stream_ = nullptr; |
} |
- config_.rtp.extensions = extensions; |
config_.rtp.transport_cc = use_transport_cc; |
+ config_.rtp.nack.rtp_history_ms = use_nack ? kNackRtpHistoryMs : 0; |
+ config_.rtp.extensions = extensions; |
RTC_DCHECK(!stream_); |
stream_ = call_->CreateAudioReceiveStream(config_); |
RTC_CHECK(stream_); |
@@ -1730,19 +1735,17 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs( |
} |
} |
- // Set nack status on receive channels. |
- for (const auto& kv : recv_streams_) { |
- SetNack(kv.second->channel(), send_codec_spec_.nack_enabled); |
- } |
- |
- // Check if the transport cc feedback has changed on the preferred send codec, |
- // and in that case reconfigure all receive streams. |
- if (recv_transport_cc_enabled_ != send_codec_spec_.transport_cc_enabled) { |
+ // Check if the transport cc feedback or NACK status has changed on the |
+ // preferred send codec, and in that case reconfigure all receive streams. |
+ if (recv_transport_cc_enabled_ != send_codec_spec_.transport_cc_enabled || |
+ recv_nack_enabled_ != send_codec_spec_.nack_enabled) { |
LOG(LS_INFO) << "Recreate all the receive streams because the send " |
"codec has changed."; |
recv_transport_cc_enabled_ = send_codec_spec_.transport_cc_enabled; |
+ recv_nack_enabled_ = send_codec_spec_.nack_enabled; |
for (auto& kv : recv_streams_) { |
- kv.second->RecreateAudioReceiveStream(recv_transport_cc_enabled_); |
+ kv.second->RecreateAudioReceiveStream(recv_transport_cc_enabled_, |
+ recv_nack_enabled_); |
} |
} |
@@ -1856,16 +1859,6 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs( |
return true; |
} |
-void WebRtcVoiceMediaChannel::SetNack(int channel, bool nack_enabled) { |
- if (nack_enabled) { |
- LOG(LS_INFO) << "Enabling NACK for channel " << channel; |
- engine()->voe()->rtp()->SetNACKStatus(channel, true, kNackMaxPackets); |
- } else { |
- LOG(LS_INFO) << "Disabling NACK for channel " << channel; |
- engine()->voe()->rtp()->SetNACKStatus(channel, false, 0); |
- } |
-} |
- |
bool WebRtcVoiceMediaChannel::SetSendCodec( |
int channel, const webrtc::CodecInst& send_codec) { |
LOG(LS_INFO) << "Send channel " << channel << " selected voice codec " |
@@ -2137,11 +2130,10 @@ bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) { |
recv_streams_.insert(std::make_pair( |
ssrc, new WebRtcAudioReceiveStream(channel, ssrc, receiver_reports_ssrc_, |
recv_transport_cc_enabled_, |
+ recv_nack_enabled_, |
sp.sync_label, recv_rtp_extensions_, |
call_, this, |
engine()->decoder_factory_))); |
- |
- SetNack(channel, send_codec_spec_.nack_enabled); |
SetPlayout(channel, playout_); |
return true; |