OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/net/rtcp/rtcp.h" | 5 #include "media/cast/net/rtcp/rtcp.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
10 #include "media/cast/cast_environment.h" | 10 #include "media/cast/cast_environment.h" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 delay_us >>= 16; | 49 delay_us >>= 16; |
50 delay_us += | 50 delay_us += |
51 ((ntp_delay & 0xffff0000) >> 16) * base::Time::kMicrosecondsPerSecond; | 51 ((ntp_delay & 0xffff0000) >> 16) * base::Time::kMicrosecondsPerSecond; |
52 return base::TimeDelta::FromMicroseconds(delay_us); | 52 return base::TimeDelta::FromMicroseconds(delay_us); |
53 } | 53 } |
54 | 54 |
55 // A receiver frame event is identified by frame RTP timestamp, event timestamp | 55 // A receiver frame event is identified by frame RTP timestamp, event timestamp |
56 // and event type. | 56 // and event type. |
57 // A receiver packet event is identified by all of the above plus packet id. | 57 // A receiver packet event is identified by all of the above plus packet id. |
58 // The key format is as follows: | 58 // The key format is as follows: |
59 // First uint64: | 59 // First uint64_t: |
60 // bits 0-11: zeroes (unused). | 60 // bits 0-11: zeroes (unused). |
61 // bits 12-15: event type ID. | 61 // bits 12-15: event type ID. |
62 // bits 16-31: packet ID if packet event, 0 otherwise. | 62 // bits 16-31: packet ID if packet event, 0 otherwise. |
63 // bits 32-63: RTP timestamp. | 63 // bits 32-63: RTP timestamp. |
64 // Second uint64: | 64 // Second uint64_t: |
65 // bits 0-63: event TimeTicks internal value. | 65 // bits 0-63: event TimeTicks internal value. |
66 std::pair<uint64, uint64> GetReceiverEventKey( | 66 std::pair<uint64_t, uint64_t> GetReceiverEventKey( |
67 uint32 frame_rtp_timestamp, | 67 uint32_t frame_rtp_timestamp, |
68 const base::TimeTicks& event_timestamp, | 68 const base::TimeTicks& event_timestamp, |
69 uint8 event_type, | 69 uint8_t event_type, |
70 uint16 packet_id_or_zero) { | 70 uint16_t packet_id_or_zero) { |
71 uint64 value1 = event_type; | 71 uint64_t value1 = event_type; |
72 value1 <<= 16; | 72 value1 <<= 16; |
73 value1 |= packet_id_or_zero; | 73 value1 |= packet_id_or_zero; |
74 value1 <<= 32; | 74 value1 <<= 32; |
75 value1 |= frame_rtp_timestamp; | 75 value1 |= frame_rtp_timestamp; |
76 return std::make_pair( | 76 return std::make_pair( |
77 value1, static_cast<uint64>(event_timestamp.ToInternalValue())); | 77 value1, static_cast<uint64_t>(event_timestamp.ToInternalValue())); |
78 } | 78 } |
79 | 79 |
80 } // namespace | 80 } // namespace |
81 | 81 |
82 Rtcp::Rtcp(const RtcpCastMessageCallback& cast_callback, | 82 Rtcp::Rtcp(const RtcpCastMessageCallback& cast_callback, |
83 const RtcpRttCallback& rtt_callback, | 83 const RtcpRttCallback& rtt_callback, |
84 const RtcpLogMessageCallback& log_callback, | 84 const RtcpLogMessageCallback& log_callback, |
85 base::TickClock* clock, | 85 base::TickClock* clock, |
86 PacedPacketSender* packet_sender, | 86 PacedPacketSender* packet_sender, |
87 uint32 local_ssrc, | 87 uint32_t local_ssrc, |
88 uint32 remote_ssrc) | 88 uint32_t remote_ssrc) |
89 : cast_callback_(cast_callback), | 89 : cast_callback_(cast_callback), |
90 rtt_callback_(rtt_callback), | 90 rtt_callback_(rtt_callback), |
91 log_callback_(log_callback), | 91 log_callback_(log_callback), |
92 clock_(clock), | 92 clock_(clock), |
93 rtcp_builder_(local_ssrc), | 93 rtcp_builder_(local_ssrc), |
94 packet_sender_(packet_sender), | 94 packet_sender_(packet_sender), |
95 local_ssrc_(local_ssrc), | 95 local_ssrc_(local_ssrc), |
96 remote_ssrc_(remote_ssrc), | 96 remote_ssrc_(remote_ssrc), |
97 last_report_truncated_ntp_(0), | 97 last_report_truncated_ntp_(0), |
98 local_clock_ahead_by_(ClockDriftSmoother::GetDefaultTimeConstant()), | 98 local_clock_ahead_by_(ClockDriftSmoother::GetDefaultTimeConstant()), |
99 lip_sync_rtp_timestamp_(0), | 99 lip_sync_rtp_timestamp_(0), |
100 lip_sync_ntp_timestamp_(0), | 100 lip_sync_ntp_timestamp_(0), |
101 largest_seen_timestamp_(base::TimeTicks::FromInternalValue( | 101 largest_seen_timestamp_(base::TimeTicks::FromInternalValue( |
102 std::numeric_limits<int64_t>::min())), | 102 std::numeric_limits<int64_t>::min())), |
103 ack_frame_id_wrap_helper_(kFirstFrameId - 1) {} | 103 ack_frame_id_wrap_helper_(kFirstFrameId - 1) {} |
104 | 104 |
105 Rtcp::~Rtcp() {} | 105 Rtcp::~Rtcp() {} |
106 | 106 |
107 bool Rtcp::IsRtcpPacket(const uint8* packet, size_t length) { | 107 bool Rtcp::IsRtcpPacket(const uint8_t* packet, size_t length) { |
108 if (length < kMinLengthOfRtcp) { | 108 if (length < kMinLengthOfRtcp) { |
109 LOG(ERROR) << "Invalid RTCP packet received."; | 109 LOG(ERROR) << "Invalid RTCP packet received."; |
110 return false; | 110 return false; |
111 } | 111 } |
112 | 112 |
113 uint8 packet_type = packet[1]; | 113 uint8_t packet_type = packet[1]; |
114 return packet_type >= kPacketTypeLow && packet_type <= kPacketTypeHigh; | 114 return packet_type >= kPacketTypeLow && packet_type <= kPacketTypeHigh; |
115 } | 115 } |
116 | 116 |
117 uint32 Rtcp::GetSsrcOfSender(const uint8* rtcp_buffer, size_t length) { | 117 uint32_t Rtcp::GetSsrcOfSender(const uint8_t* rtcp_buffer, size_t length) { |
118 if (length < kMinLengthOfRtcp) | 118 if (length < kMinLengthOfRtcp) |
119 return 0; | 119 return 0; |
120 uint32 ssrc_of_sender; | 120 uint32_t ssrc_of_sender; |
121 base::BigEndianReader big_endian_reader( | 121 base::BigEndianReader big_endian_reader( |
122 reinterpret_cast<const char*>(rtcp_buffer), length); | 122 reinterpret_cast<const char*>(rtcp_buffer), length); |
123 big_endian_reader.Skip(4); // Skip header. | 123 big_endian_reader.Skip(4); // Skip header. |
124 big_endian_reader.ReadU32(&ssrc_of_sender); | 124 big_endian_reader.ReadU32(&ssrc_of_sender); |
125 return ssrc_of_sender; | 125 return ssrc_of_sender; |
126 } | 126 } |
127 | 127 |
128 bool Rtcp::IncomingRtcpPacket(const uint8* data, size_t length) { | 128 bool Rtcp::IncomingRtcpPacket(const uint8_t* data, size_t length) { |
129 // Check if this is a valid RTCP packet. | 129 // Check if this is a valid RTCP packet. |
130 if (!IsRtcpPacket(data, length)) { | 130 if (!IsRtcpPacket(data, length)) { |
131 VLOG(1) << "Rtcp@" << this << "::IncomingRtcpPacket() -- " | 131 VLOG(1) << "Rtcp@" << this << "::IncomingRtcpPacket() -- " |
132 << "Received an invalid (non-RTCP?) packet."; | 132 << "Received an invalid (non-RTCP?) packet."; |
133 return false; | 133 return false; |
134 } | 134 } |
135 | 135 |
136 // Check if this packet is to us. | 136 // Check if this packet is to us. |
137 uint32 ssrc_of_sender = GetSsrcOfSender(data, length); | 137 uint32_t ssrc_of_sender = GetSsrcOfSender(data, length); |
138 if (ssrc_of_sender != remote_ssrc_) { | 138 if (ssrc_of_sender != remote_ssrc_) { |
139 return false; | 139 return false; |
140 } | 140 } |
141 | 141 |
142 // Parse this packet. | 142 // Parse this packet. |
143 RtcpParser parser(local_ssrc_, remote_ssrc_); | 143 RtcpParser parser(local_ssrc_, remote_ssrc_); |
144 base::BigEndianReader reader(reinterpret_cast<const char*>(data), length); | 144 base::BigEndianReader reader(reinterpret_cast<const char*>(data), length); |
145 if (parser.Parse(&reader)) { | 145 if (parser.Parse(&reader)) { |
146 if (parser.has_receiver_reference_time_report()) { | 146 if (parser.has_receiver_reference_time_report()) { |
147 base::TimeTicks t = ConvertNtpToTimeTicks( | 147 base::TimeTicks t = ConvertNtpToTimeTicks( |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 if (rtp_receiver_statistics) { | 244 if (rtp_receiver_statistics) { |
245 report_block.remote_ssrc = 0; // Not needed to set send side. | 245 report_block.remote_ssrc = 0; // Not needed to set send side. |
246 report_block.media_ssrc = remote_ssrc_; // SSRC of the RTP packet sender. | 246 report_block.media_ssrc = remote_ssrc_; // SSRC of the RTP packet sender. |
247 report_block.fraction_lost = rtp_receiver_statistics->fraction_lost; | 247 report_block.fraction_lost = rtp_receiver_statistics->fraction_lost; |
248 report_block.cumulative_lost = rtp_receiver_statistics->cumulative_lost; | 248 report_block.cumulative_lost = rtp_receiver_statistics->cumulative_lost; |
249 report_block.extended_high_sequence_number = | 249 report_block.extended_high_sequence_number = |
250 rtp_receiver_statistics->extended_high_sequence_number; | 250 rtp_receiver_statistics->extended_high_sequence_number; |
251 report_block.jitter = rtp_receiver_statistics->jitter; | 251 report_block.jitter = rtp_receiver_statistics->jitter; |
252 report_block.last_sr = last_report_truncated_ntp_; | 252 report_block.last_sr = last_report_truncated_ntp_; |
253 if (!time_last_report_received_.is_null()) { | 253 if (!time_last_report_received_.is_null()) { |
254 uint32 delay_seconds = 0; | 254 uint32_t delay_seconds = 0; |
255 uint32 delay_fraction = 0; | 255 uint32_t delay_fraction = 0; |
256 base::TimeDelta delta = time_data.timestamp - time_last_report_received_; | 256 base::TimeDelta delta = time_data.timestamp - time_last_report_received_; |
257 ConvertTimeToFractions(delta.InMicroseconds(), &delay_seconds, | 257 ConvertTimeToFractions(delta.InMicroseconds(), &delay_seconds, |
258 &delay_fraction); | 258 &delay_fraction); |
259 report_block.delay_since_last_sr = | 259 report_block.delay_since_last_sr = |
260 ConvertToNtpDiff(delay_seconds, delay_fraction); | 260 ConvertToNtpDiff(delay_seconds, delay_fraction); |
261 } else { | 261 } else { |
262 report_block.delay_since_last_sr = 0; | 262 report_block.delay_since_last_sr = 0; |
263 } | 263 } |
264 } | 264 } |
265 RtcpBuilder rtcp_builder(local_ssrc_); | 265 RtcpBuilder rtcp_builder(local_ssrc_); |
266 packet_sender_->SendRtcpPacket( | 266 packet_sender_->SendRtcpPacket( |
267 local_ssrc_, | 267 local_ssrc_, |
268 rtcp_builder.BuildRtcpFromReceiver( | 268 rtcp_builder.BuildRtcpFromReceiver( |
269 rtp_receiver_statistics ? &report_block : NULL, | 269 rtp_receiver_statistics ? &report_block : NULL, |
270 &rrtr, | 270 &rrtr, |
271 cast_message, | 271 cast_message, |
272 rtcp_events, | 272 rtcp_events, |
273 target_delay)); | 273 target_delay)); |
274 } | 274 } |
275 | 275 |
276 void Rtcp::SendRtcpFromRtpSender(base::TimeTicks current_time, | 276 void Rtcp::SendRtcpFromRtpSender(base::TimeTicks current_time, |
277 uint32 current_time_as_rtp_timestamp, | 277 uint32_t current_time_as_rtp_timestamp, |
278 uint32 send_packet_count, | 278 uint32_t send_packet_count, |
279 size_t send_octet_count) { | 279 size_t send_octet_count) { |
280 uint32 current_ntp_seconds = 0; | 280 uint32_t current_ntp_seconds = 0; |
281 uint32 current_ntp_fractions = 0; | 281 uint32_t current_ntp_fractions = 0; |
282 ConvertTimeTicksToNtp(current_time, ¤t_ntp_seconds, | 282 ConvertTimeTicksToNtp(current_time, ¤t_ntp_seconds, |
283 ¤t_ntp_fractions); | 283 ¤t_ntp_fractions); |
284 SaveLastSentNtpTime(current_time, current_ntp_seconds, | 284 SaveLastSentNtpTime(current_time, current_ntp_seconds, |
285 current_ntp_fractions); | 285 current_ntp_fractions); |
286 | 286 |
287 RtcpSenderInfo sender_info; | 287 RtcpSenderInfo sender_info; |
288 sender_info.ntp_seconds = current_ntp_seconds; | 288 sender_info.ntp_seconds = current_ntp_seconds; |
289 sender_info.ntp_fraction = current_ntp_fractions; | 289 sender_info.ntp_fraction = current_ntp_fractions; |
290 sender_info.rtp_timestamp = current_time_as_rtp_timestamp; | 290 sender_info.rtp_timestamp = current_time_as_rtp_timestamp; |
291 sender_info.send_packet_count = send_packet_count; | 291 sender_info.send_packet_count = send_packet_count; |
292 sender_info.send_octet_count = send_octet_count; | 292 sender_info.send_octet_count = send_octet_count; |
293 | 293 |
294 packet_sender_->SendRtcpPacket( | 294 packet_sender_->SendRtcpPacket( |
295 local_ssrc_, | 295 local_ssrc_, |
296 rtcp_builder_.BuildRtcpFromSender(sender_info)); | 296 rtcp_builder_.BuildRtcpFromSender(sender_info)); |
297 } | 297 } |
298 | 298 |
299 void Rtcp::OnReceivedNtp(uint32 ntp_seconds, uint32 ntp_fraction) { | 299 void Rtcp::OnReceivedNtp(uint32_t ntp_seconds, uint32_t ntp_fraction) { |
300 last_report_truncated_ntp_ = ConvertToNtpDiff(ntp_seconds, ntp_fraction); | 300 last_report_truncated_ntp_ = ConvertToNtpDiff(ntp_seconds, ntp_fraction); |
301 | 301 |
302 const base::TimeTicks now = clock_->NowTicks(); | 302 const base::TimeTicks now = clock_->NowTicks(); |
303 time_last_report_received_ = now; | 303 time_last_report_received_ = now; |
304 | 304 |
305 // TODO(miu): This clock offset calculation does not account for packet | 305 // TODO(miu): This clock offset calculation does not account for packet |
306 // transit time over the network. End2EndTest.EvilNetwork confirms that this | 306 // transit time over the network. End2EndTest.EvilNetwork confirms that this |
307 // contributes a very significant source of error here. Determine whether | 307 // contributes a very significant source of error here. Determine whether |
308 // RTT should be factored-in, and how that changes the rest of the | 308 // RTT should be factored-in, and how that changes the rest of the |
309 // calculation. | 309 // calculation. |
310 const base::TimeDelta measured_offset = | 310 const base::TimeDelta measured_offset = |
311 now - ConvertNtpToTimeTicks(ntp_seconds, ntp_fraction); | 311 now - ConvertNtpToTimeTicks(ntp_seconds, ntp_fraction); |
312 local_clock_ahead_by_.Update(now, measured_offset); | 312 local_clock_ahead_by_.Update(now, measured_offset); |
313 if (measured_offset < local_clock_ahead_by_.Current()) { | 313 if (measured_offset < local_clock_ahead_by_.Current()) { |
314 // Logically, the minimum offset between the clocks has to be the correct | 314 // Logically, the minimum offset between the clocks has to be the correct |
315 // one. For example, the time it took to transmit the current report may | 315 // one. For example, the time it took to transmit the current report may |
316 // have been lower than usual, and so some of the error introduced by the | 316 // have been lower than usual, and so some of the error introduced by the |
317 // transmission time can be eliminated. | 317 // transmission time can be eliminated. |
318 local_clock_ahead_by_.Reset(now, measured_offset); | 318 local_clock_ahead_by_.Reset(now, measured_offset); |
319 } | 319 } |
320 VLOG(1) << "Local clock is ahead of the remote clock by: " | 320 VLOG(1) << "Local clock is ahead of the remote clock by: " |
321 << "measured=" << measured_offset.InMicroseconds() << " usec, " | 321 << "measured=" << measured_offset.InMicroseconds() << " usec, " |
322 << "filtered=" << local_clock_ahead_by_.Current().InMicroseconds() | 322 << "filtered=" << local_clock_ahead_by_.Current().InMicroseconds() |
323 << " usec."; | 323 << " usec."; |
324 } | 324 } |
325 | 325 |
326 void Rtcp::OnReceivedLipSyncInfo(uint32 rtp_timestamp, uint32 ntp_seconds, | 326 void Rtcp::OnReceivedLipSyncInfo(uint32_t rtp_timestamp, |
327 uint32 ntp_fraction) { | 327 uint32_t ntp_seconds, |
| 328 uint32_t ntp_fraction) { |
328 if (ntp_seconds == 0) { | 329 if (ntp_seconds == 0) { |
329 NOTREACHED(); | 330 NOTREACHED(); |
330 return; | 331 return; |
331 } | 332 } |
332 lip_sync_rtp_timestamp_ = rtp_timestamp; | 333 lip_sync_rtp_timestamp_ = rtp_timestamp; |
333 lip_sync_ntp_timestamp_ = | 334 lip_sync_ntp_timestamp_ = |
334 (static_cast<uint64>(ntp_seconds) << 32) | ntp_fraction; | 335 (static_cast<uint64_t>(ntp_seconds) << 32) | ntp_fraction; |
335 } | 336 } |
336 | 337 |
337 bool Rtcp::GetLatestLipSyncTimes(uint32* rtp_timestamp, | 338 bool Rtcp::GetLatestLipSyncTimes(uint32_t* rtp_timestamp, |
338 base::TimeTicks* reference_time) const { | 339 base::TimeTicks* reference_time) const { |
339 if (!lip_sync_ntp_timestamp_) | 340 if (!lip_sync_ntp_timestamp_) |
340 return false; | 341 return false; |
341 | 342 |
342 const base::TimeTicks local_reference_time = | 343 const base::TimeTicks local_reference_time = |
343 ConvertNtpToTimeTicks(static_cast<uint32>(lip_sync_ntp_timestamp_ >> 32), | 344 ConvertNtpToTimeTicks( |
344 static_cast<uint32>(lip_sync_ntp_timestamp_)) + | 345 static_cast<uint32_t>(lip_sync_ntp_timestamp_ >> 32), |
| 346 static_cast<uint32_t>(lip_sync_ntp_timestamp_)) + |
345 local_clock_ahead_by_.Current(); | 347 local_clock_ahead_by_.Current(); |
346 | 348 |
347 // Sanity-check: Getting regular lip sync updates? | 349 // Sanity-check: Getting regular lip sync updates? |
348 DCHECK((clock_->NowTicks() - local_reference_time) < | 350 DCHECK((clock_->NowTicks() - local_reference_time) < |
349 base::TimeDelta::FromMinutes(1)); | 351 base::TimeDelta::FromMinutes(1)); |
350 | 352 |
351 *rtp_timestamp = lip_sync_rtp_timestamp_; | 353 *rtp_timestamp = lip_sync_rtp_timestamp_; |
352 *reference_time = local_reference_time; | 354 *reference_time = local_reference_time; |
353 return true; | 355 return true; |
354 } | 356 } |
355 | 357 |
356 void Rtcp::OnReceivedDelaySinceLastReport(uint32 last_report, | 358 void Rtcp::OnReceivedDelaySinceLastReport(uint32_t last_report, |
357 uint32 delay_since_last_report) { | 359 uint32_t delay_since_last_report) { |
358 RtcpSendTimeMap::iterator it = last_reports_sent_map_.find(last_report); | 360 RtcpSendTimeMap::iterator it = last_reports_sent_map_.find(last_report); |
359 if (it == last_reports_sent_map_.end()) { | 361 if (it == last_reports_sent_map_.end()) { |
360 return; // Feedback on another report. | 362 return; // Feedback on another report. |
361 } | 363 } |
362 | 364 |
363 const base::TimeDelta sender_delay = clock_->NowTicks() - it->second; | 365 const base::TimeDelta sender_delay = clock_->NowTicks() - it->second; |
364 const base::TimeDelta receiver_delay = | 366 const base::TimeDelta receiver_delay = |
365 ConvertFromNtpDiff(delay_since_last_report); | 367 ConvertFromNtpDiff(delay_since_last_report); |
366 current_round_trip_time_ = sender_delay - receiver_delay; | 368 current_round_trip_time_ = sender_delay - receiver_delay; |
367 // If the round trip time was computed as less than 1 ms, assume clock | 369 // If the round trip time was computed as less than 1 ms, assume clock |
368 // imprecision by one or both peers caused a bad value to be calculated. | 370 // imprecision by one or both peers caused a bad value to be calculated. |
369 // While plenty of networks do easily achieve less than 1 ms round trip time, | 371 // While plenty of networks do easily achieve less than 1 ms round trip time, |
370 // such a level of precision cannot be measured with our approach; and 1 ms is | 372 // such a level of precision cannot be measured with our approach; and 1 ms is |
371 // good enough to represent "under 1 ms" for our use cases. | 373 // good enough to represent "under 1 ms" for our use cases. |
372 current_round_trip_time_ = | 374 current_round_trip_time_ = |
373 std::max(current_round_trip_time_, base::TimeDelta::FromMilliseconds(1)); | 375 std::max(current_round_trip_time_, base::TimeDelta::FromMilliseconds(1)); |
374 | 376 |
375 if (!rtt_callback_.is_null()) | 377 if (!rtt_callback_.is_null()) |
376 rtt_callback_.Run(current_round_trip_time_); | 378 rtt_callback_.Run(current_round_trip_time_); |
377 } | 379 } |
378 | 380 |
379 void Rtcp::OnReceivedCastFeedback(const RtcpCastMessage& cast_message) { | 381 void Rtcp::OnReceivedCastFeedback(const RtcpCastMessage& cast_message) { |
380 if (cast_callback_.is_null()) | 382 if (cast_callback_.is_null()) |
381 return; | 383 return; |
382 cast_callback_.Run(cast_message); | 384 cast_callback_.Run(cast_message); |
383 } | 385 } |
384 | 386 |
385 void Rtcp::SaveLastSentNtpTime(const base::TimeTicks& now, | 387 void Rtcp::SaveLastSentNtpTime(const base::TimeTicks& now, |
386 uint32 last_ntp_seconds, | 388 uint32_t last_ntp_seconds, |
387 uint32 last_ntp_fraction) { | 389 uint32_t last_ntp_fraction) { |
388 // Make sure |now| is always greater than the last element in | 390 // Make sure |now| is always greater than the last element in |
389 // |last_reports_sent_queue_|. | 391 // |last_reports_sent_queue_|. |
390 if (!last_reports_sent_queue_.empty()) { | 392 if (!last_reports_sent_queue_.empty()) { |
391 DCHECK(now >= last_reports_sent_queue_.back().second); | 393 DCHECK(now >= last_reports_sent_queue_.back().second); |
392 } | 394 } |
393 | 395 |
394 uint32 last_report = ConvertToNtpDiff(last_ntp_seconds, last_ntp_fraction); | 396 uint32_t last_report = ConvertToNtpDiff(last_ntp_seconds, last_ntp_fraction); |
395 last_reports_sent_map_[last_report] = now; | 397 last_reports_sent_map_[last_report] = now; |
396 last_reports_sent_queue_.push(std::make_pair(last_report, now)); | 398 last_reports_sent_queue_.push(std::make_pair(last_report, now)); |
397 | 399 |
398 const base::TimeTicks timeout = | 400 const base::TimeTicks timeout = |
399 now - TimeDelta::FromMilliseconds(kStatsHistoryWindowMs); | 401 now - TimeDelta::FromMilliseconds(kStatsHistoryWindowMs); |
400 | 402 |
401 // Cleanup old statistics older than |timeout|. | 403 // Cleanup old statistics older than |timeout|. |
402 while (!last_reports_sent_queue_.empty()) { | 404 while (!last_reports_sent_queue_.empty()) { |
403 RtcpSendTimePair oldest_report = last_reports_sent_queue_.front(); | 405 RtcpSendTimePair oldest_report = last_reports_sent_queue_.front(); |
404 if (oldest_report.second < timeout) { | 406 if (oldest_report.second < timeout) { |
405 last_reports_sent_map_.erase(oldest_report.first); | 407 last_reports_sent_map_.erase(oldest_report.first); |
406 last_reports_sent_queue_.pop(); | 408 last_reports_sent_queue_.pop(); |
407 } else { | 409 } else { |
408 break; | 410 break; |
409 } | 411 } |
410 } | 412 } |
411 } | 413 } |
412 | 414 |
413 void Rtcp::OnReceivedReceiverLog(const RtcpReceiverLogMessage& receiver_log) { | 415 void Rtcp::OnReceivedReceiverLog(const RtcpReceiverLogMessage& receiver_log) { |
414 if (log_callback_.is_null()) | 416 if (log_callback_.is_null()) |
415 return; | 417 return; |
416 log_callback_.Run(receiver_log); | 418 log_callback_.Run(receiver_log); |
417 } | 419 } |
418 | 420 |
419 } // namespace cast | 421 } // namespace cast |
420 } // namespace media | 422 } // namespace media |
OLD | NEW |