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

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

Issue 109413004: Cast:Adding cast_transport_config and cleaning up (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Injecting TaskRunner Created 6 years, 11 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 | Annotate | Revision Log
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_sender.h" 5 #include "media/cast/rtcp/rtcp_sender.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 std::vector<uint8>* packet) const { 188 std::vector<uint8>* packet) const {
189 size_t start_size = packet->size(); 189 size_t start_size = packet->size();
190 DCHECK_LT(start_size + 32, kIpPacketSize) << "Not enough buffer space"; 190 DCHECK_LT(start_size + 32, kIpPacketSize) << "Not enough buffer space";
191 if (start_size + 32 > kIpPacketSize) return; 191 if (start_size + 32 > kIpPacketSize) return;
192 192
193 uint16 number_of_rows = (report_block) ? 7 : 1; 193 uint16 number_of_rows = (report_block) ? 7 : 1;
194 packet->resize(start_size + 8); 194 packet->resize(start_size + 8);
195 195
196 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 8); 196 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 8);
197 big_endian_writer.WriteU8(0x80 + (report_block ? 1 : 0)); 197 big_endian_writer.WriteU8(0x80 + (report_block ? 1 : 0));
198 big_endian_writer.WriteU8(kPacketTypeReceiverReport); 198 big_endian_writer.WriteU8(transport::kPacketTypeReceiverReport);
199 big_endian_writer.WriteU16(number_of_rows); 199 big_endian_writer.WriteU16(number_of_rows);
200 big_endian_writer.WriteU32(ssrc_); 200 big_endian_writer.WriteU32(ssrc_);
201 201
202 if (report_block) { 202 if (report_block) {
203 AddReportBlocks(*report_block, packet); // Adds 24 bytes. 203 AddReportBlocks(*report_block, packet); // Adds 24 bytes.
204 } 204 }
205 } 205 }
206 206
207 void RtcpSender::AddReportBlocks(const transport::RtcpReportBlock& report_block, 207 void RtcpSender::AddReportBlocks(const transport::RtcpReportBlock& report_block,
208 std::vector<uint8>* packet) const { 208 std::vector<uint8>* packet) const {
(...skipping 28 matching lines...) Expand all
237 DCHECK_LT(start_size + 12 + c_name_.length(), kIpPacketSize) 237 DCHECK_LT(start_size + 12 + c_name_.length(), kIpPacketSize)
238 << "Not enough buffer space"; 238 << "Not enough buffer space";
239 if (start_size + 12 > kIpPacketSize) return; 239 if (start_size + 12 > kIpPacketSize) return;
240 240
241 // SDES Source Description. 241 // SDES Source Description.
242 packet->resize(start_size + 10); 242 packet->resize(start_size + 10);
243 243
244 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 10); 244 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 10);
245 // We always need to add one SDES CNAME. 245 // We always need to add one SDES CNAME.
246 big_endian_writer.WriteU8(0x80 + 1); 246 big_endian_writer.WriteU8(0x80 + 1);
247 big_endian_writer.WriteU8(kPacketTypeSdes); 247 big_endian_writer.WriteU8(transport::kPacketTypeSdes);
248 248
249 // Handle SDES length later on. 249 // Handle SDES length later on.
250 uint32 sdes_length_position = static_cast<uint32>(start_size) + 3; 250 uint32 sdes_length_position = static_cast<uint32>(start_size) + 3;
251 big_endian_writer.WriteU16(0); 251 big_endian_writer.WriteU16(0);
252 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. 252 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC.
253 big_endian_writer.WriteU8(1); // CNAME = 1 253 big_endian_writer.WriteU8(1); // CNAME = 1
254 big_endian_writer.WriteU8(static_cast<uint8>(c_name_.length())); 254 big_endian_writer.WriteU8(static_cast<uint8>(c_name_.length()));
255 255
256 size_t sdes_length = 10 + c_name_.length(); 256 size_t sdes_length = 10 + c_name_.length();
257 packet->insert(packet->end(), c_name_.c_str(), 257 packet->insert(packet->end(), c_name_.c_str(),
(...skipping 21 matching lines...) Expand all
279 std::vector<uint8>* packet) const { 279 std::vector<uint8>* packet) const {
280 size_t start_size = packet->size(); 280 size_t start_size = packet->size();
281 DCHECK_LT(start_size + 12, kIpPacketSize) << "Not enough buffer space"; 281 DCHECK_LT(start_size + 12, kIpPacketSize) << "Not enough buffer space";
282 if (start_size + 12 > kIpPacketSize) return; 282 if (start_size + 12 > kIpPacketSize) return;
283 283
284 packet->resize(start_size + 12); 284 packet->resize(start_size + 12);
285 285
286 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 12); 286 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 12);
287 uint8 FMT = 1; // Picture loss indicator. 287 uint8 FMT = 1; // Picture loss indicator.
288 big_endian_writer.WriteU8(0x80 + FMT); 288 big_endian_writer.WriteU8(0x80 + FMT);
289 big_endian_writer.WriteU8(kPacketTypePayloadSpecific); 289 big_endian_writer.WriteU8(transport::kPacketTypePayloadSpecific);
290 big_endian_writer.WriteU16(2); // Used fixed length of 2. 290 big_endian_writer.WriteU16(2); // Used fixed length of 2.
291 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. 291 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC.
292 big_endian_writer.WriteU32(remote_ssrc); // Add the remote SSRC. 292 big_endian_writer.WriteU32(remote_ssrc); // Add the remote SSRC.
293 } 293 }
294 294
295 /* 295 /*
296 0 1 2 3 296 0 1 2 3
297 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 297 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
298 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 298 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
299 | PB |0| Payload Type| Native Rpsi bit string | 299 | PB |0| Payload Type| Native Rpsi bit string |
300 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 300 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
301 | defined per codec ... | Padding (0) | 301 | defined per codec ... | Padding (0) |
302 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 302 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
303 */ 303 */
304 void RtcpSender::BuildRpsi(const RtcpRpsiMessage* rpsi, 304 void RtcpSender::BuildRpsi(const RtcpRpsiMessage* rpsi,
305 std::vector<uint8>* packet) const { 305 std::vector<uint8>* packet) const {
306 size_t start_size = packet->size(); 306 size_t start_size = packet->size();
307 DCHECK_LT(start_size + 24, kIpPacketSize) << "Not enough buffer space"; 307 DCHECK_LT(start_size + 24, kIpPacketSize) << "Not enough buffer space";
308 if (start_size + 24 > kIpPacketSize) return; 308 if (start_size + 24 > kIpPacketSize) return;
309 309
310 packet->resize(start_size + 24); 310 packet->resize(start_size + 24);
311 311
312 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 24); 312 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 24);
313 uint8 FMT = 3; // Reference Picture Selection Indication. 313 uint8 FMT = 3; // Reference Picture Selection Indication.
314 big_endian_writer.WriteU8(0x80 + FMT); 314 big_endian_writer.WriteU8(0x80 + FMT);
315 big_endian_writer.WriteU8(kPacketTypePayloadSpecific); 315 big_endian_writer.WriteU8(transport::kPacketTypePayloadSpecific);
316 316
317 // Calculate length. 317 // Calculate length.
318 uint32 bits_required = 7; 318 uint32 bits_required = 7;
319 uint8 bytes_required = 1; 319 uint8 bytes_required = 1;
320 while ((rpsi->picture_id >> bits_required) > 0) { 320 while ((rpsi->picture_id >> bits_required) > 0) {
321 bits_required += 7; 321 bits_required += 7;
322 bytes_required++; 322 bytes_required++;
323 } 323 }
324 uint8 size = 3; 324 uint8 size = 3;
325 if (bytes_required > 6) { 325 if (bytes_required > 6) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 << "Not enough buffer space"; 362 << "Not enough buffer space";
363 if (start_size + remb_size > kIpPacketSize) return; 363 if (start_size + remb_size > kIpPacketSize) return;
364 364
365 packet->resize(start_size + remb_size); 365 packet->resize(start_size + remb_size);
366 366
367 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), remb_size); 367 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), remb_size);
368 368
369 // Add application layer feedback. 369 // Add application layer feedback.
370 uint8 FMT = 15; 370 uint8 FMT = 15;
371 big_endian_writer.WriteU8(0x80 + FMT); 371 big_endian_writer.WriteU8(0x80 + FMT);
372 big_endian_writer.WriteU8(kPacketTypePayloadSpecific); 372 big_endian_writer.WriteU8(transport::kPacketTypePayloadSpecific);
373 big_endian_writer.WriteU8(0); 373 big_endian_writer.WriteU8(0);
374 big_endian_writer.WriteU8(static_cast<uint8>(remb->remb_ssrcs.size() + 4)); 374 big_endian_writer.WriteU8(static_cast<uint8>(remb->remb_ssrcs.size() + 4));
375 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. 375 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC.
376 big_endian_writer.WriteU32(0); // Remote SSRC must be 0. 376 big_endian_writer.WriteU32(0); // Remote SSRC must be 0.
377 big_endian_writer.WriteU32(kRemb); 377 big_endian_writer.WriteU32(kRemb);
378 big_endian_writer.WriteU8(static_cast<uint8>(remb->remb_ssrcs.size())); 378 big_endian_writer.WriteU8(static_cast<uint8>(remb->remb_ssrcs.size()));
379 379
380 // 6 bit exponent and a 18 bit mantissa. 380 // 6 bit exponent and a 18 bit mantissa.
381 uint8 bitrate_exponent; 381 uint8 bitrate_exponent;
382 uint32 bitrate_mantissa; 382 uint32 bitrate_mantissa;
(...skipping 20 matching lines...) Expand all
403 size_t start_size = packet->size(); 403 size_t start_size = packet->size();
404 DCHECK_LT(start_size + 16, kIpPacketSize) << "Not enough buffer space"; 404 DCHECK_LT(start_size + 16, kIpPacketSize) << "Not enough buffer space";
405 if (start_size + 16 > kIpPacketSize) return; 405 if (start_size + 16 > kIpPacketSize) return;
406 406
407 packet->resize(start_size + 16); 407 packet->resize(start_size + 16);
408 408
409 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 16); 409 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 16);
410 410
411 uint8 FMT = 1; 411 uint8 FMT = 1;
412 big_endian_writer.WriteU8(0x80 + FMT); 412 big_endian_writer.WriteU8(0x80 + FMT);
413 big_endian_writer.WriteU8(kPacketTypeGenericRtpFeedback); 413 big_endian_writer.WriteU8(transport::kPacketTypeGenericRtpFeedback);
414 big_endian_writer.WriteU8(0); 414 big_endian_writer.WriteU8(0);
415 size_t nack_size_pos = start_size + 3; 415 size_t nack_size_pos = start_size + 3;
416 big_endian_writer.WriteU8(3); 416 big_endian_writer.WriteU8(3);
417 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. 417 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC.
418 big_endian_writer.WriteU32(nack->remote_ssrc); // Add the remote SSRC. 418 big_endian_writer.WriteU32(nack->remote_ssrc); // Add the remote SSRC.
419 419
420 // Build NACK bitmasks and write them to the Rtcp message. 420 // Build NACK bitmasks and write them to the Rtcp message.
421 // The nack list should be sorted and not contain duplicates. 421 // The nack list should be sorted and not contain duplicates.
422 size_t number_of_nack_fields = 0; 422 size_t number_of_nack_fields = 0;
423 size_t max_number_of_nack_fields = std::min<size_t>(kRtcpMaxNackFields, 423 size_t max_number_of_nack_fields = std::min<size_t>(kRtcpMaxNackFields,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 455
456 void RtcpSender::BuildBye(std::vector<uint8>* packet) const { 456 void RtcpSender::BuildBye(std::vector<uint8>* packet) const {
457 size_t start_size = packet->size(); 457 size_t start_size = packet->size();
458 DCHECK_LT(start_size + 8, kIpPacketSize) << "Not enough buffer space"; 458 DCHECK_LT(start_size + 8, kIpPacketSize) << "Not enough buffer space";
459 if (start_size + 8 > kIpPacketSize) return; 459 if (start_size + 8 > kIpPacketSize) return;
460 460
461 packet->resize(start_size + 8); 461 packet->resize(start_size + 8);
462 462
463 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 8); 463 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 8);
464 big_endian_writer.WriteU8(0x80 + 1); 464 big_endian_writer.WriteU8(0x80 + 1);
465 big_endian_writer.WriteU8(kPacketTypeBye); 465 big_endian_writer.WriteU8(transport::kPacketTypeBye);
466 big_endian_writer.WriteU16(1); // Length. 466 big_endian_writer.WriteU16(1); // Length.
467 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. 467 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC.
468 } 468 }
469 469
470 void RtcpSender::BuildRrtr(const RtcpReceiverReferenceTimeReport* rrtr, 470 void RtcpSender::BuildRrtr(const RtcpReceiverReferenceTimeReport* rrtr,
471 std::vector<uint8>* packet) const { 471 std::vector<uint8>* packet) const {
472 size_t start_size = packet->size(); 472 size_t start_size = packet->size();
473 DCHECK_LT(start_size + 20, kIpPacketSize) << "Not enough buffer space"; 473 DCHECK_LT(start_size + 20, kIpPacketSize) << "Not enough buffer space";
474 if (start_size + 20 > kIpPacketSize) return; 474 if (start_size + 20 > kIpPacketSize) return;
475 475
476 packet->resize(start_size + 20); 476 packet->resize(start_size + 20);
477 477
478 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 20); 478 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 20);
479 479
480 big_endian_writer.WriteU8(0x80); 480 big_endian_writer.WriteU8(0x80);
481 big_endian_writer.WriteU8(kPacketTypeXr); 481 big_endian_writer.WriteU8(transport::kPacketTypeXr);
482 big_endian_writer.WriteU16(4); // Length. 482 big_endian_writer.WriteU16(4); // Length.
483 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. 483 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC.
484 big_endian_writer.WriteU8(4); // Add block type. 484 big_endian_writer.WriteU8(4); // Add block type.
485 big_endian_writer.WriteU8(0); // Add reserved. 485 big_endian_writer.WriteU8(0); // Add reserved.
486 big_endian_writer.WriteU16(2); // Block length. 486 big_endian_writer.WriteU16(2); // Block length.
487 487
488 // Add the media (received RTP) SSRC. 488 // Add the media (received RTP) SSRC.
489 big_endian_writer.WriteU32(rrtr->ntp_seconds); 489 big_endian_writer.WriteU32(rrtr->ntp_seconds);
490 big_endian_writer.WriteU32(rrtr->ntp_fraction); 490 big_endian_writer.WriteU32(rrtr->ntp_fraction);
491 } 491 }
492 492
493 void RtcpSender::BuildCast(const RtcpCastMessage* cast, 493 void RtcpSender::BuildCast(const RtcpCastMessage* cast,
494 std::vector<uint8>* packet) const { 494 std::vector<uint8>* packet) const {
495 size_t start_size = packet->size(); 495 size_t start_size = packet->size();
496 DCHECK_LT(start_size + 20, kIpPacketSize) << "Not enough buffer space"; 496 DCHECK_LT(start_size + 20, kIpPacketSize) << "Not enough buffer space";
497 if (start_size + 20 > kIpPacketSize) return; 497 if (start_size + 20 > kIpPacketSize) return;
498 498
499 packet->resize(start_size + 20); 499 packet->resize(start_size + 20);
500 500
501 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 20); 501 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 20);
502 uint8 FMT = 15; // Application layer feedback. 502 uint8 FMT = 15; // Application layer feedback.
503 big_endian_writer.WriteU8(0x80 + FMT); 503 big_endian_writer.WriteU8(0x80 + FMT);
504 big_endian_writer.WriteU8(kPacketTypePayloadSpecific); 504 big_endian_writer.WriteU8(transport::kPacketTypePayloadSpecific);
505 big_endian_writer.WriteU8(0); 505 big_endian_writer.WriteU8(0);
506 size_t cast_size_pos = start_size + 3; // Save length position. 506 size_t cast_size_pos = start_size + 3; // Save length position.
507 big_endian_writer.WriteU8(4); 507 big_endian_writer.WriteU8(4);
508 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. 508 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC.
509 big_endian_writer.WriteU32(cast->media_ssrc_); // Remote SSRC. 509 big_endian_writer.WriteU32(cast->media_ssrc_); // Remote SSRC.
510 big_endian_writer.WriteU32(kCast); 510 big_endian_writer.WriteU32(kCast);
511 big_endian_writer.WriteU8(static_cast<uint8>(cast->ack_frame_id_)); 511 big_endian_writer.WriteU8(static_cast<uint8>(cast->ack_frame_id_));
512 size_t cast_loss_field_pos = start_size + 17; // Save loss field position. 512 size_t cast_loss_field_pos = start_size + 17; // Save loss field position.
513 big_endian_writer.WriteU8(0); // Overwritten with number_of_loss_fields. 513 big_endian_writer.WriteU8(0); // Overwritten with number_of_loss_fields.
514 big_endian_writer.WriteU8(0); // Reserved. 514 big_endian_writer.WriteU8(0); // Reserved.
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 &number_of_frames, 581 &number_of_frames,
582 &total_number_of_messages_to_send, 582 &total_number_of_messages_to_send,
583 &rtcp_log_size)) { 583 &rtcp_log_size)) {
584 return; 584 return;
585 } 585 }
586 packet->resize(packet_start_size + rtcp_log_size); 586 packet->resize(packet_start_size + rtcp_log_size);
587 587
588 net::BigEndianWriter big_endian_writer(&((*packet)[packet_start_size]), 588 net::BigEndianWriter big_endian_writer(&((*packet)[packet_start_size]),
589 rtcp_log_size); 589 rtcp_log_size);
590 big_endian_writer.WriteU8(0x80 + kReceiverLogSubtype); 590 big_endian_writer.WriteU8(0x80 + kReceiverLogSubtype);
591 big_endian_writer.WriteU8(kPacketTypeApplicationDefined); 591 big_endian_writer.WriteU8(transport::kPacketTypeApplicationDefined);
592 big_endian_writer.WriteU16(static_cast<uint16>(2 + 2 * number_of_frames + 592 big_endian_writer.WriteU16(static_cast<uint16>(2 + 2 * number_of_frames +
593 total_number_of_messages_to_send)); 593 total_number_of_messages_to_send));
594 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. 594 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC.
595 big_endian_writer.WriteU32(kCast); 595 big_endian_writer.WriteU32(kCast);
596 596
597 while (!receiver_log_message->empty() && 597 while (!receiver_log_message->empty() &&
598 total_number_of_messages_to_send > 0) { 598 total_number_of_messages_to_send > 0) {
599 RtcpReceiverFrameLogMessage& frame_log_messages = 599 RtcpReceiverFrameLogMessage& frame_log_messages =
600 receiver_log_message->front(); 600 receiver_log_message->front();
601 // Add our frame header. 601 // Add our frame header.
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 if (frame_log_messages.event_log_messages_.empty()) { 649 if (frame_log_messages.event_log_messages_.empty()) {
650 // We sent all messages on this frame; pop the frame header. 650 // We sent all messages on this frame; pop the frame header.
651 receiver_log_message->pop_front(); 651 receiver_log_message->pop_front();
652 } 652 }
653 } 653 }
654 DCHECK_EQ(total_number_of_messages_to_send, 0); 654 DCHECK_EQ(total_number_of_messages_to_send, 0);
655 } 655 }
656 656
657 } // namespace cast 657 } // namespace cast
658 } // namespace media 658 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698