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

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

Powered by Google App Engine
This is Rietveld 408576698