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

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

Issue 1709863002: Add Cast PLI support on sender side. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased and addressed comments. Created 4 years, 9 months 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/net/rtcp/rtcp_builder.h" 5 #include "media/cast/net/rtcp/rtcp_builder.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <vector> 10 #include <vector>
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 writer_ = base::BigEndianWriter(NULL, 0); 158 writer_ = base::BigEndianWriter(NULL, 0);
159 PacketRef ret = packet_; 159 PacketRef ret = packet_;
160 packet_ = NULL; 160 packet_ = NULL;
161 return ret; 161 return ret;
162 } 162 }
163 163
164 PacketRef RtcpBuilder::BuildRtcpFromReceiver( 164 PacketRef RtcpBuilder::BuildRtcpFromReceiver(
165 const RtcpReportBlock* report_block, 165 const RtcpReportBlock* report_block,
166 const RtcpReceiverReferenceTimeReport* rrtr, 166 const RtcpReceiverReferenceTimeReport* rrtr,
167 const RtcpCastMessage* cast_message, 167 const RtcpCastMessage* cast_message,
168 const RtcpPliMessage* pli_message,
168 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events, 169 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events,
169 base::TimeDelta target_delay) { 170 base::TimeDelta target_delay) {
170 Start(); 171 Start();
171 172
172 if (report_block) 173 if (report_block)
173 AddRR(report_block); 174 AddRR(report_block);
174 if (rrtr) 175 if (rrtr)
175 AddRrtr(rrtr); 176 AddRrtr(rrtr);
176 if (cast_message) 177 if (cast_message)
177 AddCast(cast_message, target_delay); 178 AddCast(cast_message, target_delay);
179 if (pli_message)
180 AddPli(pli_message);
178 if (rtcp_events) 181 if (rtcp_events)
179 AddReceiverLog(*rtcp_events); 182 AddReceiverLog(*rtcp_events);
180 183
181 return Finish(); 184 return Finish();
182 } 185 }
183 186
184 PacketRef RtcpBuilder::BuildRtcpFromSender(const RtcpSenderInfo& sender_info) { 187 PacketRef RtcpBuilder::BuildRtcpFromSender(const RtcpSenderInfo& sender_info) {
185 Start(); 188 Start();
186 AddSR(sender_info); 189 AddSR(sender_info);
187 return Finish(); 190 return Finish();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 writer_.WriteU32(ssrc_); // Add our own SSRC. 223 writer_.WriteU32(ssrc_); // Add our own SSRC.
221 writer_.WriteU8(4); // Add block type. 224 writer_.WriteU8(4); // Add block type.
222 writer_.WriteU8(0); // Add reserved. 225 writer_.WriteU8(0); // Add reserved.
223 writer_.WriteU16(2); // Block length. 226 writer_.WriteU16(2); // Block length.
224 227
225 // Add the media (received RTP) SSRC. 228 // Add the media (received RTP) SSRC.
226 writer_.WriteU32(rrtr->ntp_seconds); 229 writer_.WriteU32(rrtr->ntp_seconds);
227 writer_.WriteU32(rrtr->ntp_fraction); 230 writer_.WriteU32(rrtr->ntp_fraction);
228 } 231 }
229 232
233 void RtcpBuilder::AddPli(const RtcpPliMessage* pli_message) {
dcheng 2016/03/01 23:44:12 How about const RtcpPliMessage&? This should never
xjz 2016/03/02 04:24:17 Done.
234 AddRtcpHeader(kPacketTypePayloadSpecific, 1);
235 writer_.WriteU32(ssrc_);
236 writer_.WriteU32(pli_message->remote_ssrc);
237 }
238
230 void RtcpBuilder::AddCast(const RtcpCastMessage* cast, 239 void RtcpBuilder::AddCast(const RtcpCastMessage* cast,
231 base::TimeDelta target_delay) { 240 base::TimeDelta target_delay) {
232 // See RTC 4585 Section 6.4 for application specific feedback messages. 241 // See RTC 4585 Section 6.4 for application specific feedback messages.
233 AddRtcpHeader(kPacketTypePayloadSpecific, 15); 242 AddRtcpHeader(kPacketTypePayloadSpecific, 15);
234 writer_.WriteU32(ssrc_); // Add our own SSRC. 243 writer_.WriteU32(ssrc_); // Add our own SSRC.
235 writer_.WriteU32(cast->media_ssrc); // Remote SSRC. 244 writer_.WriteU32(cast->remote_ssrc); // Remote SSRC.
236 writer_.WriteU32(kCast); 245 writer_.WriteU32(kCast);
237 writer_.WriteU8(static_cast<uint8_t>(cast->ack_frame_id)); 246 writer_.WriteU8(static_cast<uint8_t>(cast->ack_frame_id));
238 uint8_t* cast_loss_field_pos = reinterpret_cast<uint8_t*>(writer_.ptr()); 247 uint8_t* cast_loss_field_pos = reinterpret_cast<uint8_t*>(writer_.ptr());
239 writer_.WriteU8(0); // Overwritten with number_of_loss_fields. 248 writer_.WriteU8(0); // Overwritten with number_of_loss_fields.
240 DCHECK_LE(target_delay.InMilliseconds(), 249 DCHECK_LE(target_delay.InMilliseconds(),
241 std::numeric_limits<uint16_t>::max()); 250 std::numeric_limits<uint16_t>::max());
242 writer_.WriteU16(target_delay.InMilliseconds()); 251 writer_.WriteU16(target_delay.InMilliseconds());
243 252
244 size_t number_of_loss_fields = 0; 253 size_t number_of_loss_fields = 0;
245 size_t max_number_of_loss_fields = std::min<size_t>( 254 size_t max_number_of_loss_fields = std::min<size_t>(
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 } else { 290 } else {
282 break; 291 break;
283 } 292 }
284 } 293 }
285 writer_.WriteU8(bitmask); 294 writer_.WriteU8(bitmask);
286 ++number_of_loss_fields; 295 ++number_of_loss_fields;
287 } 296 }
288 } 297 }
289 } 298 }
290 VLOG_IF(1, !nack_string_builder.Empty()) 299 VLOG_IF(1, !nack_string_builder.Empty())
291 << "SSRC: " << cast->media_ssrc 300 << "SSRC: " << cast->remote_ssrc << ", ACK: " << cast->ack_frame_id
292 << ", ACK: " << cast->ack_frame_id
293 << ", NACK: " << nack_string_builder.GetString(); 301 << ", NACK: " << nack_string_builder.GetString();
294 DCHECK_LE(number_of_loss_fields, kRtcpMaxCastLossFields); 302 DCHECK_LE(number_of_loss_fields, kRtcpMaxCastLossFields);
295 *cast_loss_field_pos = static_cast<uint8_t>(number_of_loss_fields); 303 *cast_loss_field_pos = static_cast<uint8_t>(number_of_loss_fields);
296 } 304 }
297 305
298 void RtcpBuilder::AddSR(const RtcpSenderInfo& sender_info) { 306 void RtcpBuilder::AddSR(const RtcpSenderInfo& sender_info) {
299 AddRtcpHeader(kPacketTypeSenderReport, 0); 307 AddRtcpHeader(kPacketTypeSenderReport, 0);
300 writer_.WriteU32(ssrc_); 308 writer_.WriteU32(ssrc_);
301 writer_.WriteU32(sender_info.ntp_seconds); 309 writer_.WriteU32(sender_info.ntp_seconds);
302 writer_.WriteU32(sender_info.ntp_fraction); 310 writer_.WriteU32(sender_info.ntp_fraction);
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 receiver_log_message->push_front(frame_log); 485 receiver_log_message->push_front(frame_log);
478 } 486 }
479 487
480 VLOG(3) << "number of frames: " << number_of_frames; 488 VLOG(3) << "number of frames: " << number_of_frames;
481 VLOG(3) << "total messages to send: " << *total_number_of_messages_to_send; 489 VLOG(3) << "total messages to send: " << *total_number_of_messages_to_send;
482 return number_of_frames > 0; 490 return number_of_frames > 0;
483 } 491 }
484 492
485 } // namespace cast 493 } // namespace cast
486 } // namespace media 494 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698