Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(265)

Side by Side Diff: media/cast/rtcp/rtcp.cc

Issue 70713002: Cast: Restructure RTCP interface to better fit our usage. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698