Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(706)

Unified Diff: webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc

Issue 2960363002: Implement RTP keepalive in native stack. (Closed)
Patch Set: More testing Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
index a6c7647be5e9e3b0d301b450425ecffd7a451dac..22efb4e5f428d19d85bc59c06758adbd76157b9d 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
@@ -12,6 +12,7 @@
#include <string.h>
+#include <algorithm>
#include <set>
#include <string>
@@ -26,6 +27,11 @@
#endif
namespace webrtc {
+namespace {
+const int64_t kRtpRtcpMaxIdleTimeProcessMs = 5;
+const int64_t kRtpRtcpRttProcessTimeMs = 1000;
+const int64_t kRtpRtcpBitrateProcessTimeMs = 10;
+} // namespace
RTPExtensionType StringToRtpExtensionType(const std::string& extension) {
if (extension == RtpExtension::kTimestampOffsetUri)
@@ -89,9 +95,13 @@ ModuleRtpRtcpImpl::ModuleRtpRtcpImpl(const Configuration& configuration)
this),
clock_(configuration.clock),
audio_(configuration.audio),
- last_process_time_(configuration.clock->TimeInMilliseconds()),
- last_bitrate_process_time_(configuration.clock->TimeInMilliseconds()),
- last_rtt_process_time_(configuration.clock->TimeInMilliseconds()),
+ keepalive_config_(configuration.keepalive_config),
+ last_process_time_(clock_->TimeInMilliseconds()),
+ last_bitrate_process_time_(clock_->TimeInMilliseconds()),
+ last_rtt_process_time_(clock_->TimeInMilliseconds()),
+ next_process_time_(clock_->TimeInMilliseconds() +
+ kRtpRtcpMaxIdleTimeProcessMs),
+ next_keepalive_time_(-1),
packet_overhead_(28), // IPV4 UDP.
nack_last_time_sent_full_(0),
nack_last_time_sent_full_prev_(0),
@@ -118,6 +128,11 @@ ModuleRtpRtcpImpl::ModuleRtpRtcpImpl(const Configuration& configuration)
configuration.overhead_observer));
// Make sure rtcp sender use same timestamp offset as rtp sender.
rtcp_sender_.SetTimestampOffset(rtp_sender_->TimestampOffset());
+
+ if (keepalive_config_.timeout_interval_ms != -1) {
+ next_keepalive_time_ =
+ clock_->TimeInMilliseconds() + keepalive_config_.timeout_interval_ms;
+ }
}
// Set default packet size limit.
@@ -130,24 +145,37 @@ ModuleRtpRtcpImpl::ModuleRtpRtcpImpl(const Configuration& configuration)
// Returns the number of milliseconds until the module want a worker thread
// to call Process.
int64_t ModuleRtpRtcpImpl::TimeUntilNextProcess() {
- const int64_t now = clock_->TimeInMilliseconds();
- const int64_t kRtpRtcpMaxIdleTimeProcessMs = 5;
- return kRtpRtcpMaxIdleTimeProcessMs - (now - last_process_time_);
+ return std::max<int64_t>(0,
+ next_process_time_ - clock_->TimeInMilliseconds());
}
// Process any pending tasks such as timeouts (non time critical events).
void ModuleRtpRtcpImpl::Process() {
const int64_t now = clock_->TimeInMilliseconds();
last_process_time_ = now;
åsapersson 2017/06/30 15:09:13 is last_process_time_ still needed?
sprang_webrtc 2017/06/30 16:20:59 No, cleaned up.
+ next_process_time_ = last_process_time_ + kRtpRtcpMaxIdleTimeProcessMs;
if (rtp_sender_) {
- const int64_t kRtpRtcpBitrateProcessTimeMs = 10;
if (now >= last_bitrate_process_time_ + kRtpRtcpBitrateProcessTimeMs) {
rtp_sender_->ProcessBitrate();
last_bitrate_process_time_ = now;
+ next_process_time_ =
+ std::min(next_process_time_, now + kRtpRtcpBitrateProcessTimeMs);
+ }
+ if (keepalive_config_.timeout_interval_ms > 0 &&
+ now >= next_keepalive_time_) {
+ int64_t last_send_time_ms = rtp_sender_->LastTimestampTimeMs();
åsapersson 2017/06/30 15:09:13 check if last_send_time_ms is set?
sprang_webrtc 2017/06/30 16:20:59 There's no need, since if it's not set it will ret
+ if (now >= last_send_time_ms + keepalive_config_.timeout_interval_ms) {
+ rtp_sender_->SendKeepAlive(keepalive_config_.payload_type);
+ next_keepalive_time_ = now + keepalive_config_.timeout_interval_ms;
+ } else {
+ next_keepalive_time_ =
+ last_send_time_ms + keepalive_config_.timeout_interval_ms;
+ }
+ next_process_time_ = std::min(next_process_time_, next_keepalive_time_);
}
}
- const int64_t kRtpRtcpRttProcessTimeMs = 1000;
+
bool process_rtt = now >= last_rtt_process_time_ + kRtpRtcpRttProcessTimeMs;
if (rtcp_sender_.Sending()) {
// Process RTT if we have received a receiver report and we haven't
@@ -201,6 +229,8 @@ void ModuleRtpRtcpImpl::Process() {
// Get processed rtt.
if (process_rtt) {
last_rtt_process_time_ = now;
+ next_process_time_ = std::min(
+ next_process_time_, last_rtt_process_time_ + kRtpRtcpRttProcessTimeMs);
if (rtt_stats_) {
// Make sure we have a valid RTT before setting.
int64_t last_rtt = rtt_stats_->LastProcessedRtt();

Powered by Google App Engine
This is Rietveld 408576698