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

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: Added missing line lost in merge 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
« no previous file with comments | « media/cast/rtcp/rtcp.h ('k') | media/cast/rtcp/rtcp_defines.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW
« no previous file with comments | « media/cast/rtcp/rtcp.h ('k') | media/cast/rtcp/rtcp_defines.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698