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

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

Issue 145873006: ui/base/resource: Roll our own version of ReadBigEndian() function. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 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 | Annotate | Revision Log
« no previous file with comments | « media/cast/rtcp/rtcp_sender.cc ('k') | media/cast/rtcp/test_rtcp_packet_builder.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_utility.h" 5 #include "media/cast/rtcp/rtcp_utility.h"
6 6
7 #include "base/big_endian.h"
7 #include "base/logging.h" 8 #include "base/logging.h"
8 #include "media/cast/transport/cast_transport_defines.h" 9 #include "media/cast/transport/cast_transport_defines.h"
9 #include "net/base/big_endian.h"
10 10
11 namespace media { 11 namespace media {
12 namespace cast { 12 namespace cast {
13 13
14 RtcpParser::RtcpParser(const uint8* rtcpData, size_t rtcpDataLength) 14 RtcpParser::RtcpParser(const uint8* rtcpData, size_t rtcpDataLength)
15 : rtcp_data_begin_(rtcpData), 15 : rtcp_data_begin_(rtcpData),
16 rtcp_data_end_(rtcpData + rtcpDataLength), 16 rtcp_data_end_(rtcpData + rtcpDataLength),
17 valid_packet_(false), 17 valid_packet_(false),
18 rtcp_data_(rtcpData), 18 rtcp_data_(rtcpData),
19 rtcp_block_end_(NULL), 19 rtcp_block_end_(NULL),
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 return true; 302 return true;
303 } 303 }
304 304
305 bool RtcpParser::ParseRR() { 305 bool RtcpParser::ParseRR() {
306 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 306 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
307 if (length < 8) 307 if (length < 8)
308 return false; 308 return false;
309 309
310 field_type_ = kRtcpRrCode; 310 field_type_ = kRtcpRrCode;
311 311
312 net::BigEndianReader big_endian_reader(rtcp_data_, length); 312 base::BigEndianReader big_endian_reader(
313 reinterpret_cast<const char*>(rtcp_data_), length);
313 big_endian_reader.Skip(4); // Skip header 314 big_endian_reader.Skip(4); // Skip header
314 big_endian_reader.ReadU32(&field_.receiver_report.sender_ssrc); 315 big_endian_reader.ReadU32(&field_.receiver_report.sender_ssrc);
315 field_.receiver_report.number_of_report_blocks = number_of_blocks_; 316 field_.receiver_report.number_of_report_blocks = number_of_blocks_;
316 rtcp_data_ += 8; 317 rtcp_data_ += 8;
317 318
318 // State transition 319 // State transition
319 state_ = kStateReportBlock; 320 state_ = kStateReportBlock;
320 return true; 321 return true;
321 } 322 }
322 323
323 bool RtcpParser::ParseSR() { 324 bool RtcpParser::ParseSR() {
324 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 325 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
325 if (length < 28) { 326 if (length < 28) {
326 EndCurrentBlock(); 327 EndCurrentBlock();
327 return false; 328 return false;
328 } 329 }
329 field_type_ = kRtcpSrCode; 330 field_type_ = kRtcpSrCode;
330 331
331 net::BigEndianReader big_endian_reader(rtcp_data_, length); 332 base::BigEndianReader big_endian_reader(
333 reinterpret_cast<const char*>(rtcp_data_), length);
332 big_endian_reader.Skip(4); // Skip header 334 big_endian_reader.Skip(4); // Skip header
333 big_endian_reader.ReadU32(&field_.sender_report.sender_ssrc); 335 big_endian_reader.ReadU32(&field_.sender_report.sender_ssrc);
334 big_endian_reader.ReadU32(&field_.sender_report.ntp_most_significant); 336 big_endian_reader.ReadU32(&field_.sender_report.ntp_most_significant);
335 big_endian_reader.ReadU32(&field_.sender_report.ntp_least_significant); 337 big_endian_reader.ReadU32(&field_.sender_report.ntp_least_significant);
336 big_endian_reader.ReadU32(&field_.sender_report.rtp_timestamp); 338 big_endian_reader.ReadU32(&field_.sender_report.rtp_timestamp);
337 big_endian_reader.ReadU32(&field_.sender_report.sender_packet_count); 339 big_endian_reader.ReadU32(&field_.sender_report.sender_packet_count);
338 big_endian_reader.ReadU32(&field_.sender_report.sender_octet_count); 340 big_endian_reader.ReadU32(&field_.sender_report.sender_octet_count);
339 field_.sender_report.number_of_report_blocks = number_of_blocks_; 341 field_.sender_report.number_of_report_blocks = number_of_blocks_;
340 rtcp_data_ += 28; 342 rtcp_data_ += 28;
341 343
342 if (number_of_blocks_ != 0) { 344 if (number_of_blocks_ != 0) {
343 // State transition. 345 // State transition.
344 state_ = kStateReportBlock; 346 state_ = kStateReportBlock;
345 } else { 347 } else {
346 // Don't go to state report block item if 0 report blocks. 348 // Don't go to state report block item if 0 report blocks.
347 state_ = kStateTopLevel; 349 state_ = kStateTopLevel;
348 EndCurrentBlock(); 350 EndCurrentBlock();
349 } 351 }
350 return true; 352 return true;
351 } 353 }
352 354
353 bool RtcpParser::ParseReportBlockItem() { 355 bool RtcpParser::ParseReportBlockItem() {
354 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 356 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
355 if (length < 24 || number_of_blocks_ <= 0) { 357 if (length < 24 || number_of_blocks_ <= 0) {
356 state_ = kStateTopLevel; 358 state_ = kStateTopLevel;
357 EndCurrentBlock(); 359 EndCurrentBlock();
358 return false; 360 return false;
359 } 361 }
360 362
361 net::BigEndianReader big_endian_reader(rtcp_data_, length); 363 base::BigEndianReader big_endian_reader(
364 reinterpret_cast<const char*>(rtcp_data_), length);
362 big_endian_reader.ReadU32(&field_.report_block_item.ssrc); 365 big_endian_reader.ReadU32(&field_.report_block_item.ssrc);
363 big_endian_reader.ReadU8(&field_.report_block_item.fraction_lost); 366 big_endian_reader.ReadU8(&field_.report_block_item.fraction_lost);
364 367
365 uint8 temp_number_of_packets_lost; 368 uint8 temp_number_of_packets_lost;
366 big_endian_reader.ReadU8(&temp_number_of_packets_lost); 369 big_endian_reader.ReadU8(&temp_number_of_packets_lost);
367 field_.report_block_item.cumulative_number_of_packets_lost = 370 field_.report_block_item.cumulative_number_of_packets_lost =
368 temp_number_of_packets_lost << 16; 371 temp_number_of_packets_lost << 16;
369 big_endian_reader.ReadU8(&temp_number_of_packets_lost); 372 big_endian_reader.ReadU8(&temp_number_of_packets_lost);
370 field_.report_block_item.cumulative_number_of_packets_lost += 373 field_.report_block_item.cumulative_number_of_packets_lost +=
371 temp_number_of_packets_lost << 8; 374 temp_number_of_packets_lost << 8;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 // Find c_name item in a Sdes chunk. 414 // Find c_name item in a Sdes chunk.
412 while (rtcp_data_ < rtcp_block_end_) { 415 while (rtcp_data_ < rtcp_block_end_) {
413 ptrdiff_t data_length = rtcp_block_end_ - rtcp_data_; 416 ptrdiff_t data_length = rtcp_block_end_ - rtcp_data_;
414 if (data_length < 4) { 417 if (data_length < 4) {
415 state_ = kStateTopLevel; 418 state_ = kStateTopLevel;
416 EndCurrentBlock(); 419 EndCurrentBlock();
417 return false; 420 return false;
418 } 421 }
419 422
420 uint32 ssrc; 423 uint32 ssrc;
421 net::BigEndianReader big_endian_reader(rtcp_data_, data_length); 424 base::BigEndianReader big_endian_reader(
425 reinterpret_cast<const char*>(rtcp_data_), data_length);
422 big_endian_reader.ReadU32(&ssrc); 426 big_endian_reader.ReadU32(&ssrc);
423 rtcp_data_ += 4; 427 rtcp_data_ += 4;
424 428
425 bool found_c_name = ParseSdesTypes(); 429 bool found_c_name = ParseSdesTypes();
426 if (found_c_name) { 430 if (found_c_name) {
427 field_.c_name.sender_ssrc = ssrc; 431 field_.c_name.sender_ssrc = ssrc;
428 return true; 432 return true;
429 } 433 }
430 } 434 }
431 state_ = kStateTopLevel; 435 state_ = kStateTopLevel;
432 EndCurrentBlock(); 436 EndCurrentBlock();
433 return false; 437 return false;
434 } 438 }
435 439
436 bool RtcpParser::ParseSdesTypes() { 440 bool RtcpParser::ParseSdesTypes() {
437 // Only the c_name item is mandatory. RFC 3550 page 46. 441 // Only the c_name item is mandatory. RFC 3550 page 46.
438 bool found_c_name = false; 442 bool found_c_name = false;
439 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 443 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
440 net::BigEndianReader big_endian_reader(rtcp_data_, length); 444 base::BigEndianReader big_endian_reader(
445 reinterpret_cast<const char*>(rtcp_data_), length);
441 446
442 while (big_endian_reader.remaining() > 0) { 447 while (big_endian_reader.remaining() > 0) {
443 uint8 tag; 448 uint8 tag;
444 big_endian_reader.ReadU8(&tag); 449 big_endian_reader.ReadU8(&tag);
445 450
446 if (tag == 0) { 451 if (tag == 0) {
447 // End tag! 4 octet aligned. 452 // End tag! 4 octet aligned.
448 rtcp_data_ = rtcp_block_end_; 453 rtcp_data_ = rtcp_block_end_;
449 return found_c_name; 454 return found_c_name;
450 } 455 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 bool RtcpParser::ParseByeItem() { 501 bool RtcpParser::ParseByeItem() {
497 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 502 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
498 if (length < 4 || number_of_blocks_ == 0) { 503 if (length < 4 || number_of_blocks_ == 0) {
499 state_ = kStateTopLevel; 504 state_ = kStateTopLevel;
500 EndCurrentBlock(); 505 EndCurrentBlock();
501 return false; 506 return false;
502 } 507 }
503 508
504 field_type_ = kRtcpByeCode; 509 field_type_ = kRtcpByeCode;
505 510
506 net::BigEndianReader big_endian_reader(rtcp_data_, length); 511 base::BigEndianReader big_endian_reader(
512 reinterpret_cast<const char*>(rtcp_data_), length);
507 big_endian_reader.ReadU32(&field_.bye.sender_ssrc); 513 big_endian_reader.ReadU32(&field_.bye.sender_ssrc);
508 rtcp_data_ += 4; 514 rtcp_data_ += 4;
509 515
510 // We can have several CSRCs attached. 516 // We can have several CSRCs attached.
511 if (length >= 4 * number_of_blocks_) { 517 if (length >= 4 * number_of_blocks_) {
512 rtcp_data_ += (number_of_blocks_ - 1) * 4; 518 rtcp_data_ += (number_of_blocks_ - 1) * 4;
513 } 519 }
514 number_of_blocks_ = 0; 520 number_of_blocks_ = 0;
515 return true; 521 return true;
516 } 522 }
517 523
518 bool RtcpParser::ParseApplicationDefined(uint8 subtype) { 524 bool RtcpParser::ParseApplicationDefined(uint8 subtype) {
519 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 525 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
520 if (length < 16 || 526 if (length < 16 ||
521 !(subtype == kSenderLogSubtype || subtype == kReceiverLogSubtype)) { 527 !(subtype == kSenderLogSubtype || subtype == kReceiverLogSubtype)) {
522 state_ = kStateTopLevel; 528 state_ = kStateTopLevel;
523 EndCurrentBlock(); 529 EndCurrentBlock();
524 return false; 530 return false;
525 } 531 }
526 532
527 uint32 sender_ssrc; 533 uint32 sender_ssrc;
528 uint32 name; 534 uint32 name;
529 535
530 net::BigEndianReader big_endian_reader(rtcp_data_, length); 536 base::BigEndianReader big_endian_reader(
537 reinterpret_cast<const char*>(rtcp_data_), length);
531 big_endian_reader.Skip(4); // Skip header. 538 big_endian_reader.Skip(4); // Skip header.
532 big_endian_reader.ReadU32(&sender_ssrc); 539 big_endian_reader.ReadU32(&sender_ssrc);
533 big_endian_reader.ReadU32(&name); 540 big_endian_reader.ReadU32(&name);
534 541
535 if (name != kCast) { 542 if (name != kCast) {
536 state_ = kStateTopLevel; 543 state_ = kStateTopLevel;
537 EndCurrentBlock(); 544 EndCurrentBlock();
538 return false; 545 return false;
539 } 546 }
540 rtcp_data_ += 12; 547 rtcp_data_ += 12;
(...skipping 16 matching lines...) Expand all
557 564
558 bool RtcpParser::ParseCastReceiverLogFrameItem() { 565 bool RtcpParser::ParseCastReceiverLogFrameItem() {
559 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 566 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
560 if (length < 12) { 567 if (length < 12) {
561 state_ = kStateTopLevel; 568 state_ = kStateTopLevel;
562 EndCurrentBlock(); 569 EndCurrentBlock();
563 return false; 570 return false;
564 } 571 }
565 uint32 rtp_timestamp; 572 uint32 rtp_timestamp;
566 uint32 data; 573 uint32 data;
567 net::BigEndianReader big_endian_reader(rtcp_data_, length); 574 base::BigEndianReader big_endian_reader(
575 reinterpret_cast<const char*>(rtcp_data_), length);
568 big_endian_reader.ReadU32(&rtp_timestamp); 576 big_endian_reader.ReadU32(&rtp_timestamp);
569 big_endian_reader.ReadU32(&data); 577 big_endian_reader.ReadU32(&data);
570 578
571 rtcp_data_ += 8; 579 rtcp_data_ += 8;
572 580
573 field_.cast_receiver_log.rtp_timestamp = rtp_timestamp; 581 field_.cast_receiver_log.rtp_timestamp = rtp_timestamp;
574 // We have 24 LSB of the event timestamp base on the wire. 582 // We have 24 LSB of the event timestamp base on the wire.
575 field_.cast_receiver_log.event_timestamp_base = data & 0xffffff; 583 field_.cast_receiver_log.event_timestamp_base = data & 0xffffff;
576 584
577 number_of_blocks_ = 1 + static_cast<uint8>(data >> 24); 585 number_of_blocks_ = 1 + static_cast<uint8>(data >> 24);
(...skipping 11 matching lines...) Expand all
589 } 597 }
590 if (number_of_blocks_ == 0) { 598 if (number_of_blocks_ == 0) {
591 // Continue parsing the next receiver frame event. 599 // Continue parsing the next receiver frame event.
592 state_ = kStateApplicationSpecificCastReceiverFrameLog; 600 state_ = kStateApplicationSpecificCastReceiverFrameLog;
593 return false; 601 return false;
594 } 602 }
595 number_of_blocks_--; 603 number_of_blocks_--;
596 604
597 uint16 delay_delta_or_packet_id; 605 uint16 delay_delta_or_packet_id;
598 uint16 event_type_and_timestamp_delta; 606 uint16 event_type_and_timestamp_delta;
599 net::BigEndianReader big_endian_reader(rtcp_data_, length); 607 base::BigEndianReader big_endian_reader(
608 reinterpret_cast<const char*>(rtcp_data_), length);
600 big_endian_reader.ReadU16(&delay_delta_or_packet_id); 609 big_endian_reader.ReadU16(&delay_delta_or_packet_id);
601 big_endian_reader.ReadU16(&event_type_and_timestamp_delta); 610 big_endian_reader.ReadU16(&event_type_and_timestamp_delta);
602 611
603 rtcp_data_ += 4; 612 rtcp_data_ += 4;
604 613
605 field_.cast_receiver_log.event = 614 field_.cast_receiver_log.event =
606 static_cast<uint8>(event_type_and_timestamp_delta >> 12); 615 static_cast<uint8>(event_type_and_timestamp_delta >> 12);
607 field_.cast_receiver_log.delay_delta_or_packet_id = delay_delta_or_packet_id; 616 field_.cast_receiver_log.delay_delta_or_packet_id = delay_delta_or_packet_id;
608 field_.cast_receiver_log.event_timestamp_delta = 617 field_.cast_receiver_log.event_timestamp_delta =
609 event_type_and_timestamp_delta & 0xfff; 618 event_type_and_timestamp_delta & 0xfff;
610 619
611 field_type_ = kRtcpApplicationSpecificCastReceiverLogEventCode; 620 field_type_ = kRtcpApplicationSpecificCastReceiverLogEventCode;
612 return true; 621 return true;
613 } 622 }
614 623
615 bool RtcpParser::ParseCastSenderLogItem() { 624 bool RtcpParser::ParseCastSenderLogItem() {
616 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 625 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
617 626
618 if (length < 4) { 627 if (length < 4) {
619 state_ = kStateTopLevel; 628 state_ = kStateTopLevel;
620 EndCurrentBlock(); 629 EndCurrentBlock();
621 return false; 630 return false;
622 } 631 }
623 uint32 data; 632 uint32 data;
624 net::BigEndianReader big_endian_reader(rtcp_data_, length); 633 base::BigEndianReader big_endian_reader(
634 reinterpret_cast<const char*>(rtcp_data_), length);
625 big_endian_reader.ReadU32(&data); 635 big_endian_reader.ReadU32(&data);
626 636
627 rtcp_data_ += 4; 637 rtcp_data_ += 4;
628 638
629 field_.cast_sender_log.status = static_cast<uint8>(data >> 24); 639 field_.cast_sender_log.status = static_cast<uint8>(data >> 24);
630 // We have 24 LSB of the RTP timestamp on the wire. 640 // We have 24 LSB of the RTP timestamp on the wire.
631 field_.cast_sender_log.rtp_timestamp = data & 0xffffff; 641 field_.cast_sender_log.rtp_timestamp = data & 0xffffff;
632 field_type_ = kRtcpApplicationSpecificCastSenderLogCode; 642 field_type_ = kRtcpApplicationSpecificCastSenderLogCode;
633 return true; 643 return true;
634 } 644 }
635 645
636 bool RtcpParser::ParseFeedBackCommon(const RtcpCommonHeader& header) { 646 bool RtcpParser::ParseFeedBackCommon(const RtcpCommonHeader& header) {
637 DCHECK((header.PT == transport::kPacketTypeGenericRtpFeedback) || 647 DCHECK((header.PT == transport::kPacketTypeGenericRtpFeedback) ||
638 (header.PT == transport::kPacketTypePayloadSpecific)) 648 (header.PT == transport::kPacketTypePayloadSpecific))
639 << "Invalid state"; 649 << "Invalid state";
640 650
641 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 651 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
642 652
643 if (length < 12) { // 4 * 3, RFC4585 section 6.1 653 if (length < 12) { // 4 * 3, RFC4585 section 6.1
644 EndCurrentBlock(); 654 EndCurrentBlock();
645 return false; 655 return false;
646 } 656 }
647 657
648 uint32 sender_ssrc; 658 uint32 sender_ssrc;
649 uint32 media_ssrc; 659 uint32 media_ssrc;
650 net::BigEndianReader big_endian_reader(rtcp_data_, length); 660 base::BigEndianReader big_endian_reader(
661 reinterpret_cast<const char*>(rtcp_data_), length);
651 big_endian_reader.Skip(4); // Skip header. 662 big_endian_reader.Skip(4); // Skip header.
652 big_endian_reader.ReadU32(&sender_ssrc); 663 big_endian_reader.ReadU32(&sender_ssrc);
653 big_endian_reader.ReadU32(&media_ssrc); 664 big_endian_reader.ReadU32(&media_ssrc);
654 665
655 rtcp_data_ += 12; 666 rtcp_data_ += 12;
656 667
657 if (header.PT == transport::kPacketTypeGenericRtpFeedback) { 668 if (header.PT == transport::kPacketTypeGenericRtpFeedback) {
658 // Transport layer feedback 669 // Transport layer feedback
659 switch (header.IC) { 670 switch (header.IC) {
660 case 1: 671 case 1:
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 } 760 }
750 if (length > 2 + kRtcpRpsiDataSize) { 761 if (length > 2 + kRtcpRpsiDataSize) {
751 state_ = kStateTopLevel; 762 state_ = kStateTopLevel;
752 EndCurrentBlock(); 763 EndCurrentBlock();
753 return false; 764 return false;
754 } 765 }
755 766
756 field_type_ = kRtcpPayloadSpecificRpsiCode; 767 field_type_ = kRtcpPayloadSpecificRpsiCode;
757 768
758 uint8 padding_bits; 769 uint8 padding_bits;
759 net::BigEndianReader big_endian_reader(rtcp_data_, length); 770 base::BigEndianReader big_endian_reader(
771 reinterpret_cast<const char*>(rtcp_data_), length);
760 big_endian_reader.ReadU8(&padding_bits); 772 big_endian_reader.ReadU8(&padding_bits);
761 big_endian_reader.ReadU8(&field_.rpsi.payload_type); 773 big_endian_reader.ReadU8(&field_.rpsi.payload_type);
762 big_endian_reader.ReadBytes(&field_.rpsi.native_bit_string, length - 2); 774 big_endian_reader.ReadBytes(&field_.rpsi.native_bit_string, length - 2);
763 field_.rpsi.number_of_valid_bits = 775 field_.rpsi.number_of_valid_bits =
764 static_cast<uint16>(length - 2) * 8 - padding_bits; 776 static_cast<uint16>(length - 2) * 8 - padding_bits;
765 777
766 rtcp_data_ += length; 778 rtcp_data_ += length;
767 return true; 779 return true;
768 } 780 }
769 781
770 bool RtcpParser::ParseNackItem() { 782 bool RtcpParser::ParseNackItem() {
771 // RFC 4585 6.2.1. Generic Nack 783 // RFC 4585 6.2.1. Generic Nack
772 784
773 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 785 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
774 if (length < 4) { 786 if (length < 4) {
775 state_ = kStateTopLevel; 787 state_ = kStateTopLevel;
776 EndCurrentBlock(); 788 EndCurrentBlock();
777 return false; 789 return false;
778 } 790 }
779 791
780 field_type_ = kRtcpGenericRtpFeedbackNackItemCode; 792 field_type_ = kRtcpGenericRtpFeedbackNackItemCode;
781 793
782 net::BigEndianReader big_endian_reader(rtcp_data_, length); 794 base::BigEndianReader big_endian_reader(
795 reinterpret_cast<const char*>(rtcp_data_), length);
783 big_endian_reader.ReadU16(&field_.nack_item.packet_id); 796 big_endian_reader.ReadU16(&field_.nack_item.packet_id);
784 big_endian_reader.ReadU16(&field_.nack_item.bitmask); 797 big_endian_reader.ReadU16(&field_.nack_item.bitmask);
785 rtcp_data_ += 4; 798 rtcp_data_ += 4;
786 return true; 799 return true;
787 } 800 }
788 801
789 bool RtcpParser::ParsePayloadSpecificAppItem() { 802 bool RtcpParser::ParsePayloadSpecificAppItem() {
790 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 803 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
791 804
792 if (length < 4) { 805 if (length < 4) {
793 state_ = kStateTopLevel; 806 state_ = kStateTopLevel;
794 EndCurrentBlock(); 807 EndCurrentBlock();
795 return false; 808 return false;
796 } 809 }
797 uint32 name; 810 uint32 name;
798 net::BigEndianReader big_endian_reader(rtcp_data_, length); 811 base::BigEndianReader big_endian_reader(
812 reinterpret_cast<const char*>(rtcp_data_), length);
799 big_endian_reader.ReadU32(&name); 813 big_endian_reader.ReadU32(&name);
800 rtcp_data_ += 4; 814 rtcp_data_ += 4;
801 815
802 if (name == kRemb) { 816 if (name == kRemb) {
803 field_type_ = kRtcpPayloadSpecificRembCode; 817 field_type_ = kRtcpPayloadSpecificRembCode;
804 state_ = kStatePayloadSpecificRemb; 818 state_ = kStatePayloadSpecificRemb;
805 return true; 819 return true;
806 } else if (name == kCast) { 820 } else if (name == kCast) {
807 field_type_ = kRtcpPayloadSpecificCastCode; 821 field_type_ = kRtcpPayloadSpecificCastCode;
808 state_ = kStatePayloadSpecificCast; 822 state_ = kStatePayloadSpecificCast;
809 return true; 823 return true;
810 } 824 }
811 state_ = kStateTopLevel; 825 state_ = kStateTopLevel;
812 EndCurrentBlock(); 826 EndCurrentBlock();
813 return false; 827 return false;
814 } 828 }
815 829
816 bool RtcpParser::ParsePayloadSpecificRembItem() { 830 bool RtcpParser::ParsePayloadSpecificRembItem() {
817 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 831 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
818 832
819 if (length < 4) { 833 if (length < 4) {
820 state_ = kStateTopLevel; 834 state_ = kStateTopLevel;
821 EndCurrentBlock(); 835 EndCurrentBlock();
822 return false; 836 return false;
823 } 837 }
824 838
825 net::BigEndianReader big_endian_reader(rtcp_data_, length); 839 base::BigEndianReader big_endian_reader(
840 reinterpret_cast<const char*>(rtcp_data_), length);
826 big_endian_reader.ReadU8(&field_.remb_item.number_of_ssrcs); 841 big_endian_reader.ReadU8(&field_.remb_item.number_of_ssrcs);
827 842
828 uint8 byte_1; 843 uint8 byte_1;
829 uint8 byte_2; 844 uint8 byte_2;
830 uint8 byte_3; 845 uint8 byte_3;
831 big_endian_reader.ReadU8(&byte_1); 846 big_endian_reader.ReadU8(&byte_1);
832 big_endian_reader.ReadU8(&byte_2); 847 big_endian_reader.ReadU8(&byte_2);
833 big_endian_reader.ReadU8(&byte_3); 848 big_endian_reader.ReadU8(&byte_3);
834 rtcp_data_ += 4; 849 rtcp_data_ += 4;
835 850
(...skipping 18 matching lines...) Expand all
854 869
855 bool RtcpParser::ParsePayloadSpecificCastItem() { 870 bool RtcpParser::ParsePayloadSpecificCastItem() {
856 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 871 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
857 if (length < 4) { 872 if (length < 4) {
858 state_ = kStateTopLevel; 873 state_ = kStateTopLevel;
859 EndCurrentBlock(); 874 EndCurrentBlock();
860 return false; 875 return false;
861 } 876 }
862 field_type_ = kRtcpPayloadSpecificCastCode; 877 field_type_ = kRtcpPayloadSpecificCastCode;
863 878
864 net::BigEndianReader big_endian_reader(rtcp_data_, length); 879 base::BigEndianReader big_endian_reader(
880 reinterpret_cast<const char*>(rtcp_data_), length);
865 big_endian_reader.ReadU8(&field_.cast_item.last_frame_id); 881 big_endian_reader.ReadU8(&field_.cast_item.last_frame_id);
866 big_endian_reader.ReadU8(&field_.cast_item.number_of_lost_fields); 882 big_endian_reader.ReadU8(&field_.cast_item.number_of_lost_fields);
867 883
868 rtcp_data_ += 4; 884 rtcp_data_ += 4;
869 885
870 if (field_.cast_item.number_of_lost_fields != 0) { 886 if (field_.cast_item.number_of_lost_fields != 0) {
871 // State transition 887 // State transition
872 state_ = kStatePayloadSpecificCastNack; 888 state_ = kStatePayloadSpecificCastNack;
873 } else { 889 } else {
874 // Don't go to state cast nack item if got 0 fields. 890 // Don't go to state cast nack item if got 0 fields.
875 state_ = kStateTopLevel; 891 state_ = kStateTopLevel;
876 EndCurrentBlock(); 892 EndCurrentBlock();
877 } 893 }
878 return true; 894 return true;
879 } 895 }
880 896
881 bool RtcpParser::ParsePayloadSpecificCastNackItem() { 897 bool RtcpParser::ParsePayloadSpecificCastNackItem() {
882 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 898 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
883 if (length < 4) { 899 if (length < 4) {
884 state_ = kStateTopLevel; 900 state_ = kStateTopLevel;
885 EndCurrentBlock(); 901 EndCurrentBlock();
886 return false; 902 return false;
887 } 903 }
888 field_type_ = kRtcpPayloadSpecificCastNackItemCode; 904 field_type_ = kRtcpPayloadSpecificCastNackItemCode;
889 905
890 net::BigEndianReader big_endian_reader(rtcp_data_, length); 906 base::BigEndianReader big_endian_reader(
907 reinterpret_cast<const char*>(rtcp_data_), length);
891 big_endian_reader.ReadU8(&field_.cast_nack_item.frame_id); 908 big_endian_reader.ReadU8(&field_.cast_nack_item.frame_id);
892 big_endian_reader.ReadU16(&field_.cast_nack_item.packet_id); 909 big_endian_reader.ReadU16(&field_.cast_nack_item.packet_id);
893 big_endian_reader.ReadU8(&field_.cast_nack_item.bitmask); 910 big_endian_reader.ReadU8(&field_.cast_nack_item.bitmask);
894 911
895 rtcp_data_ += 4; 912 rtcp_data_ += 4;
896 return true; 913 return true;
897 } 914 }
898 915
899 bool RtcpParser::ParseFirItem() { 916 bool RtcpParser::ParseFirItem() {
900 // RFC 5104 4.3.1. Full Intra Request (fir) 917 // RFC 5104 4.3.1. Full Intra Request (fir)
901 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 918 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
902 919
903 if (length < 8) { 920 if (length < 8) {
904 state_ = kStateTopLevel; 921 state_ = kStateTopLevel;
905 EndCurrentBlock(); 922 EndCurrentBlock();
906 return false; 923 return false;
907 } 924 }
908 field_type_ = kRtcpPayloadSpecificFirItemCode; 925 field_type_ = kRtcpPayloadSpecificFirItemCode;
909 926
910 net::BigEndianReader big_endian_reader(rtcp_data_, length); 927 base::BigEndianReader big_endian_reader(
928 reinterpret_cast<const char*>(rtcp_data_), length);
911 big_endian_reader.ReadU32(&field_.fir_item.ssrc); 929 big_endian_reader.ReadU32(&field_.fir_item.ssrc);
912 big_endian_reader.ReadU8(&field_.fir_item.command_sequence_number); 930 big_endian_reader.ReadU8(&field_.fir_item.command_sequence_number);
913 931
914 rtcp_data_ += 8; 932 rtcp_data_ += 8;
915 return true; 933 return true;
916 } 934 }
917 935
918 bool RtcpParser::ParseExtendedReport() { 936 bool RtcpParser::ParseExtendedReport() {
919 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 937 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
920 if (length < 8) 938 if (length < 8)
921 return false; 939 return false;
922 940
923 field_type_ = kRtcpXrCode; 941 field_type_ = kRtcpXrCode;
924 942
925 net::BigEndianReader big_endian_reader(rtcp_data_, length); 943 base::BigEndianReader big_endian_reader(
944 reinterpret_cast<const char*>(rtcp_data_), length);
926 big_endian_reader.Skip(4); // Skip header. 945 big_endian_reader.Skip(4); // Skip header.
927 big_endian_reader.ReadU32(&field_.extended_report.sender_ssrc); 946 big_endian_reader.ReadU32(&field_.extended_report.sender_ssrc);
928 947
929 rtcp_data_ += 8; 948 rtcp_data_ += 8;
930 949
931 state_ = kStateExtendedReportBlock; 950 state_ = kStateExtendedReportBlock;
932 return true; 951 return true;
933 } 952 }
934 953
935 bool RtcpParser::ParseExtendedReportItem() { 954 bool RtcpParser::ParseExtendedReportItem() {
936 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 955 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
937 if (length < 4) { 956 if (length < 4) {
938 state_ = kStateTopLevel; 957 state_ = kStateTopLevel;
939 EndCurrentBlock(); 958 EndCurrentBlock();
940 return false; 959 return false;
941 } 960 }
942 961
943 uint8 block_type; 962 uint8 block_type;
944 uint16 block_length; 963 uint16 block_length;
945 net::BigEndianReader big_endian_reader(rtcp_data_, length); 964 base::BigEndianReader big_endian_reader(
965 reinterpret_cast<const char*>(rtcp_data_), length);
946 big_endian_reader.ReadU8(&block_type); 966 big_endian_reader.ReadU8(&block_type);
947 big_endian_reader.Skip(1); // Ignore reserved. 967 big_endian_reader.Skip(1); // Ignore reserved.
948 big_endian_reader.ReadU16(&block_length); 968 big_endian_reader.ReadU16(&block_length);
949 969
950 rtcp_data_ += 4; 970 rtcp_data_ += 4;
951 971
952 switch (block_type) { 972 switch (block_type) {
953 case 4: 973 case 4:
954 if (block_length != 2) { 974 if (block_length != 2) {
955 // Invalid block length. 975 // Invalid block length.
(...skipping 28 matching lines...) Expand all
984 } 1004 }
985 1005
986 bool RtcpParser::ParseExtendedReportReceiverReferenceTimeReport() { 1006 bool RtcpParser::ParseExtendedReportReceiverReferenceTimeReport() {
987 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 1007 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
988 if (length < 8) { 1008 if (length < 8) {
989 state_ = kStateTopLevel; 1009 state_ = kStateTopLevel;
990 EndCurrentBlock(); 1010 EndCurrentBlock();
991 return false; 1011 return false;
992 } 1012 }
993 1013
994 net::BigEndianReader big_endian_reader(rtcp_data_, length); 1014 base::BigEndianReader big_endian_reader(
1015 reinterpret_cast<const char*>(rtcp_data_), length);
995 big_endian_reader.ReadU32(&field_.rrtr.ntp_most_significant); 1016 big_endian_reader.ReadU32(&field_.rrtr.ntp_most_significant);
996 big_endian_reader.ReadU32(&field_.rrtr.ntp_least_significant); 1017 big_endian_reader.ReadU32(&field_.rrtr.ntp_least_significant);
997 1018
998 rtcp_data_ += 8; 1019 rtcp_data_ += 8;
999 1020
1000 field_type_ = kRtcpXrRrtrCode; 1021 field_type_ = kRtcpXrRrtrCode;
1001 return true; 1022 return true;
1002 } 1023 }
1003 1024
1004 bool RtcpParser::ParseExtendedReportDelaySinceLastReceiverReport() { 1025 bool RtcpParser::ParseExtendedReportDelaySinceLastReceiverReport() {
1005 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; 1026 ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
1006 if (length < 12) { 1027 if (length < 12) {
1007 state_ = kStateTopLevel; 1028 state_ = kStateTopLevel;
1008 EndCurrentBlock(); 1029 EndCurrentBlock();
1009 return false; 1030 return false;
1010 } 1031 }
1011 if (number_of_blocks_ == 0) { 1032 if (number_of_blocks_ == 0) {
1012 // Continue parsing the extended report block. 1033 // Continue parsing the extended report block.
1013 state_ = kStateExtendedReportBlock; 1034 state_ = kStateExtendedReportBlock;
1014 return false; 1035 return false;
1015 } 1036 }
1016 1037
1017 net::BigEndianReader big_endian_reader(rtcp_data_, length); 1038 base::BigEndianReader big_endian_reader(
1039 reinterpret_cast<const char*>(rtcp_data_), length);
1018 big_endian_reader.ReadU32(&field_.dlrr.receivers_ssrc); 1040 big_endian_reader.ReadU32(&field_.dlrr.receivers_ssrc);
1019 big_endian_reader.ReadU32(&field_.dlrr.last_receiver_report); 1041 big_endian_reader.ReadU32(&field_.dlrr.last_receiver_report);
1020 big_endian_reader.ReadU32(&field_.dlrr.delay_last_receiver_report); 1042 big_endian_reader.ReadU32(&field_.dlrr.delay_last_receiver_report);
1021 1043
1022 rtcp_data_ += 12; 1044 rtcp_data_ += 12;
1023 1045
1024 number_of_blocks_--; 1046 number_of_blocks_--;
1025 field_type_ = kRtcpXrDlrrCode; 1047 field_type_ = kRtcpXrDlrrCode;
1026 return true; 1048 return true;
1027 } 1049 }
1028 1050
1029 } // namespace cast 1051 } // namespace cast
1030 } // namespace media 1052 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/rtcp/rtcp_sender.cc ('k') | media/cast/rtcp/test_rtcp_packet_builder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698