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

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

Issue 1534273002: Switch to standard integer types in media/. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: more Created 5 years 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
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_utility.h" 5 #include "media/cast/net/rtcp/rtcp_utility.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "media/cast/net/cast_transport_defines.h" 10 #include "media/cast/net/cast_transport_defines.h"
11 11
12 namespace media { 12 namespace media {
13 namespace cast { 13 namespace cast {
14 14
15 namespace { 15 namespace {
16 16
17 // January 1970, in NTP seconds. 17 // January 1970, in NTP seconds.
18 // Network Time Protocol (NTP), which is in seconds relative to 0h UTC on 18 // Network Time Protocol (NTP), which is in seconds relative to 0h UTC on
19 // 1 January 1900. 19 // 1 January 1900.
20 const int64_t kUnixEpochInNtpSeconds = INT64_C(2208988800); 20 const int64_t kUnixEpochInNtpSeconds = INT64_C(2208988800);
21 21
22 // Magic fractional unit. Used to convert time (in microseconds) to/from 22 // Magic fractional unit. Used to convert time (in microseconds) to/from
23 // fractional NTP seconds. 23 // fractional NTP seconds.
24 const double kMagicFractionalUnit = 4.294967296E3; 24 const double kMagicFractionalUnit = 4.294967296E3;
25 } 25 }
26 26
27 RtcpParser::RtcpParser(uint32 local_ssrc, uint32 remote_ssrc) : 27 RtcpParser::RtcpParser(uint32_t local_ssrc, uint32_t remote_ssrc)
28 local_ssrc_(local_ssrc), 28 : local_ssrc_(local_ssrc),
29 remote_ssrc_(remote_ssrc), 29 remote_ssrc_(remote_ssrc),
30 has_sender_report_(false), 30 has_sender_report_(false),
31 has_last_report_(false), 31 has_last_report_(false),
32 has_cast_message_(false), 32 has_cast_message_(false),
33 has_receiver_reference_time_report_(false) { 33 has_receiver_reference_time_report_(false) {}
34 }
35 34
36 RtcpParser::~RtcpParser() {} 35 RtcpParser::~RtcpParser() {}
37 36
38 bool RtcpParser::Parse(base::BigEndianReader* reader) { 37 bool RtcpParser::Parse(base::BigEndianReader* reader) {
39 while (reader->remaining()) { 38 while (reader->remaining()) {
40 RtcpCommonHeader header; 39 RtcpCommonHeader header;
41 if (!ParseCommonHeader(reader, &header)) 40 if (!ParseCommonHeader(reader, &header))
42 return false; 41 return false;
43 42
44 base::StringPiece tmp; 43 base::StringPiece tmp;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 bool RtcpParser::ParseCommonHeader(base::BigEndianReader* reader, 78 bool RtcpParser::ParseCommonHeader(base::BigEndianReader* reader,
80 RtcpCommonHeader* parsed_header) { 79 RtcpCommonHeader* parsed_header) {
81 // 0 1 2 3 80 // 0 1 2 3
82 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 81 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
83 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 82 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
84 // |V=2|P| IC | PT | length | 83 // |V=2|P| IC | PT | length |
85 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 84 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
86 // 85 //
87 // Common header for all Rtcp packets, 4 octets. 86 // Common header for all Rtcp packets, 4 octets.
88 87
89 uint8 byte; 88 uint8_t byte;
90 if (!reader->ReadU8(&byte)) 89 if (!reader->ReadU8(&byte))
91 return false; 90 return false;
92 parsed_header->V = byte >> 6; 91 parsed_header->V = byte >> 6;
93 parsed_header->P = ((byte & 0x20) == 0) ? false : true; 92 parsed_header->P = ((byte & 0x20) == 0) ? false : true;
94 93
95 // Check if RTP version field == 2. 94 // Check if RTP version field == 2.
96 if (parsed_header->V != 2) 95 if (parsed_header->V != 2)
97 return false; 96 return false;
98 97
99 parsed_header->IC = byte & 0x1f; 98 parsed_header->IC = byte & 0x1f;
100 if (!reader->ReadU8(&parsed_header->PT)) 99 if (!reader->ReadU8(&parsed_header->PT))
101 return false; 100 return false;
102 101
103 uint16 bytes; 102 uint16_t bytes;
104 if (!reader->ReadU16(&bytes)) 103 if (!reader->ReadU16(&bytes))
105 return false; 104 return false;
106 105
107 parsed_header->length_in_octets = (static_cast<size_t>(bytes) + 1) * 4; 106 parsed_header->length_in_octets = (static_cast<size_t>(bytes) + 1) * 4;
108 107
109 if (parsed_header->length_in_octets == 0) 108 if (parsed_header->length_in_octets == 0)
110 return false; 109 return false;
111 110
112 return true; 111 return true;
113 } 112 }
114 113
115 bool RtcpParser::ParseSR(base::BigEndianReader* reader, 114 bool RtcpParser::ParseSR(base::BigEndianReader* reader,
116 const RtcpCommonHeader& header) { 115 const RtcpCommonHeader& header) {
117 uint32 sender_ssrc; 116 uint32_t sender_ssrc;
118 if (!reader->ReadU32(&sender_ssrc)) 117 if (!reader->ReadU32(&sender_ssrc))
119 return false; 118 return false;
120 119
121 if (sender_ssrc != remote_ssrc_) 120 if (sender_ssrc != remote_ssrc_)
122 return true; 121 return true;
123 122
124 uint32 tmp; 123 uint32_t tmp;
125 if (!reader->ReadU32(&sender_report_.ntp_seconds) || 124 if (!reader->ReadU32(&sender_report_.ntp_seconds) ||
126 !reader->ReadU32(&sender_report_.ntp_fraction) || 125 !reader->ReadU32(&sender_report_.ntp_fraction) ||
127 !reader->ReadU32(&sender_report_.rtp_timestamp) || 126 !reader->ReadU32(&sender_report_.rtp_timestamp) ||
128 !reader->ReadU32(&sender_report_.send_packet_count) || 127 !reader->ReadU32(&sender_report_.send_packet_count) ||
129 !reader->ReadU32(&tmp)) 128 !reader->ReadU32(&tmp))
130 return false; 129 return false;
131 sender_report_.send_octet_count = tmp; 130 sender_report_.send_octet_count = tmp;
132 has_sender_report_ = true; 131 has_sender_report_ = true;
133 132
134 for (size_t block = 0; block < header.IC; block++) 133 for (size_t block = 0; block < header.IC; block++)
135 if (!ParseReportBlock(reader)) 134 if (!ParseReportBlock(reader))
136 return false; 135 return false;
137 136
138 return true; 137 return true;
139 } 138 }
140 139
141 bool RtcpParser::ParseRR(base::BigEndianReader* reader, 140 bool RtcpParser::ParseRR(base::BigEndianReader* reader,
142 const RtcpCommonHeader& header) { 141 const RtcpCommonHeader& header) {
143 uint32 receiver_ssrc; 142 uint32_t receiver_ssrc;
144 if (!reader->ReadU32(&receiver_ssrc)) 143 if (!reader->ReadU32(&receiver_ssrc))
145 return false; 144 return false;
146 145
147 if (receiver_ssrc != remote_ssrc_) 146 if (receiver_ssrc != remote_ssrc_)
148 return true; 147 return true;
149 148
150 for (size_t block = 0; block < header.IC; block++) 149 for (size_t block = 0; block < header.IC; block++)
151 if (!ParseReportBlock(reader)) 150 if (!ParseReportBlock(reader))
152 return false; 151 return false;
153 152
154 return true; 153 return true;
155 } 154 }
156 155
157 bool RtcpParser::ParseReportBlock(base::BigEndianReader* reader) { 156 bool RtcpParser::ParseReportBlock(base::BigEndianReader* reader) {
158 uint32 ssrc, last_report, delay; 157 uint32_t ssrc, last_report, delay;
159 if (!reader->ReadU32(&ssrc) || 158 if (!reader->ReadU32(&ssrc) ||
160 !reader->Skip(12) || 159 !reader->Skip(12) ||
161 !reader->ReadU32(&last_report) || 160 !reader->ReadU32(&last_report) ||
162 !reader->ReadU32(&delay)) 161 !reader->ReadU32(&delay))
163 return false; 162 return false;
164 163
165 if (ssrc == local_ssrc_) { 164 if (ssrc == local_ssrc_) {
166 last_report_ = last_report; 165 last_report_ = last_report;
167 delay_since_last_report_ = delay; 166 delay_since_last_report_ = delay;
168 has_last_report_ = true; 167 has_last_report_ = true;
169 } 168 }
170 169
171 return true; 170 return true;
172 } 171 }
173 172
174 bool RtcpParser::ParseApplicationDefined(base::BigEndianReader* reader, 173 bool RtcpParser::ParseApplicationDefined(base::BigEndianReader* reader,
175 const RtcpCommonHeader& header) { 174 const RtcpCommonHeader& header) {
176 uint32 sender_ssrc; 175 uint32_t sender_ssrc;
177 uint32 name; 176 uint32_t name;
178 if (!reader->ReadU32(&sender_ssrc) || 177 if (!reader->ReadU32(&sender_ssrc) ||
179 !reader->ReadU32(&name)) 178 !reader->ReadU32(&name))
180 return false; 179 return false;
181 180
182 if (sender_ssrc != remote_ssrc_) 181 if (sender_ssrc != remote_ssrc_)
183 return true; 182 return true;
184 183
185 if (name != kCast) 184 if (name != kCast)
186 return false; 185 return false;
187 186
188 switch (header.IC /* subtype */ ) { 187 switch (header.IC /* subtype */ ) {
189 case kReceiverLogSubtype: 188 case kReceiverLogSubtype:
190 if (!ParseCastReceiverLogFrameItem(reader)) 189 if (!ParseCastReceiverLogFrameItem(reader))
191 return false; 190 return false;
192 break; 191 break;
193 } 192 }
194 return true; 193 return true;
195 } 194 }
196 195
197 bool RtcpParser::ParseCastReceiverLogFrameItem( 196 bool RtcpParser::ParseCastReceiverLogFrameItem(
198 base::BigEndianReader* reader) { 197 base::BigEndianReader* reader) {
199 198
200 while (reader->remaining()) { 199 while (reader->remaining()) {
201 uint32 rtp_timestamp; 200 uint32_t rtp_timestamp;
202 uint32 data; 201 uint32_t data;
203 if (!reader->ReadU32(&rtp_timestamp) || 202 if (!reader->ReadU32(&rtp_timestamp) ||
204 !reader->ReadU32(&data)) 203 !reader->ReadU32(&data))
205 return false; 204 return false;
206 205
207 // We have 24 LSB of the event timestamp base on the wire. 206 // We have 24 LSB of the event timestamp base on the wire.
208 base::TimeTicks event_timestamp_base = base::TimeTicks() + 207 base::TimeTicks event_timestamp_base = base::TimeTicks() +
209 base::TimeDelta::FromMilliseconds(data & 0xffffff); 208 base::TimeDelta::FromMilliseconds(data & 0xffffff);
210 209
211 size_t num_events = 1 + static_cast<uint8>(data >> 24); 210 size_t num_events = 1 + static_cast<uint8_t>(data >> 24);
212 211
213 RtcpReceiverFrameLogMessage frame_log(rtp_timestamp); 212 RtcpReceiverFrameLogMessage frame_log(rtp_timestamp);
214 for (size_t event = 0; event < num_events; event++) { 213 for (size_t event = 0; event < num_events; event++) {
215 uint16 delay_delta_or_packet_id; 214 uint16_t delay_delta_or_packet_id;
216 uint16 event_type_and_timestamp_delta; 215 uint16_t event_type_and_timestamp_delta;
217 if (!reader->ReadU16(&delay_delta_or_packet_id) || 216 if (!reader->ReadU16(&delay_delta_or_packet_id) ||
218 !reader->ReadU16(&event_type_and_timestamp_delta)) 217 !reader->ReadU16(&event_type_and_timestamp_delta))
219 return false; 218 return false;
220 219
221 RtcpReceiverEventLogMessage event_log; 220 RtcpReceiverEventLogMessage event_log;
222 event_log.type = TranslateToLogEventFromWireFormat( 221 event_log.type = TranslateToLogEventFromWireFormat(
223 static_cast<uint8>(event_type_and_timestamp_delta >> 12)); 222 static_cast<uint8_t>(event_type_and_timestamp_delta >> 12));
224 event_log.event_timestamp = 223 event_log.event_timestamp =
225 event_timestamp_base + 224 event_timestamp_base +
226 base::TimeDelta::FromMilliseconds( 225 base::TimeDelta::FromMilliseconds(
227 event_type_and_timestamp_delta & 0xfff); 226 event_type_and_timestamp_delta & 0xfff);
228 if (event_log.type == PACKET_RECEIVED) { 227 if (event_log.type == PACKET_RECEIVED) {
229 event_log.packet_id = delay_delta_or_packet_id; 228 event_log.packet_id = delay_delta_or_packet_id;
230 } else { 229 } else {
231 event_log.delay_delta = base::TimeDelta::FromMilliseconds( 230 event_log.delay_delta = base::TimeDelta::FromMilliseconds(
232 static_cast<int16>(delay_delta_or_packet_id)); 231 static_cast<int16_t>(delay_delta_or_packet_id));
233 } 232 }
234 frame_log.event_log_messages_.push_back(event_log); 233 frame_log.event_log_messages_.push_back(event_log);
235 } 234 }
236 235
237 receiver_log_.push_back(frame_log); 236 receiver_log_.push_back(frame_log);
238 } 237 }
239 238
240 return true; 239 return true;
241 } 240 }
242 241
243 // RFC 4585. 242 // RFC 4585.
244 bool RtcpParser::ParseFeedbackCommon(base::BigEndianReader* reader, 243 bool RtcpParser::ParseFeedbackCommon(base::BigEndianReader* reader,
245 const RtcpCommonHeader& header) { 244 const RtcpCommonHeader& header) {
246 // See RTC 4585 Section 6.4 for application specific feedback messages. 245 // See RTC 4585 Section 6.4 for application specific feedback messages.
247 if (header.IC != 15) { 246 if (header.IC != 15) {
248 return true; 247 return true;
249 } 248 }
250 uint32 remote_ssrc; 249 uint32_t remote_ssrc;
251 uint32 media_ssrc; 250 uint32_t media_ssrc;
252 if (!reader->ReadU32(&remote_ssrc) || 251 if (!reader->ReadU32(&remote_ssrc) ||
253 !reader->ReadU32(&media_ssrc)) 252 !reader->ReadU32(&media_ssrc))
254 return false; 253 return false;
255 254
256 if (remote_ssrc != remote_ssrc_) 255 if (remote_ssrc != remote_ssrc_)
257 return true; 256 return true;
258 257
259 uint32 name; 258 uint32_t name;
260 if (!reader->ReadU32(&name)) 259 if (!reader->ReadU32(&name))
261 return false; 260 return false;
262 261
263 if (name != kCast) { 262 if (name != kCast) {
264 return true; 263 return true;
265 } 264 }
266 265
267 cast_message_.media_ssrc = remote_ssrc; 266 cast_message_.media_ssrc = remote_ssrc;
268 267
269 uint8 last_frame_id; 268 uint8_t last_frame_id;
270 uint8 number_of_lost_fields; 269 uint8_t number_of_lost_fields;
271 if (!reader->ReadU8(&last_frame_id) || 270 if (!reader->ReadU8(&last_frame_id) ||
272 !reader->ReadU8(&number_of_lost_fields) || 271 !reader->ReadU8(&number_of_lost_fields) ||
273 !reader->ReadU16(&cast_message_.target_delay_ms)) 272 !reader->ReadU16(&cast_message_.target_delay_ms))
274 return false; 273 return false;
275 274
276 // Please note, this frame_id is still only 8-bit! 275 // Please note, this frame_id is still only 8-bit!
277 cast_message_.ack_frame_id = last_frame_id; 276 cast_message_.ack_frame_id = last_frame_id;
278 277
279 for (size_t i = 0; i < number_of_lost_fields; i++) { 278 for (size_t i = 0; i < number_of_lost_fields; i++) {
280 uint8 frame_id; 279 uint8_t frame_id;
281 uint16 packet_id; 280 uint16_t packet_id;
282 uint8 bitmask; 281 uint8_t bitmask;
283 if (!reader->ReadU8(&frame_id) || 282 if (!reader->ReadU8(&frame_id) ||
284 !reader->ReadU16(&packet_id) || 283 !reader->ReadU16(&packet_id) ||
285 !reader->ReadU8(&bitmask)) 284 !reader->ReadU8(&bitmask))
286 return false; 285 return false;
287 cast_message_.missing_frames_and_packets[frame_id].insert(packet_id); 286 cast_message_.missing_frames_and_packets[frame_id].insert(packet_id);
288 if (packet_id != kRtcpCastAllPacketsLost) { 287 if (packet_id != kRtcpCastAllPacketsLost) {
289 while (bitmask) { 288 while (bitmask) {
290 packet_id++; 289 packet_id++;
291 if (bitmask & 1) 290 if (bitmask & 1)
292 cast_message_.missing_frames_and_packets[frame_id].insert(packet_id); 291 cast_message_.missing_frames_and_packets[frame_id].insert(packet_id);
293 bitmask >>= 1; 292 bitmask >>= 1;
294 } 293 }
295 } 294 }
296 } 295 }
297 296
298 has_cast_message_ = true; 297 has_cast_message_ = true;
299 return true; 298 return true;
300 } 299 }
301 300
302 bool RtcpParser::ParseExtendedReport(base::BigEndianReader* reader, 301 bool RtcpParser::ParseExtendedReport(base::BigEndianReader* reader,
303 const RtcpCommonHeader& header) { 302 const RtcpCommonHeader& header) {
304 uint32 remote_ssrc; 303 uint32_t remote_ssrc;
305 if (!reader->ReadU32(&remote_ssrc)) 304 if (!reader->ReadU32(&remote_ssrc))
306 return false; 305 return false;
307 306
308 // Is it for us? 307 // Is it for us?
309 if (remote_ssrc != remote_ssrc_) 308 if (remote_ssrc != remote_ssrc_)
310 return true; 309 return true;
311 310
312 while (reader->remaining()) { 311 while (reader->remaining()) {
313 uint8 block_type; 312 uint8_t block_type;
314 uint16 block_length; 313 uint16_t block_length;
315 if (!reader->ReadU8(&block_type) || 314 if (!reader->ReadU8(&block_type) ||
316 !reader->Skip(1) || 315 !reader->Skip(1) ||
317 !reader->ReadU16(&block_length)) 316 !reader->ReadU16(&block_length))
318 return false; 317 return false;
319 318
320 switch (block_type) { 319 switch (block_type) {
321 case 4: // RRTR. RFC3611 Section 4.4. 320 case 4: // RRTR. RFC3611 Section 4.4.
322 if (block_length != 2) 321 if (block_length != 2)
323 return false; 322 return false;
324 if (!ParseExtendedReportReceiverReferenceTimeReport(reader, 323 if (!ParseExtendedReportReceiverReferenceTimeReport(reader,
325 remote_ssrc)) 324 remote_ssrc))
326 return false; 325 return false;
327 break; 326 break;
328 327
329 default: 328 default:
330 // Skip unknown item. 329 // Skip unknown item.
331 if (!reader->Skip(block_length * 4)) 330 if (!reader->Skip(block_length * 4))
332 return false; 331 return false;
333 } 332 }
334 } 333 }
335 334
336 return true; 335 return true;
337 } 336 }
338 337
339 bool RtcpParser::ParseExtendedReportReceiverReferenceTimeReport( 338 bool RtcpParser::ParseExtendedReportReceiverReferenceTimeReport(
340 base::BigEndianReader* reader, 339 base::BigEndianReader* reader,
341 uint32 remote_ssrc) { 340 uint32_t remote_ssrc) {
342 receiver_reference_time_report_.remote_ssrc = remote_ssrc; 341 receiver_reference_time_report_.remote_ssrc = remote_ssrc;
343 if(!reader->ReadU32(&receiver_reference_time_report_.ntp_seconds) || 342 if(!reader->ReadU32(&receiver_reference_time_report_.ntp_seconds) ||
344 !reader->ReadU32(&receiver_reference_time_report_.ntp_fraction)) 343 !reader->ReadU32(&receiver_reference_time_report_.ntp_fraction))
345 return false; 344 return false;
346 345
347 has_receiver_reference_time_report_ = true; 346 has_receiver_reference_time_report_ = true;
348 return true; 347 return true;
349 } 348 }
350 349
351 // Converts a log event type to an integer value. 350 // Converts a log event type to an integer value.
352 // NOTE: We have only allocated 4 bits to represent the type of event over the 351 // NOTE: We have only allocated 4 bits to represent the type of event over the
353 // wire. Therefore, this function can only return values from 0 to 15. 352 // wire. Therefore, this function can only return values from 0 to 15.
354 uint8 ConvertEventTypeToWireFormat(CastLoggingEvent event) { 353 uint8_t ConvertEventTypeToWireFormat(CastLoggingEvent event) {
355 switch (event) { 354 switch (event) {
356 case FRAME_ACK_SENT: 355 case FRAME_ACK_SENT:
357 return 11; 356 return 11;
358 case FRAME_PLAYOUT: 357 case FRAME_PLAYOUT:
359 return 12; 358 return 12;
360 case FRAME_DECODED: 359 case FRAME_DECODED:
361 return 13; 360 return 13;
362 case PACKET_RECEIVED: 361 case PACKET_RECEIVED:
363 return 14; 362 return 14;
364 default: 363 default:
365 return 0; // Not an interesting event. 364 return 0; // Not an interesting event.
366 } 365 }
367 } 366 }
368 367
369 CastLoggingEvent TranslateToLogEventFromWireFormat(uint8 event) { 368 CastLoggingEvent TranslateToLogEventFromWireFormat(uint8_t event) {
370 // TODO(imcheng): Remove the old mappings once they are no longer used. 369 // TODO(imcheng): Remove the old mappings once they are no longer used.
371 switch (event) { 370 switch (event) {
372 case 1: // AudioAckSent 371 case 1: // AudioAckSent
373 case 5: // VideoAckSent 372 case 5: // VideoAckSent
374 case 11: // Unified 373 case 11: // Unified
375 return FRAME_ACK_SENT; 374 return FRAME_ACK_SENT;
376 case 2: // AudioPlayoutDelay 375 case 2: // AudioPlayoutDelay
377 case 7: // VideoRenderDelay 376 case 7: // VideoRenderDelay
378 case 12: // Unified 377 case 12: // Unified
379 return FRAME_PLAYOUT; 378 return FRAME_PLAYOUT;
(...skipping 20 matching lines...) Expand all
400 uint32_t* fractions) { 399 uint32_t* fractions) {
401 DCHECK_GE(ntp_time_us, 0) << "Time must NOT be negative"; 400 DCHECK_GE(ntp_time_us, 0) << "Time must NOT be negative";
402 const int64_t seconds_component = 401 const int64_t seconds_component =
403 ntp_time_us / base::Time::kMicrosecondsPerSecond; 402 ntp_time_us / base::Time::kMicrosecondsPerSecond;
404 // NTP time will overflow in the year 2036. Also, make sure unit tests don't 403 // NTP time will overflow in the year 2036. Also, make sure unit tests don't
405 // regress and use an origin past the year 2036. If this overflows here, the 404 // regress and use an origin past the year 2036. If this overflows here, the
406 // inverse calculation fails to compute the correct TimeTicks value, throwing 405 // inverse calculation fails to compute the correct TimeTicks value, throwing
407 // off the entire system. 406 // off the entire system.
408 DCHECK_LT(seconds_component, INT64_C(4263431296)) 407 DCHECK_LT(seconds_component, INT64_C(4263431296))
409 << "One year left to fix the NTP year 2036 wrap-around issue!"; 408 << "One year left to fix the NTP year 2036 wrap-around issue!";
410 *seconds = static_cast<uint32>(seconds_component); 409 *seconds = static_cast<uint32_t>(seconds_component);
411 *fractions = 410 *fractions =
412 static_cast<uint32>((ntp_time_us % base::Time::kMicrosecondsPerSecond) * 411 static_cast<uint32_t>((ntp_time_us % base::Time::kMicrosecondsPerSecond) *
413 kMagicFractionalUnit); 412 kMagicFractionalUnit);
414 } 413 }
415 414
416 void ConvertTimeTicksToNtp(const base::TimeTicks& time, 415 void ConvertTimeTicksToNtp(const base::TimeTicks& time,
417 uint32_t* ntp_seconds, 416 uint32_t* ntp_seconds,
418 uint32_t* ntp_fractions) { 417 uint32_t* ntp_fractions) {
419 base::TimeDelta elapsed_since_unix_epoch = 418 base::TimeDelta elapsed_since_unix_epoch =
420 time - base::TimeTicks::UnixEpoch(); 419 time - base::TimeTicks::UnixEpoch();
421 420
422 int64_t ntp_time_us = 421 int64_t ntp_time_us =
423 elapsed_since_unix_epoch.InMicroseconds() + 422 elapsed_since_unix_epoch.InMicroseconds() +
(...skipping 11 matching lines...) Expand all
435 static_cast<int64_t>(std::ceil(ntp_fractions / kMagicFractionalUnit)); 434 static_cast<int64_t>(std::ceil(ntp_fractions / kMagicFractionalUnit));
436 435
437 base::TimeDelta elapsed_since_unix_epoch = base::TimeDelta::FromMicroseconds( 436 base::TimeDelta elapsed_since_unix_epoch = base::TimeDelta::FromMicroseconds(
438 ntp_time_us - 437 ntp_time_us -
439 (kUnixEpochInNtpSeconds * base::Time::kMicrosecondsPerSecond)); 438 (kUnixEpochInNtpSeconds * base::Time::kMicrosecondsPerSecond));
440 return base::TimeTicks::UnixEpoch() + elapsed_since_unix_epoch; 439 return base::TimeTicks::UnixEpoch() + elapsed_since_unix_epoch;
441 } 440 }
442 441
443 } // namespace cast 442 } // namespace cast
444 } // namespace media 443 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698