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