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 <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <cmath> | 9 #include <cmath> |
10 | 10 |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "media/cast/net/cast_transport_defines.h" | 12 #include "media/cast/net/cast_transport_defines.h" |
13 | 13 |
14 namespace media { | 14 namespace media { |
15 namespace cast { | 15 namespace cast { |
16 | 16 |
17 namespace { | 17 namespace { |
18 | 18 |
19 // January 1970, in NTP seconds. | 19 // January 1970, in NTP seconds. |
20 // Network Time Protocol (NTP), which is in seconds relative to 0h UTC on | 20 // Network Time Protocol (NTP), which is in seconds relative to 0h UTC on |
21 // 1 January 1900. | 21 // 1 January 1900. |
22 const int64_t kUnixEpochInNtpSeconds = INT64_C(2208988800); | 22 const int64_t kUnixEpochInNtpSeconds = INT64_C(2208988800); |
23 | 23 |
24 // Magic fractional unit. Used to convert time (in microseconds) to/from | 24 // Magic fractional unit. Used to convert time (in microseconds) to/from |
25 // fractional NTP seconds. | 25 // fractional NTP seconds. |
26 const double kMagicFractionalUnit = 4.294967296E3; | 26 const double kMagicFractionalUnit = 4.294967296E3; |
27 } | 27 |
| 28 } // namespace |
28 | 29 |
29 RtcpParser::RtcpParser(uint32_t local_ssrc, uint32_t remote_ssrc) | 30 RtcpParser::RtcpParser(uint32_t local_ssrc, uint32_t remote_ssrc) |
30 : local_ssrc_(local_ssrc), | 31 : local_ssrc_(local_ssrc), |
31 remote_ssrc_(remote_ssrc), | 32 remote_ssrc_(remote_ssrc), |
32 has_sender_report_(false), | 33 has_sender_report_(false), |
33 has_last_report_(false), | 34 has_last_report_(false), |
34 has_cast_message_(false), | 35 has_cast_message_(false), |
35 has_receiver_reference_time_report_(false) {} | 36 has_receiver_reference_time_report_(false) {} |
36 | 37 |
37 RtcpParser::~RtcpParser() {} | 38 RtcpParser::~RtcpParser() {} |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 if (!reader->ReadU32(&sender_ssrc) || | 191 if (!reader->ReadU32(&sender_ssrc) || |
191 !reader->ReadU32(&name)) | 192 !reader->ReadU32(&name)) |
192 return false; | 193 return false; |
193 | 194 |
194 if (sender_ssrc != remote_ssrc_) | 195 if (sender_ssrc != remote_ssrc_) |
195 return true; | 196 return true; |
196 | 197 |
197 if (name != kCast) | 198 if (name != kCast) |
198 return false; | 199 return false; |
199 | 200 |
200 switch (header.IC /* subtype */ ) { | 201 switch (header.IC) { // subtype |
201 case kReceiverLogSubtype: | 202 case kReceiverLogSubtype: |
202 if (!ParseCastReceiverLogFrameItem(reader)) | 203 if (!ParseCastReceiverLogFrameItem(reader)) |
203 return false; | 204 return false; |
204 break; | 205 break; |
205 } | 206 } |
206 return true; | 207 return true; |
207 } | 208 } |
208 | 209 |
209 bool RtcpParser::ParseCastReceiverLogFrameItem( | 210 bool RtcpParser::ParseCastReceiverLogFrameItem( |
210 base::BigEndianReader* reader) { | 211 base::BigEndianReader* reader) { |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 } | 348 } |
348 } | 349 } |
349 | 350 |
350 return true; | 351 return true; |
351 } | 352 } |
352 | 353 |
353 bool RtcpParser::ParseExtendedReportReceiverReferenceTimeReport( | 354 bool RtcpParser::ParseExtendedReportReceiverReferenceTimeReport( |
354 base::BigEndianReader* reader, | 355 base::BigEndianReader* reader, |
355 uint32_t remote_ssrc) { | 356 uint32_t remote_ssrc) { |
356 receiver_reference_time_report_.remote_ssrc = remote_ssrc; | 357 receiver_reference_time_report_.remote_ssrc = remote_ssrc; |
357 if(!reader->ReadU32(&receiver_reference_time_report_.ntp_seconds) || | 358 if (!reader->ReadU32(&receiver_reference_time_report_.ntp_seconds) || |
358 !reader->ReadU32(&receiver_reference_time_report_.ntp_fraction)) | 359 !reader->ReadU32(&receiver_reference_time_report_.ntp_fraction)) |
359 return false; | 360 return false; |
360 | 361 |
361 has_receiver_reference_time_report_ = true; | 362 has_receiver_reference_time_report_ = true; |
362 return true; | 363 return true; |
363 } | 364 } |
364 | 365 |
365 // Converts a log event type to an integer value. | 366 // Converts a log event type to an integer value. |
366 // NOTE: We have only allocated 4 bits to represent the type of event over the | 367 // NOTE: We have only allocated 4 bits to represent the type of event over the |
367 // wire. Therefore, this function can only return values from 0 to 15. | 368 // wire. Therefore, this function can only return values from 0 to 15. |
368 uint8_t ConvertEventTypeToWireFormat(CastLoggingEvent event) { | 369 uint8_t ConvertEventTypeToWireFormat(CastLoggingEvent event) { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 int64_t ntp_time_us = | 448 int64_t ntp_time_us = |
448 ntp_seconds * base::Time::kMicrosecondsPerSecond + | 449 ntp_seconds * base::Time::kMicrosecondsPerSecond + |
449 static_cast<int64_t>(std::ceil(ntp_fractions / kMagicFractionalUnit)); | 450 static_cast<int64_t>(std::ceil(ntp_fractions / kMagicFractionalUnit)); |
450 | 451 |
451 base::TimeDelta elapsed_since_unix_epoch = base::TimeDelta::FromMicroseconds( | 452 base::TimeDelta elapsed_since_unix_epoch = base::TimeDelta::FromMicroseconds( |
452 ntp_time_us - | 453 ntp_time_us - |
453 (kUnixEpochInNtpSeconds * base::Time::kMicrosecondsPerSecond)); | 454 (kUnixEpochInNtpSeconds * base::Time::kMicrosecondsPerSecond)); |
454 return base::TimeTicks::UnixEpoch() + elapsed_since_unix_epoch; | 455 return base::TimeTicks::UnixEpoch() + elapsed_since_unix_epoch; |
455 } | 456 } |
456 | 457 |
| 458 namespace { |
| 459 enum { |
| 460 // Minimum number of bytes required to make a valid RTCP packet. |
| 461 kMinLengthOfRtcp = 8, |
| 462 }; |
| 463 } // namespace |
| 464 |
| 465 bool IsRtcpPacket(const uint8_t* packet, size_t length) { |
| 466 if (length < kMinLengthOfRtcp) { |
| 467 LOG(ERROR) << "Invalid RTCP packet received."; |
| 468 return false; |
| 469 } |
| 470 |
| 471 uint8_t packet_type = packet[1]; |
| 472 return packet_type >= kPacketTypeLow && packet_type <= kPacketTypeHigh; |
| 473 } |
| 474 |
| 475 uint32_t GetSsrcOfSender(const uint8_t* rtcp_buffer, size_t length) { |
| 476 if (length < kMinLengthOfRtcp) |
| 477 return 0; |
| 478 uint32_t ssrc_of_sender; |
| 479 base::BigEndianReader big_endian_reader( |
| 480 reinterpret_cast<const char*>(rtcp_buffer), length); |
| 481 big_endian_reader.Skip(4); // Skip header. |
| 482 big_endian_reader.ReadU32(&ssrc_of_sender); |
| 483 return ssrc_of_sender; |
| 484 } |
| 485 |
457 } // namespace cast | 486 } // namespace cast |
458 } // namespace media | 487 } // namespace media |
OLD | NEW |