OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |