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