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_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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |