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/rand_util.h" | 7 #include "base/rand_util.h" |
8 #include "media/cast/cast_config.h" | 8 #include "media/cast/cast_config.h" |
9 #include "media/cast/cast_defines.h" | 9 #include "media/cast/cast_defines.h" |
10 #include "media/cast/cast_environment.h" | 10 #include "media/cast/cast_environment.h" |
11 #include "media/cast/net/rtcp/rtcp_builder.h" | |
12 #include "media/cast/rtcp/rtcp_defines.h" | 11 #include "media/cast/rtcp/rtcp_defines.h" |
13 #include "media/cast/rtcp/rtcp_receiver.h" | 12 #include "media/cast/rtcp/rtcp_receiver.h" |
14 #include "media/cast/rtcp/rtcp_sender.h" | 13 #include "media/cast/rtcp/rtcp_sender.h" |
15 #include "media/cast/rtcp/rtcp_utility.h" | 14 #include "media/cast/rtcp/rtcp_utility.h" |
| 15 #include "media/cast/transport/cast_transport_defines.h" |
16 #include "net/base/big_endian.h" | 16 #include "net/base/big_endian.h" |
17 | 17 |
18 namespace media { | 18 namespace media { |
19 namespace cast { | 19 namespace cast { |
20 | 20 |
21 static const int kMaxRttMs = 10000; // 10 seconds. | 21 static const int kMaxRttMs = 10000; // 10 seconds. |
22 | 22 |
23 // Time limit for received RTCP messages when we stop using it for lip-sync. | 23 // Time limit for received RTCP messages when we stop using it for lip-sync. |
24 static const int64 kMaxDiffSinceReceivedRtcpMs = 100000; // 100 seconds. | 24 static const int64 kMaxDiffSinceReceivedRtcpMs = 100000; // 100 seconds. |
25 | 25 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 RtcpReceiverFrameLogMessage::~RtcpReceiverFrameLogMessage() {} | 59 RtcpReceiverFrameLogMessage::~RtcpReceiverFrameLogMessage() {} |
60 | 60 |
61 class LocalRtcpReceiverFeedback : public RtcpReceiverFeedback { | 61 class LocalRtcpReceiverFeedback : public RtcpReceiverFeedback { |
62 public: | 62 public: |
63 LocalRtcpReceiverFeedback(Rtcp* rtcp, | 63 LocalRtcpReceiverFeedback(Rtcp* rtcp, |
64 scoped_refptr<CastEnvironment> cast_environment) | 64 scoped_refptr<CastEnvironment> cast_environment) |
65 : rtcp_(rtcp), cast_environment_(cast_environment) { | 65 : rtcp_(rtcp), cast_environment_(cast_environment) { |
66 } | 66 } |
67 | 67 |
68 virtual void OnReceivedSenderReport( | 68 virtual void OnReceivedSenderReport( |
69 const RtcpSenderInfo& remote_sender_info) OVERRIDE { | 69 const transport::RtcpSenderInfo& remote_sender_info) OVERRIDE { |
70 rtcp_->OnReceivedNtp(remote_sender_info.ntp_seconds, | 70 rtcp_->OnReceivedNtp(remote_sender_info.ntp_seconds, |
71 remote_sender_info.ntp_fraction); | 71 remote_sender_info.ntp_fraction); |
72 if (remote_sender_info.send_packet_count != 0) { | 72 if (remote_sender_info.send_packet_count != 0) { |
73 rtcp_->OnReceivedLipSyncInfo(remote_sender_info.rtp_timestamp, | 73 rtcp_->OnReceivedLipSyncInfo(remote_sender_info.rtp_timestamp, |
74 remote_sender_info.ntp_seconds, | 74 remote_sender_info.ntp_seconds, |
75 remote_sender_info.ntp_fraction); | 75 remote_sender_info.ntp_fraction); |
76 } | 76 } |
77 } | 77 } |
78 | 78 |
79 virtual void OnReceiverReferenceTimeReport( | 79 virtual void OnReceiverReferenceTimeReport( |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 default: | 119 default: |
120 VLOG(2) << "Received log message via RTCP that we did not expect: " | 120 VLOG(2) << "Received log message via RTCP that we did not expect: " |
121 << static_cast<int>(event_it->type); | 121 << static_cast<int>(event_it->type); |
122 break; | 122 break; |
123 } | 123 } |
124 } | 124 } |
125 } | 125 } |
126 } | 126 } |
127 | 127 |
128 virtual void OnReceivedSenderLog( | 128 virtual void OnReceivedSenderLog( |
129 const RtcpSenderLogMessage& sender_log) OVERRIDE { | 129 const transport::RtcpSenderLogMessage& sender_log) OVERRIDE { |
130 RtcpSenderLogMessage::const_iterator it = sender_log.begin(); | 130 transport::RtcpSenderLogMessage::const_iterator it = sender_log.begin(); |
131 | 131 |
132 for (; it != sender_log.end(); ++it) { | 132 for (; it != sender_log.end(); ++it) { |
133 uint32 rtp_timestamp = it->rtp_timestamp; | 133 uint32 rtp_timestamp = it->rtp_timestamp; |
134 CastLoggingEvent log_event = kUnknown; | 134 CastLoggingEvent log_event = kUnknown; |
135 | 135 |
136 // These events are provided to know the status of frames that never | 136 // These events are provided to know the status of frames that never |
137 // reached the receiver. The timing information for these events are not | 137 // reached the receiver. The timing information for these events are not |
138 // relevant and is not sent over the wire. | 138 // relevant and is not sent over the wire. |
139 switch (it->frame_status) { | 139 switch (it->frame_status) { |
140 case kRtcpSenderFrameStatusDroppedByFlowControl: | 140 case transport::kRtcpSenderFrameStatusDroppedByFlowControl: |
141 // A frame that have been dropped by the flow control would have | 141 // A frame that have been dropped by the flow control would have |
142 // kVideoFrameCaptured as its last event in the log. | 142 // kVideoFrameCaptured as its last event in the log. |
143 log_event = kVideoFrameCaptured; | 143 log_event = kVideoFrameCaptured; |
144 break; | 144 break; |
145 case kRtcpSenderFrameStatusDroppedByEncoder: | 145 case transport::kRtcpSenderFrameStatusDroppedByEncoder: |
146 // A frame that have been dropped by the encoder would have | 146 // A frame that have been dropped by the encoder would have |
147 // kVideoFrameSentToEncoder as its last event in the log. | 147 // kVideoFrameSentToEncoder as its last event in the log. |
148 log_event = kVideoFrameSentToEncoder; | 148 log_event = kVideoFrameSentToEncoder; |
149 break; | 149 break; |
150 case kRtcpSenderFrameStatusSentToNetwork: | 150 case transport::kRtcpSenderFrameStatusSentToNetwork: |
151 // A frame that have be encoded is always sent to the network. We | 151 // A frame that have be encoded is always sent to the network. We |
152 // do not add a new log entry for this. | 152 // do not add a new log entry for this. |
153 log_event = kVideoFrameEncoded; | 153 log_event = kVideoFrameEncoded; |
154 break; | 154 break; |
155 default: | 155 default: |
156 continue; | 156 continue; |
157 } | 157 } |
158 // TODO(pwestin): how do we handle the truncated rtp_timestamp? | 158 // TODO(pwestin): how do we handle the truncated rtp_timestamp? |
159 // Add received log messages into our log system. | 159 // Add received log messages into our log system. |
160 // TODO(pwestin): how do we handle the time? we don't care about it but | 160 // TODO(pwestin): how do we handle the time? we don't care about it but |
161 // we need to send in one. | 161 // we need to send in one. |
162 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 162 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
163 cast_environment_->Logging()->InsertFrameEvent(now, log_event, | 163 cast_environment_->Logging()->InsertFrameEvent(now, log_event, |
164 rtp_timestamp, kFrameIdUnknown); | 164 rtp_timestamp, kFrameIdUnknown); |
165 } | 165 } |
166 } | 166 } |
167 | 167 |
168 private: | 168 private: |
169 Rtcp* rtcp_; | 169 Rtcp* rtcp_; |
170 scoped_refptr<CastEnvironment> cast_environment_; | 170 scoped_refptr<CastEnvironment> cast_environment_; |
171 }; | 171 }; |
172 | 172 |
173 Rtcp::Rtcp(scoped_refptr<CastEnvironment> cast_environment, | 173 Rtcp::Rtcp(scoped_refptr<CastEnvironment> cast_environment, |
174 RtcpSenderFeedback* sender_feedback, | 174 RtcpSenderFeedback* sender_feedback, |
175 PacedPacketSender* paced_packet_sender, | 175 transport::PacedPacketSender* paced_packet_sender, |
176 RtpSenderStatistics* rtp_sender_statistics, | 176 RtpSenderStatistics* rtp_sender_statistics, |
177 RtpReceiverStatistics* rtp_receiver_statistics, | 177 RtpReceiverStatistics* rtp_receiver_statistics, |
178 RtcpMode rtcp_mode, | 178 RtcpMode rtcp_mode, |
179 const base::TimeDelta& rtcp_interval, | 179 const base::TimeDelta& rtcp_interval, |
180 uint32 local_ssrc, | 180 uint32 local_ssrc, |
181 uint32 remote_ssrc, | 181 uint32 remote_ssrc, |
182 const std::string& c_name) | 182 const std::string& c_name) |
183 : rtcp_interval_(rtcp_interval), | 183 : rtcp_interval_(rtcp_interval), |
184 rtcp_mode_(rtcp_mode), | 184 rtcp_mode_(rtcp_mode), |
185 local_ssrc_(local_ssrc), | 185 local_ssrc_(local_ssrc), |
186 remote_ssrc_(remote_ssrc), | 186 remote_ssrc_(remote_ssrc), |
187 rtp_sender_statistics_(rtp_sender_statistics), | 187 rtp_sender_statistics_(rtp_sender_statistics), |
188 rtp_receiver_statistics_(rtp_receiver_statistics), | 188 rtp_receiver_statistics_(rtp_receiver_statistics), |
189 receiver_feedback_(new LocalRtcpReceiverFeedback(this, cast_environment)), | 189 receiver_feedback_(new LocalRtcpReceiverFeedback(this, cast_environment)), |
190 rtt_feedback_(new LocalRtcpRttFeedback(this)), | 190 rtt_feedback_(new LocalRtcpRttFeedback(this)), |
191 rtcp_sender_(new RtcpSender(cast_environment, paced_packet_sender, | 191 rtcp_sender_(new RtcpSender(cast_environment, paced_packet_sender, |
192 local_ssrc, c_name)), | 192 local_ssrc, c_name)), |
193 rtcp_builder_(new RtcpBuilder(paced_packet_sender, local_ssrc, c_name)), | 193 rtcp_builder_(new |
| 194 transport::RtcpBuilder(paced_packet_sender, local_ssrc, c_name)), |
194 last_report_received_(0), | 195 last_report_received_(0), |
195 last_received_rtp_timestamp_(0), | 196 last_received_rtp_timestamp_(0), |
196 last_received_ntp_seconds_(0), | 197 last_received_ntp_seconds_(0), |
197 last_received_ntp_fraction_(0), | 198 last_received_ntp_fraction_(0), |
198 min_rtt_(base::TimeDelta::FromMilliseconds(kMaxRttMs)), | 199 min_rtt_(base::TimeDelta::FromMilliseconds(kMaxRttMs)), |
199 number_of_rtt_in_avg_(0), | 200 number_of_rtt_in_avg_(0), |
200 cast_environment_(cast_environment) { | 201 cast_environment_(cast_environment) { |
201 rtcp_receiver_.reset(new RtcpReceiver(cast_environment, | 202 rtcp_receiver_.reset(new RtcpReceiver(cast_environment, |
202 sender_feedback, | 203 sender_feedback, |
203 receiver_feedback_.get(), | 204 receiver_feedback_.get(), |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 return; | 246 return; |
246 } | 247 } |
247 rtcp_receiver_->IncomingRtcpPacket(&rtcp_parser); | 248 rtcp_receiver_->IncomingRtcpPacket(&rtcp_parser); |
248 } | 249 } |
249 | 250 |
250 void Rtcp::SendRtcpFromRtpReceiver(const RtcpCastMessage* cast_message, | 251 void Rtcp::SendRtcpFromRtpReceiver(const RtcpCastMessage* cast_message, |
251 RtcpReceiverLogMessage* receiver_log) { | 252 RtcpReceiverLogMessage* receiver_log) { |
252 uint32 packet_type_flags = 0; | 253 uint32 packet_type_flags = 0; |
253 | 254 |
254 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 255 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
255 RtcpReportBlock report_block; | 256 transport::RtcpReportBlock report_block; |
256 RtcpReceiverReferenceTimeReport rrtr; | 257 RtcpReceiverReferenceTimeReport rrtr; |
257 | 258 |
258 if (cast_message) { | 259 if (cast_message) { |
259 packet_type_flags |= RtcpSender::kRtcpCast; | 260 packet_type_flags |= RtcpSender::kRtcpCast; |
260 cast_environment_->Logging()->InsertGenericEvent(now, kAckSent, | 261 cast_environment_->Logging()->InsertGenericEvent(now, kAckSent, |
261 cast_message->ack_frame_id_); | 262 cast_message->ack_frame_id_); |
262 } | 263 } |
263 if (receiver_log) { | 264 if (receiver_log) { |
264 packet_type_flags |= RtcpSender::kRtcpReceiverLog; | 265 packet_type_flags |= RtcpSender::kRtcpReceiverLog; |
265 } | 266 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
301 UpdateNextTimeToSendRtcp(); | 302 UpdateNextTimeToSendRtcp(); |
302 } | 303 } |
303 rtcp_sender_->SendRtcpFromRtpReceiver(packet_type_flags, | 304 rtcp_sender_->SendRtcpFromRtpReceiver(packet_type_flags, |
304 &report_block, | 305 &report_block, |
305 &rrtr, | 306 &rrtr, |
306 cast_message, | 307 cast_message, |
307 receiver_log); | 308 receiver_log); |
308 } | 309 } |
309 | 310 |
310 void Rtcp::SendRtcpFromRtpSender( | 311 void Rtcp::SendRtcpFromRtpSender( |
311 RtcpSenderLogMessage* sender_log_message) { | 312 transport::RtcpSenderLogMessage* sender_log_message) { |
312 uint32 packet_type_flags = RtcpSender::kRtcpSr; | 313 uint32 packet_type_flags = RtcpSender::kRtcpSr; |
313 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 314 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
314 | 315 |
315 if (sender_log_message) { | 316 if (sender_log_message) { |
316 packet_type_flags |= RtcpSender::kRtcpSenderLog; | 317 packet_type_flags |= RtcpSender::kRtcpSenderLog; |
317 } | 318 } |
318 | 319 |
319 RtcpSenderInfo sender_info; | 320 transport::RtcpSenderInfo sender_info; |
320 if (rtp_sender_statistics_) { | 321 if (rtp_sender_statistics_) { |
321 rtp_sender_statistics_->GetStatistics(now, &sender_info); | 322 rtp_sender_statistics_->GetStatistics(now, &sender_info); |
322 } else { | 323 } else { |
323 memset(&sender_info, 0, sizeof(sender_info)); | 324 memset(&sender_info, 0, sizeof(sender_info)); |
324 } | 325 } |
325 SaveLastSentNtpTime(now, sender_info.ntp_seconds, sender_info.ntp_fraction); | 326 SaveLastSentNtpTime(now, sender_info.ntp_seconds, sender_info.ntp_fraction); |
326 | 327 |
327 RtcpDlrrReportBlock dlrr; | 328 transport::RtcpDlrrReportBlock dlrr; |
328 if (!time_last_report_received_.is_null()) { | 329 if (!time_last_report_received_.is_null()) { |
329 packet_type_flags |= RtcpSender::kRtcpDlrr; | 330 packet_type_flags |= RtcpSender::kRtcpDlrr; |
330 dlrr.last_rr = last_report_received_; | 331 dlrr.last_rr = last_report_received_; |
331 uint32 delay_seconds = 0; | 332 uint32 delay_seconds = 0; |
332 uint32 delay_fraction = 0; | 333 uint32 delay_fraction = 0; |
333 base::TimeDelta delta = now - time_last_report_received_; | 334 base::TimeDelta delta = now - time_last_report_received_; |
334 ConvertTimeToFractions(delta.InMicroseconds(), | 335 ConvertTimeToFractions(delta.InMicroseconds(), |
335 &delay_seconds, | 336 &delay_seconds, |
336 &delay_fraction); | 337 &delay_fraction); |
337 | 338 |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 int random = base::RandInt(0, 999); | 500 int random = base::RandInt(0, 999); |
500 base::TimeDelta time_to_next = (rtcp_interval_ / 2) + | 501 base::TimeDelta time_to_next = (rtcp_interval_ / 2) + |
501 (rtcp_interval_ * random / 1000); | 502 (rtcp_interval_ * random / 1000); |
502 | 503 |
503 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 504 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
504 next_time_to_send_rtcp_ = now + time_to_next; | 505 next_time_to_send_rtcp_ = now + time_to_next; |
505 } | 506 } |
506 | 507 |
507 } // namespace cast | 508 } // namespace cast |
508 } // namespace media | 509 } // namespace media |
OLD | NEW |