| Index: media/cast/net/rtcp/rtcp_utility.cc
|
| diff --git a/media/cast/net/rtcp/rtcp_utility.cc b/media/cast/net/rtcp/rtcp_utility.cc
|
| index ba2ef025fbe6ee796ce57974b529a667642b9bd5..874cb6a6bf636a1722d116bf8d195834fed03ad2 100644
|
| --- a/media/cast/net/rtcp/rtcp_utility.cc
|
| +++ b/media/cast/net/rtcp/rtcp_utility.cc
|
| @@ -22,7 +22,8 @@ const int64_t kUnixEpochInNtpSeconds = INT64_C(2208988800);
|
| // Magic fractional unit. Used to convert time (in microseconds) to/from
|
| // fractional NTP seconds.
|
| const double kMagicFractionalUnit = 4.294967296E3;
|
| -}
|
| +
|
| +} // namespace
|
|
|
| RtcpParser::RtcpParser(uint32 local_ssrc, uint32 remote_ssrc) :
|
| local_ssrc_(local_ssrc),
|
| @@ -196,7 +197,7 @@ bool RtcpParser::ParseApplicationDefined(base::BigEndianReader* reader,
|
| if (name != kCast)
|
| return false;
|
|
|
| - switch (header.IC /* subtype */ ) {
|
| + switch (header.IC) { // subtype
|
| case kReceiverLogSubtype:
|
| if (!ParseCastReceiverLogFrameItem(reader))
|
| return false;
|
| @@ -353,8 +354,8 @@ bool RtcpParser::ParseExtendedReportReceiverReferenceTimeReport(
|
| base::BigEndianReader* reader,
|
| uint32 remote_ssrc) {
|
| receiver_reference_time_report_.remote_ssrc = remote_ssrc;
|
| - if(!reader->ReadU32(&receiver_reference_time_report_.ntp_seconds) ||
|
| - !reader->ReadU32(&receiver_reference_time_report_.ntp_fraction))
|
| + if (!reader->ReadU32(&receiver_reference_time_report_.ntp_seconds) ||
|
| + !reader->ReadU32(&receiver_reference_time_report_.ntp_fraction))
|
| return false;
|
|
|
| has_receiver_reference_time_report_ = true;
|
| @@ -453,5 +454,33 @@ base::TimeTicks ConvertNtpToTimeTicks(uint32_t ntp_seconds,
|
| return base::TimeTicks::UnixEpoch() + elapsed_since_unix_epoch;
|
| }
|
|
|
| +namespace {
|
| +enum {
|
| + // Minimum number of bytes required to make a valid RTCP packet.
|
| + kMinLengthOfRtcp = 8,
|
| +};
|
| +} // namespace
|
| +
|
| +bool IsRtcpPacket(const uint8_t* packet, size_t length) {
|
| + if (length < kMinLengthOfRtcp) {
|
| + LOG(ERROR) << "Invalid RTCP packet received.";
|
| + return false;
|
| + }
|
| +
|
| + uint8_t packet_type = packet[1];
|
| + return packet_type >= kPacketTypeLow && packet_type <= kPacketTypeHigh;
|
| +}
|
| +
|
| +uint32_t GetSsrcOfSender(const uint8_t* rtcp_buffer, size_t length) {
|
| + if (length < kMinLengthOfRtcp)
|
| + return 0;
|
| + uint32_t ssrc_of_sender;
|
| + base::BigEndianReader big_endian_reader(
|
| + reinterpret_cast<const char*>(rtcp_buffer), length);
|
| + big_endian_reader.Skip(4); // Skip header.
|
| + big_endian_reader.ReadU32(&ssrc_of_sender);
|
| + return ssrc_of_sender;
|
| +}
|
| +
|
| } // namespace cast
|
| } // namespace media
|
|
|