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

Side by Side Diff: media/cast/net/rtcp/rtcp.cc

Issue 1515433002: Replace uses of raw uint32's with a type-checked RtpTimeTicks data type. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Speculative workaround fix for win8_chromium_ng compile error. Created 4 years, 11 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 unified diff | Download patch
« no previous file with comments | « media/cast/net/rtcp/rtcp.h ('k') | media/cast/net/rtcp/rtcp_builder.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
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_t: 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_t: 64 // Second uint64_t:
65 // bits 0-63: event TimeTicks internal value. 65 // bits 0-63: event TimeTicks internal value.
66 std::pair<uint64_t, uint64_t> GetReceiverEventKey( 66 std::pair<uint64_t, uint64_t> GetReceiverEventKey(
67 uint32_t frame_rtp_timestamp, 67 RtpTimeTicks frame_rtp_timestamp,
68 const base::TimeTicks& event_timestamp, 68 const base::TimeTicks& event_timestamp,
69 uint8_t event_type, 69 uint8_t event_type,
70 uint16_t packet_id_or_zero) { 70 uint16_t packet_id_or_zero) {
71 uint64_t 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.lower_32_bits();
76 return std::make_pair( 76 return std::make_pair(
77 value1, static_cast<uint64_t>(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_t local_ssrc, 87 uint32_t local_ssrc,
88 uint32_t 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 parser_(local_ssrc_, remote_ssrc_),
97 last_report_truncated_ntp_(0), 98 last_report_truncated_ntp_(0),
98 local_clock_ahead_by_(ClockDriftSmoother::GetDefaultTimeConstant()), 99 local_clock_ahead_by_(ClockDriftSmoother::GetDefaultTimeConstant()),
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_t* 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.";
(...skipping 23 matching lines...) Expand all
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_t 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_);
144 base::BigEndianReader reader(reinterpret_cast<const char*>(data), length); 143 base::BigEndianReader reader(reinterpret_cast<const char*>(data), length);
145 if (parser.Parse(&reader)) { 144 if (parser_.Parse(&reader)) {
146 if (parser.has_receiver_reference_time_report()) { 145 if (parser_.has_receiver_reference_time_report()) {
147 base::TimeTicks t = ConvertNtpToTimeTicks( 146 base::TimeTicks t = ConvertNtpToTimeTicks(
148 parser.receiver_reference_time_report().ntp_seconds, 147 parser_.receiver_reference_time_report().ntp_seconds,
149 parser.receiver_reference_time_report().ntp_fraction); 148 parser_.receiver_reference_time_report().ntp_fraction);
150 if (t > largest_seen_timestamp_) { 149 if (t > largest_seen_timestamp_) {
151 largest_seen_timestamp_ = t; 150 largest_seen_timestamp_ = t;
152 } else if ((largest_seen_timestamp_ - t).InMilliseconds() > 151 } else if ((largest_seen_timestamp_ - t).InMilliseconds() >
153 kOutOfOrderMaxAgeMs) { 152 kOutOfOrderMaxAgeMs) {
154 // Reject packet, it is too old. 153 // Reject packet, it is too old.
155 VLOG(1) << "Rejecting RTCP packet as it is too old (" 154 VLOG(1) << "Rejecting RTCP packet as it is too old ("
156 << (largest_seen_timestamp_ - t).InMilliseconds() 155 << (largest_seen_timestamp_ - t).InMilliseconds()
157 << " ms)"; 156 << " ms)";
158 return true; 157 return true;
159 } 158 }
160 159
161 OnReceivedNtp(parser.receiver_reference_time_report().ntp_seconds, 160 OnReceivedNtp(parser_.receiver_reference_time_report().ntp_seconds,
162 parser.receiver_reference_time_report().ntp_fraction); 161 parser_.receiver_reference_time_report().ntp_fraction);
163 } 162 }
164 if (parser.has_sender_report()) { 163 if (parser_.has_sender_report()) {
165 OnReceivedNtp(parser.sender_report().ntp_seconds, 164 OnReceivedNtp(parser_.sender_report().ntp_seconds,
166 parser.sender_report().ntp_fraction); 165 parser_.sender_report().ntp_fraction);
167 OnReceivedLipSyncInfo(parser.sender_report().rtp_timestamp, 166 OnReceivedLipSyncInfo(parser_.sender_report().rtp_timestamp,
168 parser.sender_report().ntp_seconds, 167 parser_.sender_report().ntp_seconds,
169 parser.sender_report().ntp_fraction); 168 parser_.sender_report().ntp_fraction);
170 } 169 }
171 if (parser.has_receiver_log()) { 170 if (parser_.has_receiver_log()) {
172 if (DedupeReceiverLog(parser.mutable_receiver_log())) { 171 if (DedupeReceiverLog(parser_.mutable_receiver_log())) {
173 OnReceivedReceiverLog(parser.receiver_log()); 172 OnReceivedReceiverLog(parser_.receiver_log());
174 } 173 }
175 } 174 }
176 if (parser.has_last_report()) { 175 if (parser_.has_last_report()) {
177 OnReceivedDelaySinceLastReport(parser.last_report(), 176 OnReceivedDelaySinceLastReport(parser_.last_report(),
178 parser.delay_since_last_report()); 177 parser_.delay_since_last_report());
179 } 178 }
180 if (parser.has_cast_message()) { 179 if (parser_.has_cast_message()) {
181 parser.mutable_cast_message()->ack_frame_id = 180 parser_.mutable_cast_message()->ack_frame_id =
182 ack_frame_id_wrap_helper_.MapTo32bitsFrameId( 181 ack_frame_id_wrap_helper_.MapTo32bitsFrameId(
183 parser.mutable_cast_message()->ack_frame_id); 182 parser_.mutable_cast_message()->ack_frame_id);
184 OnReceivedCastFeedback(parser.cast_message()); 183 OnReceivedCastFeedback(parser_.cast_message());
185 } 184 }
186 } 185 }
187 return true; 186 return true;
188 } 187 }
189 188
190 bool Rtcp::DedupeReceiverLog(RtcpReceiverLogMessage* receiver_log) { 189 bool Rtcp::DedupeReceiverLog(RtcpReceiverLogMessage* receiver_log) {
191 RtcpReceiverLogMessage::iterator i = receiver_log->begin(); 190 RtcpReceiverLogMessage::iterator i = receiver_log->begin();
192 while (i != receiver_log->end()) { 191 while (i != receiver_log->end()) {
193 RtcpReceiverEventLogMessages* messages = &i->event_log_messages_; 192 RtcpReceiverEventLogMessages* messages = &i->event_log_messages_;
194 RtcpReceiverEventLogMessages::iterator j = messages->begin(); 193 RtcpReceiverEventLogMessages::iterator j = messages->begin();
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 local_ssrc_, 266 local_ssrc_,
268 rtcp_builder.BuildRtcpFromReceiver( 267 rtcp_builder.BuildRtcpFromReceiver(
269 rtp_receiver_statistics ? &report_block : NULL, 268 rtp_receiver_statistics ? &report_block : NULL,
270 &rrtr, 269 &rrtr,
271 cast_message, 270 cast_message,
272 rtcp_events, 271 rtcp_events,
273 target_delay)); 272 target_delay));
274 } 273 }
275 274
276 void Rtcp::SendRtcpFromRtpSender(base::TimeTicks current_time, 275 void Rtcp::SendRtcpFromRtpSender(base::TimeTicks current_time,
277 uint32_t current_time_as_rtp_timestamp, 276 RtpTimeTicks current_time_as_rtp_timestamp,
278 uint32_t send_packet_count, 277 uint32_t send_packet_count,
279 size_t send_octet_count) { 278 size_t send_octet_count) {
280 uint32_t current_ntp_seconds = 0; 279 uint32_t current_ntp_seconds = 0;
281 uint32_t current_ntp_fractions = 0; 280 uint32_t current_ntp_fractions = 0;
282 ConvertTimeTicksToNtp(current_time, &current_ntp_seconds, 281 ConvertTimeTicksToNtp(current_time, &current_ntp_seconds,
283 &current_ntp_fractions); 282 &current_ntp_fractions);
284 SaveLastSentNtpTime(current_time, current_ntp_seconds, 283 SaveLastSentNtpTime(current_time, current_ntp_seconds,
285 current_ntp_fractions); 284 current_ntp_fractions);
286 285
287 RtcpSenderInfo sender_info; 286 RtcpSenderInfo sender_info;
(...skipping 28 matching lines...) Expand all
316 // have been lower than usual, and so some of the error introduced by the 315 // have been lower than usual, and so some of the error introduced by the
317 // transmission time can be eliminated. 316 // transmission time can be eliminated.
318 local_clock_ahead_by_.Reset(now, measured_offset); 317 local_clock_ahead_by_.Reset(now, measured_offset);
319 } 318 }
320 VLOG(1) << "Local clock is ahead of the remote clock by: " 319 VLOG(1) << "Local clock is ahead of the remote clock by: "
321 << "measured=" << measured_offset.InMicroseconds() << " usec, " 320 << "measured=" << measured_offset.InMicroseconds() << " usec, "
322 << "filtered=" << local_clock_ahead_by_.Current().InMicroseconds() 321 << "filtered=" << local_clock_ahead_by_.Current().InMicroseconds()
323 << " usec."; 322 << " usec.";
324 } 323 }
325 324
326 void Rtcp::OnReceivedLipSyncInfo(uint32_t rtp_timestamp, 325 void Rtcp::OnReceivedLipSyncInfo(RtpTimeTicks rtp_timestamp,
327 uint32_t ntp_seconds, 326 uint32_t ntp_seconds,
328 uint32_t ntp_fraction) { 327 uint32_t ntp_fraction) {
329 if (ntp_seconds == 0) { 328 if (ntp_seconds == 0) {
330 NOTREACHED(); 329 NOTREACHED();
331 return; 330 return;
332 } 331 }
333 lip_sync_rtp_timestamp_ = rtp_timestamp; 332 lip_sync_rtp_timestamp_ = rtp_timestamp;
334 lip_sync_ntp_timestamp_ = 333 lip_sync_ntp_timestamp_ =
335 (static_cast<uint64_t>(ntp_seconds) << 32) | ntp_fraction; 334 (static_cast<uint64_t>(ntp_seconds) << 32) | ntp_fraction;
336 } 335 }
337 336
338 bool Rtcp::GetLatestLipSyncTimes(uint32_t* rtp_timestamp, 337 bool Rtcp::GetLatestLipSyncTimes(RtpTimeTicks* rtp_timestamp,
339 base::TimeTicks* reference_time) const { 338 base::TimeTicks* reference_time) const {
340 if (!lip_sync_ntp_timestamp_) 339 if (!lip_sync_ntp_timestamp_)
341 return false; 340 return false;
342 341
343 const base::TimeTicks local_reference_time = 342 const base::TimeTicks local_reference_time =
344 ConvertNtpToTimeTicks( 343 ConvertNtpToTimeTicks(
345 static_cast<uint32_t>(lip_sync_ntp_timestamp_ >> 32), 344 static_cast<uint32_t>(lip_sync_ntp_timestamp_ >> 32),
346 static_cast<uint32_t>(lip_sync_ntp_timestamp_)) + 345 static_cast<uint32_t>(lip_sync_ntp_timestamp_)) +
347 local_clock_ahead_by_.Current(); 346 local_clock_ahead_by_.Current();
348 347
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 } 412 }
414 413
415 void Rtcp::OnReceivedReceiverLog(const RtcpReceiverLogMessage& receiver_log) { 414 void Rtcp::OnReceivedReceiverLog(const RtcpReceiverLogMessage& receiver_log) {
416 if (log_callback_.is_null()) 415 if (log_callback_.is_null())
417 return; 416 return;
418 log_callback_.Run(receiver_log); 417 log_callback_.Run(receiver_log);
419 } 418 }
420 419
421 } // namespace cast 420 } // namespace cast
422 } // namespace media 421 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/net/rtcp/rtcp.h ('k') | media/cast/net/rtcp/rtcp_builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698