OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/rtcp/rtcp.h" | 5 #include "media/cast/rtcp/rtcp.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/rand_util.h" | 8 #include "base/rand_util.h" |
9 #include "media/cast/cast_config.h" | 9 #include "media/cast/cast_config.h" |
10 #include "media/cast/cast_defines.h" | 10 #include "media/cast/cast_defines.h" |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 virtual void OnReceiverReferenceTimeReport( | 73 virtual void OnReceiverReferenceTimeReport( |
74 const RtcpReceiverReferenceTimeReport& remote_time_report) OVERRIDE { | 74 const RtcpReceiverReferenceTimeReport& remote_time_report) OVERRIDE { |
75 rtcp_->OnReceivedNtp(remote_time_report.ntp_seconds, | 75 rtcp_->OnReceivedNtp(remote_time_report.ntp_seconds, |
76 remote_time_report.ntp_fraction); | 76 remote_time_report.ntp_fraction); |
77 } | 77 } |
78 | 78 |
79 virtual void OnReceivedSendReportRequest() OVERRIDE { | 79 virtual void OnReceivedSendReportRequest() OVERRIDE { |
80 rtcp_->OnReceivedSendReportRequest(); | 80 rtcp_->OnReceivedSendReportRequest(); |
81 } | 81 } |
82 | 82 |
| 83 virtual void OnReceivedReceiverLog( |
| 84 const RtcpReceiverLogMessage& receiver_log) OVERRIDE { |
| 85 // TODO(pwestin): Implement. |
| 86 // Add received log messages into our log system. |
| 87 NOTIMPLEMENTED(); |
| 88 } |
| 89 |
| 90 virtual void OnReceivedSenderLog( |
| 91 const RtcpSenderLogMessage& sender_log) OVERRIDE { |
| 92 // TODO(pwestin): Implement. |
| 93 // Add received log messages into our log system. |
| 94 NOTIMPLEMENTED(); |
| 95 } |
| 96 |
83 private: | 97 private: |
84 Rtcp* rtcp_; | 98 Rtcp* rtcp_; |
85 }; | 99 }; |
86 | 100 |
87 Rtcp::Rtcp(base::TickClock* clock, | 101 Rtcp::Rtcp(base::TickClock* clock, |
88 RtcpSenderFeedback* sender_feedback, | 102 RtcpSenderFeedback* sender_feedback, |
89 PacedPacketSender* paced_packet_sender, | 103 PacedPacketSender* paced_packet_sender, |
90 RtpSenderStatistics* rtp_sender_statistics, | 104 RtpSenderStatistics* rtp_sender_statistics, |
91 RtpReceiverStatistics* rtp_receiver_statistics, | 105 RtpReceiverStatistics* rtp_receiver_statistics, |
92 RtcpMode rtcp_mode, | 106 RtcpMode rtcp_mode, |
93 const base::TimeDelta& rtcp_interval, | 107 const base::TimeDelta& rtcp_interval, |
94 bool sending_media, | |
95 uint32 local_ssrc, | 108 uint32 local_ssrc, |
| 109 uint32 remote_ssrc, |
96 const std::string& c_name) | 110 const std::string& c_name) |
97 : rtcp_interval_(rtcp_interval), | 111 : rtcp_interval_(rtcp_interval), |
98 rtcp_mode_(rtcp_mode), | 112 rtcp_mode_(rtcp_mode), |
99 sending_media_(sending_media), | |
100 local_ssrc_(local_ssrc), | 113 local_ssrc_(local_ssrc), |
| 114 remote_ssrc_(remote_ssrc), |
101 rtp_sender_statistics_(rtp_sender_statistics), | 115 rtp_sender_statistics_(rtp_sender_statistics), |
102 rtp_receiver_statistics_(rtp_receiver_statistics), | 116 rtp_receiver_statistics_(rtp_receiver_statistics), |
103 receiver_feedback_(new LocalRtcpReceiverFeedback(this)), | 117 receiver_feedback_(new LocalRtcpReceiverFeedback(this)), |
104 rtt_feedback_(new LocalRtcpRttFeedback(this)), | 118 rtt_feedback_(new LocalRtcpRttFeedback(this)), |
105 rtcp_sender_(new RtcpSender(paced_packet_sender, local_ssrc, c_name)), | 119 rtcp_sender_(new RtcpSender(paced_packet_sender, local_ssrc, c_name)), |
106 last_report_sent_(0), | 120 last_report_sent_(0), |
107 last_report_received_(0), | 121 last_report_received_(0), |
108 last_received_rtp_timestamp_(0), | 122 last_received_rtp_timestamp_(0), |
109 last_received_ntp_seconds_(0), | 123 last_received_ntp_seconds_(0), |
110 last_received_ntp_fraction_(0), | 124 last_received_ntp_fraction_(0), |
111 min_rtt_(base::TimeDelta::FromMilliseconds(kMaxRttMs)), | 125 min_rtt_(base::TimeDelta::FromMilliseconds(kMaxRttMs)), |
112 number_of_rtt_in_avg_(0), | 126 number_of_rtt_in_avg_(0), |
113 clock_(clock) { | 127 clock_(clock) { |
114 rtcp_receiver_.reset(new RtcpReceiver(sender_feedback, | 128 rtcp_receiver_.reset(new RtcpReceiver(sender_feedback, |
115 receiver_feedback_.get(), | 129 receiver_feedback_.get(), |
116 rtt_feedback_.get(), | 130 rtt_feedback_.get(), |
117 local_ssrc)); | 131 local_ssrc)); |
| 132 rtcp_receiver_->SetRemoteSSRC(remote_ssrc); |
118 } | 133 } |
119 | 134 |
120 Rtcp::~Rtcp() {} | 135 Rtcp::~Rtcp() {} |
121 | 136 |
122 // static | 137 // static |
123 bool Rtcp::IsRtcpPacket(const uint8* packet, size_t length) { | 138 bool Rtcp::IsRtcpPacket(const uint8* packet, size_t length) { |
124 DCHECK_GE(length, kMinLengthOfRtcp) << "Invalid RTCP packet"; | 139 DCHECK_GE(length, kMinLengthOfRtcp) << "Invalid RTCP packet"; |
125 if (length < kMinLengthOfRtcp) return false; | 140 if (length < kMinLengthOfRtcp) return false; |
126 | 141 |
127 uint8 packet_type = packet[1]; | 142 uint8 packet_type = packet[1]; |
(...skipping 13 matching lines...) Expand all Loading... |
141 return ssrc_of_sender; | 156 return ssrc_of_sender; |
142 } | 157 } |
143 | 158 |
144 base::TimeTicks Rtcp::TimeToSendNextRtcpReport() { | 159 base::TimeTicks Rtcp::TimeToSendNextRtcpReport() { |
145 if (next_time_to_send_rtcp_.is_null()) { | 160 if (next_time_to_send_rtcp_.is_null()) { |
146 UpdateNextTimeToSendRtcp(); | 161 UpdateNextTimeToSendRtcp(); |
147 } | 162 } |
148 return next_time_to_send_rtcp_; | 163 return next_time_to_send_rtcp_; |
149 } | 164 } |
150 | 165 |
151 void Rtcp::SetRemoteSSRC(uint32 ssrc) { | |
152 rtcp_receiver_->SetRemoteSSRC(ssrc); | |
153 } | |
154 | |
155 void Rtcp::IncomingRtcpPacket(const uint8* rtcp_buffer, size_t length) { | 166 void Rtcp::IncomingRtcpPacket(const uint8* rtcp_buffer, size_t length) { |
156 RtcpParser rtcp_parser(rtcp_buffer, length); | 167 RtcpParser rtcp_parser(rtcp_buffer, length); |
157 if (!rtcp_parser.IsValid()) { | 168 if (!rtcp_parser.IsValid()) { |
158 // Silently ignore packet. | 169 // Silently ignore packet. |
159 DLOG(ERROR) << "Received invalid RTCP packet"; | 170 DLOG(ERROR) << "Received invalid RTCP packet"; |
160 return; | 171 return; |
161 } | 172 } |
162 rtcp_receiver_->IncomingRtcpPacket(&rtcp_parser); | 173 rtcp_receiver_->IncomingRtcpPacket(&rtcp_parser); |
163 } | 174 } |
164 | 175 |
165 void Rtcp::SendRtcpCast(const RtcpCastMessage& cast_message) { | 176 void Rtcp::SendRtcpFromRtpReceiver(const RtcpCastMessage* cast_message, |
| 177 const RtcpReceiverLogMessage* receiver_log) { |
166 uint32 packet_type_flags = 0; | 178 uint32 packet_type_flags = 0; |
| 179 |
167 base::TimeTicks now = clock_->NowTicks(); | 180 base::TimeTicks now = clock_->NowTicks(); |
| 181 RtcpReportBlock report_block; |
| 182 RtcpReceiverReferenceTimeReport rrtr; |
168 | 183 |
| 184 if (cast_message) { |
| 185 packet_type_flags |= RtcpSender::kRtcpCast; |
| 186 } |
| 187 if (receiver_log) { |
| 188 packet_type_flags |= RtcpSender::kRtcpReceiverLog; |
| 189 } |
169 if (rtcp_mode_ == kRtcpCompound || now >= next_time_to_send_rtcp_) { | 190 if (rtcp_mode_ == kRtcpCompound || now >= next_time_to_send_rtcp_) { |
170 if (sending_media_) { | 191 packet_type_flags |= RtcpSender::kRtcpRr; |
171 packet_type_flags = RtcpSender::kRtcpSr; | |
172 } else { | |
173 packet_type_flags = RtcpSender::kRtcpRr; | |
174 } | |
175 } | |
176 packet_type_flags |= RtcpSender::kRtcpCast; | |
177 | 192 |
178 SendRtcp(now, packet_type_flags, 0, &cast_message); | |
179 } | |
180 | |
181 void Rtcp::SendRtcpPli(uint32 pli_remote_ssrc) { | |
182 uint32 packet_type_flags = 0; | |
183 base::TimeTicks now = clock_->NowTicks(); | |
184 | |
185 if (rtcp_mode_ == kRtcpCompound || now >= next_time_to_send_rtcp_) { | |
186 if (sending_media_) { | |
187 packet_type_flags = RtcpSender::kRtcpSr; | |
188 } else { | |
189 packet_type_flags = RtcpSender::kRtcpRr; | |
190 } | |
191 } | |
192 packet_type_flags |= RtcpSender::kRtcpPli; | |
193 SendRtcp(now, packet_type_flags, pli_remote_ssrc, NULL); | |
194 } | |
195 | |
196 void Rtcp::SendRtcpReport(uint32 media_ssrc) { | |
197 uint32 packet_type_flags; | |
198 base::TimeTicks now = clock_->NowTicks(); | |
199 if (sending_media_) { | |
200 packet_type_flags = RtcpSender::kRtcpSr; | |
201 } else { | |
202 packet_type_flags = RtcpSender::kRtcpRr; | |
203 } | |
204 SendRtcp(now, packet_type_flags, media_ssrc, NULL); | |
205 } | |
206 | |
207 void Rtcp::SendRtcp(const base::TimeTicks& now, | |
208 uint32 packet_type_flags, | |
209 uint32 media_ssrc, | |
210 const RtcpCastMessage* cast_message) { | |
211 if (packet_type_flags & RtcpSender::kRtcpSr || | |
212 packet_type_flags & RtcpSender::kRtcpRr) { | |
213 UpdateNextTimeToSendRtcp(); | |
214 } | |
215 if (packet_type_flags & RtcpSender::kRtcpSr) { | |
216 RtcpSenderInfo sender_info; | |
217 | |
218 if (rtp_sender_statistics_) { | |
219 rtp_sender_statistics_->GetStatistics(now, &sender_info); | |
220 } else { | |
221 memset(&sender_info, 0, sizeof(sender_info)); | |
222 } | |
223 time_last_report_sent_ = now; | |
224 last_report_sent_ = (sender_info.ntp_seconds << 16) + | |
225 (sender_info.ntp_fraction >> 16); | |
226 | |
227 RtcpDlrrReportBlock dlrr; | |
228 if (!time_last_report_received_.is_null()) { | |
229 packet_type_flags |= RtcpSender::kRtcpDlrr; | |
230 dlrr.last_rr = last_report_received_; | |
231 uint32 delay_seconds = 0; | |
232 uint32 delay_fraction = 0; | |
233 base::TimeDelta delta = now - time_last_report_received_; | |
234 ConvertTimeToFractions(delta.InMicroseconds(), | |
235 &delay_seconds, | |
236 &delay_fraction); | |
237 | |
238 dlrr.delay_since_last_rr = | |
239 ConvertToNtpDiff(delay_seconds, delay_fraction); | |
240 } | |
241 rtcp_sender_->SendRtcp(packet_type_flags, | |
242 &sender_info, | |
243 NULL, | |
244 media_ssrc, | |
245 &dlrr, | |
246 NULL, | |
247 NULL); | |
248 } else { | |
249 RtcpReportBlock report_block; | |
250 report_block.remote_ssrc = 0; // Not needed to set send side. | 193 report_block.remote_ssrc = 0; // Not needed to set send side. |
251 report_block.media_ssrc = media_ssrc; // SSRC of the RTP packet sender. | 194 report_block.media_ssrc = remote_ssrc_; // SSRC of the RTP packet sender. |
252 if (rtp_receiver_statistics_) { | 195 if (rtp_receiver_statistics_) { |
253 rtp_receiver_statistics_->GetStatistics( | 196 rtp_receiver_statistics_->GetStatistics( |
254 &report_block.fraction_lost, | 197 &report_block.fraction_lost, |
255 &report_block.cumulative_lost, | 198 &report_block.cumulative_lost, |
256 &report_block.extended_high_sequence_number, | 199 &report_block.extended_high_sequence_number, |
257 &report_block.jitter); | 200 &report_block.jitter); |
258 } | 201 } |
259 | 202 |
260 report_block.last_sr = last_report_received_; | 203 report_block.last_sr = last_report_received_; |
261 if (!time_last_report_received_.is_null()) { | 204 if (!time_last_report_received_.is_null()) { |
262 uint32 delay_seconds = 0; | 205 uint32 delay_seconds = 0; |
263 uint32 delay_fraction = 0; | 206 uint32 delay_fraction = 0; |
264 base::TimeDelta delta = now - time_last_report_received_; | 207 base::TimeDelta delta = now - time_last_report_received_; |
265 ConvertTimeToFractions(delta.InMicroseconds(), | 208 ConvertTimeToFractions(delta.InMicroseconds(), |
266 &delay_seconds, | 209 &delay_seconds, |
267 &delay_fraction); | 210 &delay_fraction); |
268 report_block.delay_since_last_sr = | 211 report_block.delay_since_last_sr = |
269 ConvertToNtpDiff(delay_seconds, delay_fraction); | 212 ConvertToNtpDiff(delay_seconds, delay_fraction); |
270 } else { | 213 } else { |
271 report_block.delay_since_last_sr = 0; | 214 report_block.delay_since_last_sr = 0; |
272 } | 215 } |
273 | 216 |
274 packet_type_flags |= RtcpSender::kRtcpRrtr; | 217 packet_type_flags |= RtcpSender::kRtcpRrtr; |
275 RtcpReceiverReferenceTimeReport rrtr; | |
276 ConvertTimeTicksToNtp(now, &rrtr.ntp_seconds, &rrtr.ntp_fraction); | 218 ConvertTimeTicksToNtp(now, &rrtr.ntp_seconds, &rrtr.ntp_fraction); |
277 | 219 |
278 time_last_report_sent_ = now; | 220 time_last_report_sent_ = now; |
279 last_report_sent_ = ConvertToNtpDiff(rrtr.ntp_seconds, rrtr.ntp_fraction); | 221 last_report_sent_ = ConvertToNtpDiff(rrtr.ntp_seconds, rrtr.ntp_fraction); |
| 222 UpdateNextTimeToSendRtcp(); |
| 223 } |
| 224 rtcp_sender_->SendRtcpFromRtpReceiver(packet_type_flags, |
| 225 &report_block, |
| 226 &rrtr, |
| 227 cast_message, |
| 228 receiver_log); |
| 229 } |
280 | 230 |
281 rtcp_sender_->SendRtcp(packet_type_flags, | 231 void Rtcp::SendRtcpFromRtpSender( |
282 NULL, | 232 const RtcpSenderLogMessage* sender_log_message) { |
283 &report_block, | 233 uint32 packet_type_flags = RtcpSender::kRtcpSr; |
284 media_ssrc, | 234 base::TimeTicks now = clock_->NowTicks(); |
285 NULL, | 235 |
286 &rrtr, | 236 RtcpSenderInfo sender_info; |
287 cast_message); | 237 RtcpDlrrReportBlock dlrr; |
| 238 |
| 239 if (sender_log_message) packet_type_flags |= RtcpSender::kRtcpSenderLog; |
| 240 |
| 241 if (rtp_sender_statistics_) { |
| 242 rtp_sender_statistics_->GetStatistics(now, &sender_info); |
| 243 } else { |
| 244 memset(&sender_info, 0, sizeof(sender_info)); |
288 } | 245 } |
| 246 time_last_report_sent_ = now; |
| 247 last_report_sent_ = (sender_info.ntp_seconds << 16) + |
| 248 (sender_info.ntp_fraction >> 16); |
| 249 |
| 250 if (!time_last_report_received_.is_null()) { |
| 251 packet_type_flags |= RtcpSender::kRtcpDlrr; |
| 252 dlrr.last_rr = last_report_received_; |
| 253 uint32 delay_seconds = 0; |
| 254 uint32 delay_fraction = 0; |
| 255 base::TimeDelta delta = now - time_last_report_received_; |
| 256 ConvertTimeToFractions(delta.InMicroseconds(), |
| 257 &delay_seconds, |
| 258 &delay_fraction); |
| 259 |
| 260 dlrr.delay_since_last_rr = ConvertToNtpDiff(delay_seconds, delay_fraction); |
| 261 } |
| 262 |
| 263 rtcp_sender_->SendRtcpFromRtpSender(packet_type_flags, |
| 264 &sender_info, |
| 265 &dlrr, |
| 266 sender_log_message); |
| 267 UpdateNextTimeToSendRtcp(); |
289 } | 268 } |
290 | 269 |
291 void Rtcp::OnReceivedNtp(uint32 ntp_seconds, uint32 ntp_fraction) { | 270 void Rtcp::OnReceivedNtp(uint32 ntp_seconds, uint32 ntp_fraction) { |
292 last_report_received_ = (ntp_seconds << 16) + (ntp_fraction >> 16); | 271 last_report_received_ = (ntp_seconds << 16) + (ntp_fraction >> 16); |
293 | 272 |
294 base::TimeTicks now = clock_->NowTicks(); | 273 base::TimeTicks now = clock_->NowTicks(); |
295 time_last_report_received_ = now; | 274 time_last_report_received_ = now; |
296 } | 275 } |
297 | 276 |
298 void Rtcp::OnReceivedLipSyncInfo(uint32 rtp_timestamp, | 277 void Rtcp::OnReceivedLipSyncInfo(uint32 rtp_timestamp, |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 int random = base::RandInt(0, 999); | 388 int random = base::RandInt(0, 999); |
410 base::TimeDelta time_to_next = (rtcp_interval_ / 2) + | 389 base::TimeDelta time_to_next = (rtcp_interval_ / 2) + |
411 (rtcp_interval_ * random / 1000); | 390 (rtcp_interval_ * random / 1000); |
412 | 391 |
413 base::TimeTicks now = clock_->NowTicks(); | 392 base::TimeTicks now = clock_->NowTicks(); |
414 next_time_to_send_rtcp_ = now + time_to_next; | 393 next_time_to_send_rtcp_ = now + time_to_next; |
415 } | 394 } |
416 | 395 |
417 } // namespace cast | 396 } // namespace cast |
418 } // namespace media | 397 } // namespace media |
OLD | NEW |