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" |
(...skipping 18 matching lines...) Expand all Loading... |
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 } | 34 } |
35 | 35 |
36 RtcpParser::~RtcpParser() {} | 36 RtcpParser::~RtcpParser() {} |
37 | 37 |
38 bool RtcpParser::Parse(base::BigEndianReader* reader) { | 38 bool RtcpParser::Parse(base::BigEndianReader* reader) { |
| 39 // Reset. |
| 40 has_sender_report_ = false; |
| 41 sender_report_ = RtcpSenderInfo(); |
| 42 has_last_report_ = false; |
| 43 receiver_log_.clear(); |
| 44 has_cast_message_ = false; |
| 45 has_receiver_reference_time_report_ = false; |
| 46 |
39 while (reader->remaining()) { | 47 while (reader->remaining()) { |
40 RtcpCommonHeader header; | 48 RtcpCommonHeader header; |
41 if (!ParseCommonHeader(reader, &header)) | 49 if (!ParseCommonHeader(reader, &header)) |
42 return false; | 50 return false; |
43 | 51 |
44 base::StringPiece tmp; | 52 base::StringPiece tmp; |
45 if (!reader->ReadPiece(&tmp, header.length_in_octets - 4)) | 53 if (!reader->ReadPiece(&tmp, header.length_in_octets - 4)) |
46 return false; | 54 return false; |
47 base::BigEndianReader chunk(tmp.data(), tmp.size()); | 55 base::BigEndianReader chunk(tmp.data(), tmp.size()); |
48 | 56 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 | 122 |
115 bool RtcpParser::ParseSR(base::BigEndianReader* reader, | 123 bool RtcpParser::ParseSR(base::BigEndianReader* reader, |
116 const RtcpCommonHeader& header) { | 124 const RtcpCommonHeader& header) { |
117 uint32 sender_ssrc; | 125 uint32 sender_ssrc; |
118 if (!reader->ReadU32(&sender_ssrc)) | 126 if (!reader->ReadU32(&sender_ssrc)) |
119 return false; | 127 return false; |
120 | 128 |
121 if (sender_ssrc != remote_ssrc_) | 129 if (sender_ssrc != remote_ssrc_) |
122 return true; | 130 return true; |
123 | 131 |
124 uint32 tmp; | 132 uint32_t truncated_rtp_timestamp; |
| 133 uint32 send_octet_count; |
125 if (!reader->ReadU32(&sender_report_.ntp_seconds) || | 134 if (!reader->ReadU32(&sender_report_.ntp_seconds) || |
126 !reader->ReadU32(&sender_report_.ntp_fraction) || | 135 !reader->ReadU32(&sender_report_.ntp_fraction) || |
127 !reader->ReadU32(&sender_report_.rtp_timestamp) || | 136 !reader->ReadU32(&truncated_rtp_timestamp) || |
128 !reader->ReadU32(&sender_report_.send_packet_count) || | 137 !reader->ReadU32(&sender_report_.send_packet_count) || |
129 !reader->ReadU32(&tmp)) | 138 !reader->ReadU32(&send_octet_count)) |
130 return false; | 139 return false; |
131 sender_report_.send_octet_count = tmp; | 140 sender_report_.rtp_timestamp = last_parsed_sr_rtp_timestamp_ = |
| 141 last_parsed_sr_rtp_timestamp_.Expand(truncated_rtp_timestamp); |
| 142 sender_report_.send_octet_count = send_octet_count; |
132 has_sender_report_ = true; | 143 has_sender_report_ = true; |
133 | 144 |
134 for (size_t block = 0; block < header.IC; block++) | 145 for (size_t block = 0; block < header.IC; block++) |
135 if (!ParseReportBlock(reader)) | 146 if (!ParseReportBlock(reader)) |
136 return false; | 147 return false; |
137 | 148 |
138 return true; | 149 return true; |
139 } | 150 } |
140 | 151 |
141 bool RtcpParser::ParseRR(base::BigEndianReader* reader, | 152 bool RtcpParser::ParseRR(base::BigEndianReader* reader, |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 return false; | 202 return false; |
192 break; | 203 break; |
193 } | 204 } |
194 return true; | 205 return true; |
195 } | 206 } |
196 | 207 |
197 bool RtcpParser::ParseCastReceiverLogFrameItem( | 208 bool RtcpParser::ParseCastReceiverLogFrameItem( |
198 base::BigEndianReader* reader) { | 209 base::BigEndianReader* reader) { |
199 | 210 |
200 while (reader->remaining()) { | 211 while (reader->remaining()) { |
201 uint32 rtp_timestamp; | 212 uint32 truncated_rtp_timestamp; |
202 uint32 data; | 213 uint32 data; |
203 if (!reader->ReadU32(&rtp_timestamp) || | 214 if (!reader->ReadU32(&truncated_rtp_timestamp) || !reader->ReadU32(&data)) |
204 !reader->ReadU32(&data)) | |
205 return false; | 215 return false; |
206 | 216 |
207 // We have 24 LSB of the event timestamp base on the wire. | 217 // We have 24 LSB of the event timestamp base on the wire. |
208 base::TimeTicks event_timestamp_base = base::TimeTicks() + | 218 base::TimeTicks event_timestamp_base = base::TimeTicks() + |
209 base::TimeDelta::FromMilliseconds(data & 0xffffff); | 219 base::TimeDelta::FromMilliseconds(data & 0xffffff); |
210 | 220 |
211 size_t num_events = 1 + static_cast<uint8>(data >> 24); | 221 size_t num_events = 1 + static_cast<uint8>(data >> 24); |
212 | 222 |
213 RtcpReceiverFrameLogMessage frame_log(rtp_timestamp); | 223 const RtpTimeTicks frame_log_rtp_timestamp = |
| 224 last_parsed_frame_log_rtp_timestamp_.Expand(truncated_rtp_timestamp); |
| 225 RtcpReceiverFrameLogMessage frame_log(frame_log_rtp_timestamp); |
214 for (size_t event = 0; event < num_events; event++) { | 226 for (size_t event = 0; event < num_events; event++) { |
215 uint16 delay_delta_or_packet_id; | 227 uint16 delay_delta_or_packet_id; |
216 uint16 event_type_and_timestamp_delta; | 228 uint16 event_type_and_timestamp_delta; |
217 if (!reader->ReadU16(&delay_delta_or_packet_id) || | 229 if (!reader->ReadU16(&delay_delta_or_packet_id) || |
218 !reader->ReadU16(&event_type_and_timestamp_delta)) | 230 !reader->ReadU16(&event_type_and_timestamp_delta)) |
219 return false; | 231 return false; |
220 | 232 |
221 RtcpReceiverEventLogMessage event_log; | 233 RtcpReceiverEventLogMessage event_log; |
222 event_log.type = TranslateToLogEventFromWireFormat( | 234 event_log.type = TranslateToLogEventFromWireFormat( |
223 static_cast<uint8>(event_type_and_timestamp_delta >> 12)); | 235 static_cast<uint8>(event_type_and_timestamp_delta >> 12)); |
224 event_log.event_timestamp = | 236 event_log.event_timestamp = |
225 event_timestamp_base + | 237 event_timestamp_base + |
226 base::TimeDelta::FromMilliseconds( | 238 base::TimeDelta::FromMilliseconds( |
227 event_type_and_timestamp_delta & 0xfff); | 239 event_type_and_timestamp_delta & 0xfff); |
228 if (event_log.type == PACKET_RECEIVED) { | 240 if (event_log.type == PACKET_RECEIVED) { |
229 event_log.packet_id = delay_delta_or_packet_id; | 241 event_log.packet_id = delay_delta_or_packet_id; |
230 } else { | 242 } else { |
231 event_log.delay_delta = base::TimeDelta::FromMilliseconds( | 243 event_log.delay_delta = base::TimeDelta::FromMilliseconds( |
232 static_cast<int16>(delay_delta_or_packet_id)); | 244 static_cast<int16>(delay_delta_or_packet_id)); |
233 } | 245 } |
234 frame_log.event_log_messages_.push_back(event_log); | 246 frame_log.event_log_messages_.push_back(event_log); |
235 } | 247 } |
236 | 248 |
| 249 last_parsed_frame_log_rtp_timestamp_ = frame_log_rtp_timestamp; |
237 receiver_log_.push_back(frame_log); | 250 receiver_log_.push_back(frame_log); |
238 } | 251 } |
239 | 252 |
240 return true; | 253 return true; |
241 } | 254 } |
242 | 255 |
243 // RFC 4585. | 256 // RFC 4585. |
244 bool RtcpParser::ParseFeedbackCommon(base::BigEndianReader* reader, | 257 bool RtcpParser::ParseFeedbackCommon(base::BigEndianReader* reader, |
245 const RtcpCommonHeader& header) { | 258 const RtcpCommonHeader& header) { |
246 // See RTC 4585 Section 6.4 for application specific feedback messages. | 259 // See RTC 4585 Section 6.4 for application specific feedback messages. |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
435 static_cast<int64_t>(std::ceil(ntp_fractions / kMagicFractionalUnit)); | 448 static_cast<int64_t>(std::ceil(ntp_fractions / kMagicFractionalUnit)); |
436 | 449 |
437 base::TimeDelta elapsed_since_unix_epoch = base::TimeDelta::FromMicroseconds( | 450 base::TimeDelta elapsed_since_unix_epoch = base::TimeDelta::FromMicroseconds( |
438 ntp_time_us - | 451 ntp_time_us - |
439 (kUnixEpochInNtpSeconds * base::Time::kMicrosecondsPerSecond)); | 452 (kUnixEpochInNtpSeconds * base::Time::kMicrosecondsPerSecond)); |
440 return base::TimeTicks::UnixEpoch() + elapsed_since_unix_epoch; | 453 return base::TimeTicks::UnixEpoch() + elapsed_since_unix_epoch; |
441 } | 454 } |
442 | 455 |
443 } // namespace cast | 456 } // namespace cast |
444 } // namespace media | 457 } // namespace media |
OLD | NEW |