Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/cast/rtcp/rtcp.h" | 5 #include "media/cast/rtcp/rtcp.h" |
| 6 | 6 |
| 7 #include "base/big_endian.h" | 7 #include "base/big_endian.h" |
| 8 #include "base/rand_util.h" | 8 #include "base/rand_util.h" |
| 9 #include "media/cast/cast_config.h" | 9 #include "media/cast/cast_config.h" |
| 10 #include "media/cast/cast_defines.h" | 10 #include "media/cast/cast_defines.h" |
| 11 #include "media/cast/cast_environment.h" | 11 #include "media/cast/cast_environment.h" |
| 12 #include "media/cast/rtcp/rtcp_defines.h" | 12 #include "media/cast/rtcp/rtcp_defines.h" |
| 13 #include "media/cast/rtcp/rtcp_receiver.h" | 13 #include "media/cast/rtcp/rtcp_receiver.h" |
| 14 #include "media/cast/rtcp/rtcp_sender.h" | 14 #include "media/cast/rtcp/rtcp_sender.h" |
| 15 #include "media/cast/rtcp/rtcp_utility.h" | 15 #include "media/cast/rtcp/rtcp_utility.h" |
| 16 #include "media/cast/transport/cast_transport_defines.h" | 16 #include "media/cast/transport/cast_transport_defines.h" |
| 17 | 17 |
| 18 namespace media { | 18 namespace media { |
| 19 namespace cast { | 19 namespace cast { |
| 20 | 20 |
| 21 static const int kMaxRttMs = 10000; // 10 seconds. | 21 static const int kMaxRttMs = 10000; // 10 seconds. |
| 22 static const uint16 kMaxDelay = 2000; | 22 static const int kMaxDelay = 2000; |
| 23 | |
| 24 // Time limit for received RTCP messages when we stop using it for lip-sync. | |
| 25 static const int64 kMaxDiffSinceReceivedRtcpMs = 100000; // 100 seconds. | |
| 26 | 23 |
| 27 class LocalRtcpRttFeedback : public RtcpRttFeedback { | 24 class LocalRtcpRttFeedback : public RtcpRttFeedback { |
| 28 public: | 25 public: |
| 29 explicit LocalRtcpRttFeedback(Rtcp* rtcp) : rtcp_(rtcp) {} | 26 explicit LocalRtcpRttFeedback(Rtcp* rtcp) : rtcp_(rtcp) {} |
| 30 | 27 |
| 31 virtual void OnReceivedDelaySinceLastReport( | 28 virtual void OnReceivedDelaySinceLastReport( |
| 32 uint32 receivers_ssrc, uint32 last_report, | 29 uint32 receivers_ssrc, uint32 last_report, |
| 33 uint32 delay_since_last_report) OVERRIDE { | 30 uint32 delay_since_last_report) OVERRIDE { |
| 34 rtcp_->OnReceivedDelaySinceLastReport(receivers_ssrc, last_report, | 31 rtcp_->OnReceivedDelaySinceLastReport(receivers_ssrc, last_report, |
| 35 delay_since_last_report); | 32 delay_since_last_report); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 123 rtcp_interval_(rtcp_interval), | 120 rtcp_interval_(rtcp_interval), |
| 124 rtcp_mode_(rtcp_mode), | 121 rtcp_mode_(rtcp_mode), |
| 125 local_ssrc_(local_ssrc), | 122 local_ssrc_(local_ssrc), |
| 126 remote_ssrc_(remote_ssrc), | 123 remote_ssrc_(remote_ssrc), |
| 127 c_name_(c_name), | 124 c_name_(c_name), |
| 128 rtp_receiver_statistics_(rtp_receiver_statistics), | 125 rtp_receiver_statistics_(rtp_receiver_statistics), |
| 129 rtt_feedback_(new LocalRtcpRttFeedback(this)), | 126 rtt_feedback_(new LocalRtcpRttFeedback(this)), |
| 130 receiver_feedback_(new LocalRtcpReceiverFeedback(this, cast_environment)), | 127 receiver_feedback_(new LocalRtcpReceiverFeedback(this, cast_environment)), |
| 131 rtcp_sender_(new RtcpSender(cast_environment, paced_packet_sender, | 128 rtcp_sender_(new RtcpSender(cast_environment, paced_packet_sender, |
| 132 local_ssrc, c_name)), | 129 local_ssrc, c_name)), |
| 133 last_report_received_(0), | 130 last_report_ntp_time_(0), |
| 134 last_received_rtp_timestamp_(0), | 131 lip_sync_rtp_timestamp_(0), |
| 135 last_received_ntp_seconds_(0), | |
| 136 last_received_ntp_fraction_(0), | |
| 137 min_rtt_(base::TimeDelta::FromMilliseconds(kMaxRttMs)), | 132 min_rtt_(base::TimeDelta::FromMilliseconds(kMaxRttMs)), |
| 138 number_of_rtt_in_avg_(0), | 133 number_of_rtt_in_avg_(0), |
| 139 is_audio_(is_audio) { | 134 is_audio_(is_audio) { |
| 140 rtcp_receiver_.reset(new RtcpReceiver(cast_environment, sender_feedback, | 135 rtcp_receiver_.reset(new RtcpReceiver(cast_environment, sender_feedback, |
| 141 receiver_feedback_.get(), | 136 receiver_feedback_.get(), |
| 142 rtt_feedback_.get(), local_ssrc)); | 137 rtt_feedback_.get(), local_ssrc)); |
| 143 rtcp_receiver_->SetRemoteSSRC(remote_ssrc); | 138 rtcp_receiver_->SetRemoteSSRC(remote_ssrc); |
| 144 } | 139 } |
| 145 | 140 |
| 146 Rtcp::~Rtcp() {} | 141 Rtcp::~Rtcp() {} |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 212 packet_type_flags |= transport::kRtcpRr; | 207 packet_type_flags |= transport::kRtcpRr; |
| 213 | 208 |
| 214 report_block.remote_ssrc = 0; // Not needed to set send side. | 209 report_block.remote_ssrc = 0; // Not needed to set send side. |
| 215 report_block.media_ssrc = remote_ssrc_; // SSRC of the RTP packet sender. | 210 report_block.media_ssrc = remote_ssrc_; // SSRC of the RTP packet sender. |
| 216 if (rtp_receiver_statistics_) { | 211 if (rtp_receiver_statistics_) { |
| 217 rtp_receiver_statistics_->GetStatistics( | 212 rtp_receiver_statistics_->GetStatistics( |
| 218 &report_block.fraction_lost, &report_block.cumulative_lost, | 213 &report_block.fraction_lost, &report_block.cumulative_lost, |
| 219 &report_block.extended_high_sequence_number, &report_block.jitter); | 214 &report_block.extended_high_sequence_number, &report_block.jitter); |
| 220 } | 215 } |
| 221 | 216 |
| 222 report_block.last_sr = last_report_received_; | 217 report_block.last_sr = GetTruncatedLastNtpReportTime(); |
| 223 if (!time_last_report_received_.is_null()) { | 218 if (!time_last_report_received_.is_null()) { |
| 224 uint32 delay_seconds = 0; | 219 uint32 delay_seconds = 0; |
| 225 uint32 delay_fraction = 0; | 220 uint32 delay_fraction = 0; |
| 226 base::TimeDelta delta = now - time_last_report_received_; | 221 base::TimeDelta delta = now - time_last_report_received_; |
| 227 ConvertTimeToFractions(delta.InMicroseconds(), &delay_seconds, | 222 ConvertTimeToFractions(delta.InMicroseconds(), &delay_seconds, |
| 228 &delay_fraction); | 223 &delay_fraction); |
| 229 report_block.delay_since_last_sr = | 224 report_block.delay_since_last_sr = |
| 230 ConvertToNtpDiff(delay_seconds, delay_fraction); | 225 ConvertToNtpDiff(delay_seconds, delay_fraction); |
| 231 } else { | 226 } else { |
| 232 report_block.delay_since_last_sr = 0; | 227 report_block.delay_since_last_sr = 0; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 250 | 245 |
| 251 if (sender_log_message.size()) { | 246 if (sender_log_message.size()) { |
| 252 packet_type_flags |= transport::kRtcpSenderLog; | 247 packet_type_flags |= transport::kRtcpSenderLog; |
| 253 } | 248 } |
| 254 | 249 |
| 255 SaveLastSentNtpTime(now, sender_info.ntp_seconds, sender_info.ntp_fraction); | 250 SaveLastSentNtpTime(now, sender_info.ntp_seconds, sender_info.ntp_fraction); |
| 256 | 251 |
| 257 transport::RtcpDlrrReportBlock dlrr; | 252 transport::RtcpDlrrReportBlock dlrr; |
| 258 if (!time_last_report_received_.is_null()) { | 253 if (!time_last_report_received_.is_null()) { |
| 259 packet_type_flags |= transport::kRtcpDlrr; | 254 packet_type_flags |= transport::kRtcpDlrr; |
| 260 dlrr.last_rr = last_report_received_; | 255 dlrr.last_rr = GetTruncatedLastNtpReportTime(); |
| 261 uint32 delay_seconds = 0; | 256 uint32 delay_seconds = 0; |
| 262 uint32 delay_fraction = 0; | 257 uint32 delay_fraction = 0; |
| 263 base::TimeDelta delta = now - time_last_report_received_; | 258 base::TimeDelta delta = now - time_last_report_received_; |
| 264 ConvertTimeToFractions(delta.InMicroseconds(), &delay_seconds, | 259 ConvertTimeToFractions(delta.InMicroseconds(), &delay_seconds, |
| 265 &delay_fraction); | 260 &delay_fraction); |
| 266 | 261 |
| 267 dlrr.delay_since_last_rr = ConvertToNtpDiff(delay_seconds, delay_fraction); | 262 dlrr.delay_since_last_rr = ConvertToNtpDiff(delay_seconds, delay_fraction); |
| 268 } | 263 } |
| 269 | 264 |
| 270 transport_sender_->SendRtcpFromRtpSender( | 265 transport_sender_->SendRtcpFromRtpSender( |
| 271 packet_type_flags, sender_info, dlrr, sender_log_message, local_ssrc_, | 266 packet_type_flags, sender_info, dlrr, sender_log_message, local_ssrc_, |
| 272 c_name_); | 267 c_name_); |
| 273 UpdateNextTimeToSendRtcp(); | 268 UpdateNextTimeToSendRtcp(); |
| 274 } | 269 } |
| 275 | 270 |
| 276 void Rtcp::OnReceivedNtp(uint32 ntp_seconds, uint32 ntp_fraction) { | 271 void Rtcp::OnReceivedNtp(uint32 ntp_seconds, uint32 ntp_fraction) { |
| 277 last_report_received_ = (ntp_seconds << 16) + (ntp_fraction >> 16); | 272 time_last_report_received_ = cast_environment_->Clock()->NowTicks(); |
| 278 | 273 last_report_ntp_time_ = |
| 279 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 274 (static_cast<uint64>(ntp_seconds) << 32) | ntp_fraction; |
| 280 time_last_report_received_ = now; | |
| 281 } | 275 } |
| 282 | 276 |
| 283 void Rtcp::OnReceivedLipSyncInfo(uint32 rtp_timestamp, uint32 ntp_seconds, | 277 void Rtcp::OnReceivedLipSyncInfo(uint32 rtp_timestamp, uint32 ntp_seconds, |
| 284 uint32 ntp_fraction) { | 278 uint32 ntp_fraction) { |
| 285 last_received_rtp_timestamp_ = rtp_timestamp; | 279 lip_sync_rtp_timestamp_ = rtp_timestamp; |
| 286 last_received_ntp_seconds_ = ntp_seconds; | 280 lip_sync_capture_time_ = ToApproximateLocalTime(ntp_seconds, ntp_fraction); |
| 287 last_received_ntp_fraction_ = ntp_fraction; | |
| 288 } | 281 } |
| 289 | 282 |
| 290 void Rtcp::OnReceivedSendReportRequest() { | 283 void Rtcp::OnReceivedSendReportRequest() { |
| 291 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 284 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
| 292 | 285 |
| 293 // Trigger a new RTCP report at next timer. | 286 // Trigger a new RTCP report at next timer. |
| 294 next_time_to_send_rtcp_ = now; | 287 next_time_to_send_rtcp_ = now; |
| 295 } | 288 } |
| 296 | 289 |
| 297 bool Rtcp::RtpTimestampInSenderTime(int frequency, uint32 rtp_timestamp, | 290 base::TimeTicks Rtcp::ToApproximateLocalTime(uint32 remote_ntp_seconds, |
| 298 base::TimeTicks* rtp_timestamp_in_ticks) | 291 uint32 remote_ntp_fraction) const { |
| 299 const { | 292 // Determine the clock difference between the local clock and the remote |
| 300 if (last_received_ntp_seconds_ == 0) | 293 // clock. |last_report_ntp_time_| is assumed to be an accurate timestamp from |
| 301 return false; | 294 // the remote clock that was snapshotted "just before" the |
| 295 // |time_last_report_received_| was snapshotted from the local clock. | |
| 296 // | |
| 297 // TODO(miu): This does not account for packet transmit latency across the | |
| 298 // network, which may or may not be siginifcant for our use cases. | |
| 299 if (time_last_report_received_.is_null()) | |
| 300 return base::TimeTicks(); | |
| 301 const base::TimeDelta local_clock_ahead_by = time_last_report_received_ - | |
| 302 ConvertNtpToTimeTicks(static_cast<uint32>(last_report_ntp_time_ >> 32), | |
| 303 static_cast<uint32>(last_report_ntp_time_)); | |
| 304 return ConvertNtpToTimeTicks(remote_ntp_seconds, remote_ntp_fraction) + | |
| 305 local_clock_ahead_by; | |
| 306 } | |
| 302 | 307 |
| 303 int wrap = CheckForWrapAround(rtp_timestamp, last_received_rtp_timestamp_); | 308 base::TimeTicks Rtcp::ToApproximateCaptureTime(uint32 rtp_timestamp, |
| 304 int64 rtp_timestamp_int64 = rtp_timestamp; | 309 int rtp_timebase) const { |
| 305 int64 last_received_rtp_timestamp_int64 = last_received_rtp_timestamp_; | 310 // If the lip sync info has not been received yet, no conversion is possible. |
| 311 if (lip_sync_capture_time_.is_null()) { | |
| 312 DVLOG(2) << "Requested capture time mapping before first lip sync update."; | |
| 313 return base::TimeTicks(); | |
|
hubbe
2014/05/14 23:12:23
I think this should be last_rtp_received_ticks + (
miu
2014/05/16 22:45:47
As discussed, this isn't base::TimeTicks::Now(); i
| |
| 314 } else { | |
| 315 // Sanity-check: Getting regular lip sync updates? | |
| 316 DCHECK((cast_environment_->Clock()->NowTicks() - lip_sync_capture_time_) < | |
| 317 base::TimeDelta::FromMinutes(1)); | |
| 318 } | |
| 306 | 319 |
| 307 if (wrap == 1) { | 320 const int32 rtp_since_lip_sync = |
| 308 rtp_timestamp_int64 += (1LL << 32); | 321 static_cast<int32>(rtp_timestamp - lip_sync_rtp_timestamp_); |
| 309 } else if (wrap == -1) { | 322 const base::TimeDelta time_since_lip_sync = |
| 310 last_received_rtp_timestamp_int64 += (1LL << 32); | 323 rtp_since_lip_sync * base::TimeDelta::FromSeconds(1) / rtp_timebase; |
| 311 } | 324 return lip_sync_capture_time_ + time_since_lip_sync; |
| 312 // Time since the last RTCP message. | |
| 313 // Note that this can be negative since we can compare a rtp timestamp from | |
| 314 // a frame older than the last received RTCP message. | |
| 315 int64 rtp_timestamp_diff = | |
| 316 rtp_timestamp_int64 - last_received_rtp_timestamp_int64; | |
| 317 | |
| 318 int frequency_khz = frequency / 1000; | |
| 319 int64 rtp_time_diff_ms = rtp_timestamp_diff / frequency_khz; | |
| 320 | |
| 321 // Sanity check. | |
| 322 if (std::abs(rtp_time_diff_ms) > kMaxDiffSinceReceivedRtcpMs) | |
| 323 return false; | |
| 324 | |
| 325 *rtp_timestamp_in_ticks = ConvertNtpToTimeTicks(last_received_ntp_seconds_, | |
| 326 last_received_ntp_fraction_) + | |
| 327 base::TimeDelta::FromMilliseconds(rtp_time_diff_ms); | |
| 328 return true; | |
| 329 } | 325 } |
| 330 | 326 |
| 331 void Rtcp::SetCastReceiverEventHistorySize(size_t size) { | 327 void Rtcp::SetCastReceiverEventHistorySize(size_t size) { |
| 332 rtcp_receiver_->SetCastReceiverEventHistorySize(size); | 328 rtcp_receiver_->SetCastReceiverEventHistorySize(size); |
| 333 } | 329 } |
| 334 | 330 |
| 335 void Rtcp::SetTargetDelay(base::TimeDelta target_delay) { | 331 void Rtcp::SetTargetDelay(base::TimeDelta target_delay) { |
| 332 DCHECK(target_delay.InMilliseconds() < kMaxDelay); | |
| 336 target_delay_ms_ = static_cast<uint16>(target_delay.InMilliseconds()); | 333 target_delay_ms_ = static_cast<uint16>(target_delay.InMilliseconds()); |
| 337 DCHECK(target_delay_ms_ < kMaxDelay); | |
| 338 } | 334 } |
| 339 | 335 |
| 340 void Rtcp::OnReceivedDelaySinceLastReport(uint32 receivers_ssrc, | 336 void Rtcp::OnReceivedDelaySinceLastReport(uint32 receivers_ssrc, |
| 341 uint32 last_report, | 337 uint32 last_report, |
| 342 uint32 delay_since_last_report) { | 338 uint32 delay_since_last_report) { |
| 343 RtcpSendTimeMap::iterator it = last_reports_sent_map_.find(last_report); | 339 RtcpSendTimeMap::iterator it = last_reports_sent_map_.find(last_report); |
| 344 if (it == last_reports_sent_map_.end()) { | 340 if (it == last_reports_sent_map_.end()) { |
| 345 return; // Feedback on another report. | 341 return; // Feedback on another report. |
| 346 } | 342 } |
| 347 | 343 |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 369 RtcpSendTimePair oldest_report = last_reports_sent_queue_.front(); | 365 RtcpSendTimePair oldest_report = last_reports_sent_queue_.front(); |
| 370 if (oldest_report.second < timeout) { | 366 if (oldest_report.second < timeout) { |
| 371 last_reports_sent_map_.erase(oldest_report.first); | 367 last_reports_sent_map_.erase(oldest_report.first); |
| 372 last_reports_sent_queue_.pop(); | 368 last_reports_sent_queue_.pop(); |
| 373 } else { | 369 } else { |
| 374 break; | 370 break; |
| 375 } | 371 } |
| 376 } | 372 } |
| 377 } | 373 } |
| 378 | 374 |
| 375 uint32 Rtcp::GetTruncatedLastNtpReportTime() const { | |
| 376 return static_cast<uint32>(last_report_ntp_time_ >> 16); | |
| 377 } | |
| 378 | |
| 379 void Rtcp::UpdateRtt(const base::TimeDelta& sender_delay, | 379 void Rtcp::UpdateRtt(const base::TimeDelta& sender_delay, |
| 380 const base::TimeDelta& receiver_delay) { | 380 const base::TimeDelta& receiver_delay) { |
| 381 base::TimeDelta rtt = sender_delay - receiver_delay; | 381 base::TimeDelta rtt = sender_delay - receiver_delay; |
| 382 // TODO(miu): Find out why this is capped at 1 ms, and remove the cap if it's | |
| 383 // bogus. | |
| 382 rtt = std::max(rtt, base::TimeDelta::FromMilliseconds(1)); | 384 rtt = std::max(rtt, base::TimeDelta::FromMilliseconds(1)); |
| 383 rtt_ = rtt; | 385 rtt_ = rtt; |
| 384 min_rtt_ = std::min(min_rtt_, rtt); | 386 min_rtt_ = std::min(min_rtt_, rtt); |
| 385 max_rtt_ = std::max(max_rtt_, rtt); | 387 max_rtt_ = std::max(max_rtt_, rtt); |
| 386 | 388 |
| 389 // TODO(miu): Replace "average for all time" with an EWMA, or suitable | |
| 390 // "average over recent past" mechanism. | |
| 387 if (number_of_rtt_in_avg_ != 0) { | 391 if (number_of_rtt_in_avg_ != 0) { |
| 388 float ac = static_cast<float>(number_of_rtt_in_avg_); | 392 const double ac = static_cast<double>(number_of_rtt_in_avg_); |
| 389 avg_rtt_ms_ = ((ac / (ac + 1.0)) * avg_rtt_ms_) + | 393 avg_rtt_ms_ = ((ac / (ac + 1.0)) * avg_rtt_ms_) + |
| 390 ((1.0 / (ac + 1.0)) * rtt.InMilliseconds()); | 394 ((1.0 / (ac + 1.0)) * rtt.InMillisecondsF()); |
| 391 } else { | 395 } else { |
| 392 avg_rtt_ms_ = rtt.InMilliseconds(); | 396 avg_rtt_ms_ = rtt.InMillisecondsF(); |
| 393 } | 397 } |
| 394 number_of_rtt_in_avg_++; | 398 number_of_rtt_in_avg_++; |
| 395 } | 399 } |
| 396 | 400 |
| 397 bool Rtcp::Rtt(base::TimeDelta* rtt, base::TimeDelta* avg_rtt, | 401 bool Rtcp::Rtt(base::TimeDelta* rtt, base::TimeDelta* avg_rtt, |
| 398 base::TimeDelta* min_rtt, base::TimeDelta* max_rtt) const { | 402 base::TimeDelta* min_rtt, base::TimeDelta* max_rtt) const { |
| 399 DCHECK(rtt) << "Invalid argument"; | 403 DCHECK(rtt) << "Invalid argument"; |
| 400 DCHECK(avg_rtt) << "Invalid argument"; | 404 DCHECK(avg_rtt) << "Invalid argument"; |
| 401 DCHECK(min_rtt) << "Invalid argument"; | 405 DCHECK(min_rtt) << "Invalid argument"; |
| 402 DCHECK(max_rtt) << "Invalid argument"; | 406 DCHECK(max_rtt) << "Invalid argument"; |
| 403 | 407 |
| 404 if (number_of_rtt_in_avg_ == 0) return false; | 408 if (number_of_rtt_in_avg_ == 0) return false; |
| 405 | 409 |
| 406 *rtt = rtt_; | 410 *rtt = rtt_; |
| 407 *avg_rtt = base::TimeDelta::FromMilliseconds(avg_rtt_ms_); | 411 *avg_rtt = base::TimeDelta::FromMillisecondsD(avg_rtt_ms_); |
| 408 *min_rtt = min_rtt_; | 412 *min_rtt = min_rtt_; |
| 409 *max_rtt = max_rtt_; | 413 *max_rtt = max_rtt_; |
| 410 return true; | 414 return true; |
| 411 } | 415 } |
| 412 | 416 |
| 413 int Rtcp::CheckForWrapAround(uint32 new_timestamp, uint32 old_timestamp) const { | |
|
hubbe
2014/05/14 23:12:23
Where did this logic go?
miu
2014/05/16 22:45:47
It was meaningless. Subtraction when zero, one, o
| |
| 414 if (new_timestamp < old_timestamp) { | |
| 415 // This difference should be less than -2^31 if we have had a wrap around | |
| 416 // (e.g. |new_timestamp| = 1, |rtcp_rtp_timestamp| = 2^32 - 1). Since it is | |
| 417 // cast to a int32_t, it should be positive. | |
| 418 if (static_cast<int32>(new_timestamp - old_timestamp) > 0) { | |
| 419 return 1; // Forward wrap around. | |
| 420 } | |
| 421 } else if (static_cast<int32>(old_timestamp - new_timestamp) > 0) { | |
| 422 // This difference should be less than -2^31 if we have had a backward wrap | |
| 423 // around. Since it is cast to a int32, it should be positive. | |
| 424 return -1; | |
| 425 } | |
| 426 return 0; | |
| 427 } | |
| 428 | |
| 429 void Rtcp::UpdateNextTimeToSendRtcp() { | 417 void Rtcp::UpdateNextTimeToSendRtcp() { |
| 430 int random = base::RandInt(0, 999); | 418 int random = base::RandInt(0, 999); |
| 431 base::TimeDelta time_to_next = | 419 base::TimeDelta time_to_next = |
| 432 (rtcp_interval_ / 2) + (rtcp_interval_ * random / 1000); | 420 (rtcp_interval_ / 2) + (rtcp_interval_ * random / 1000); |
| 433 | 421 |
| 434 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 422 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
| 435 next_time_to_send_rtcp_ = now + time_to_next; | 423 next_time_to_send_rtcp_ = now + time_to_next; |
| 436 } | 424 } |
| 437 | 425 |
| 438 void Rtcp::OnReceivedReceiverLog(const RtcpReceiverLogMessage& receiver_log) { | 426 void Rtcp::OnReceivedReceiverLog(const RtcpReceiverLogMessage& receiver_log) { |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 467 VLOG(2) << "Received log message via RTCP that we did not expect: " | 455 VLOG(2) << "Received log message via RTCP that we did not expect: " |
| 468 << static_cast<int>(event_it->type); | 456 << static_cast<int>(event_it->type); |
| 469 break; | 457 break; |
| 470 } | 458 } |
| 471 } | 459 } |
| 472 } | 460 } |
| 473 } | 461 } |
| 474 | 462 |
| 475 } // namespace cast | 463 } // namespace cast |
| 476 } // namespace media | 464 } // namespace media |
| OLD | NEW |