| 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/net/rtcp/rtcp_utility.h" |
| 6 | 6 |
| 7 #include "base/big_endian.h" | 7 #include "base/big_endian.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "media/cast/transport/cast_transport_defines.h" | 9 #include "media/cast/net/cast_transport_defines.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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 bool success = RtcpParseCommonHeader(rtcp_data_, rtcp_data_end_, &header); | 99 bool success = RtcpParseCommonHeader(rtcp_data_, rtcp_data_end_, &header); |
| 100 if (!success) | 100 if (!success) |
| 101 return; | 101 return; |
| 102 | 102 |
| 103 rtcp_block_end_ = rtcp_data_ + header.length_in_octets; | 103 rtcp_block_end_ = rtcp_data_ + header.length_in_octets; |
| 104 | 104 |
| 105 if (rtcp_block_end_ > rtcp_data_end_) | 105 if (rtcp_block_end_ > rtcp_data_end_) |
| 106 return; // Bad block! | 106 return; // Bad block! |
| 107 | 107 |
| 108 switch (header.PT) { | 108 switch (header.PT) { |
| 109 case transport::kPacketTypeSenderReport: | 109 case kPacketTypeSenderReport: |
| 110 // number of Report blocks | 110 // number of Report blocks |
| 111 number_of_blocks_ = header.IC; | 111 number_of_blocks_ = header.IC; |
| 112 ParseSR(); | 112 ParseSR(); |
| 113 return; | 113 return; |
| 114 case transport::kPacketTypeReceiverReport: | 114 case kPacketTypeReceiverReport: |
| 115 // number of Report blocks | 115 // number of Report blocks |
| 116 number_of_blocks_ = header.IC; | 116 number_of_blocks_ = header.IC; |
| 117 ParseRR(); | 117 ParseRR(); |
| 118 return; | 118 return; |
| 119 case transport::kPacketTypeSdes: | 119 case kPacketTypeSdes: |
| 120 // number of Sdes blocks | 120 // number of Sdes blocks |
| 121 number_of_blocks_ = header.IC; | 121 number_of_blocks_ = header.IC; |
| 122 if (!ParseSdes()) { | 122 if (!ParseSdes()) { |
| 123 break; // Nothing supported found, continue to next block! | 123 break; // Nothing supported found, continue to next block! |
| 124 } | 124 } |
| 125 return; | 125 return; |
| 126 case transport::kPacketTypeBye: | 126 case kPacketTypeBye: |
| 127 number_of_blocks_ = header.IC; | 127 number_of_blocks_ = header.IC; |
| 128 if (!ParseBye()) { | 128 if (!ParseBye()) { |
| 129 // Nothing supported found, continue to next block! | 129 // Nothing supported found, continue to next block! |
| 130 break; | 130 break; |
| 131 } | 131 } |
| 132 return; | 132 return; |
| 133 case transport::kPacketTypeApplicationDefined: | 133 case kPacketTypeApplicationDefined: |
| 134 if (!ParseApplicationDefined(header.IC)) { | 134 if (!ParseApplicationDefined(header.IC)) { |
| 135 // Nothing supported found, continue to next block! | 135 // Nothing supported found, continue to next block! |
| 136 break; | 136 break; |
| 137 } | 137 } |
| 138 return; | 138 return; |
| 139 case transport::kPacketTypeGenericRtpFeedback: // Fall through! | 139 case kPacketTypeGenericRtpFeedback: // Fall through! |
| 140 case transport::kPacketTypePayloadSpecific: | 140 case kPacketTypePayloadSpecific: |
| 141 if (!ParseFeedBackCommon(header)) { | 141 if (!ParseFeedBackCommon(header)) { |
| 142 // Nothing supported found, continue to next block! | 142 // Nothing supported found, continue to next block! |
| 143 break; | 143 break; |
| 144 } | 144 } |
| 145 return; | 145 return; |
| 146 case transport::kPacketTypeXr: | 146 case kPacketTypeXr: |
| 147 if (!ParseExtendedReport()) { | 147 if (!ParseExtendedReport()) { |
| 148 break; // Nothing supported found, continue to next block! | 148 break; // Nothing supported found, continue to next block! |
| 149 } | 149 } |
| 150 return; | 150 return; |
| 151 default: | 151 default: |
| 152 // Not supported! Skip! | 152 // Not supported! Skip! |
| 153 EndCurrentBlock(); | 153 EndCurrentBlock(); |
| 154 break; | 154 break; |
| 155 } | 155 } |
| 156 } | 156 } |
| (...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 field_.cast_receiver_log.delay_delta_or_packet_id.packet_id = | 602 field_.cast_receiver_log.delay_delta_or_packet_id.packet_id = |
| 603 delay_delta_or_packet_id; | 603 delay_delta_or_packet_id; |
| 604 field_.cast_receiver_log.event_timestamp_delta = | 604 field_.cast_receiver_log.event_timestamp_delta = |
| 605 event_type_and_timestamp_delta & 0xfff; | 605 event_type_and_timestamp_delta & 0xfff; |
| 606 | 606 |
| 607 field_type_ = kRtcpApplicationSpecificCastReceiverLogEventCode; | 607 field_type_ = kRtcpApplicationSpecificCastReceiverLogEventCode; |
| 608 return true; | 608 return true; |
| 609 } | 609 } |
| 610 | 610 |
| 611 bool RtcpParser::ParseFeedBackCommon(const RtcpCommonHeader& header) { | 611 bool RtcpParser::ParseFeedBackCommon(const RtcpCommonHeader& header) { |
| 612 DCHECK((header.PT == transport::kPacketTypeGenericRtpFeedback) || | 612 DCHECK((header.PT == kPacketTypeGenericRtpFeedback) || |
| 613 (header.PT == transport::kPacketTypePayloadSpecific)) | 613 (header.PT == kPacketTypePayloadSpecific)) |
| 614 << "Invalid state"; | 614 << "Invalid state"; |
| 615 | 615 |
| 616 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; | 616 ptrdiff_t length = rtcp_block_end_ - rtcp_data_; |
| 617 | 617 |
| 618 if (length < 12) { // 4 * 3, RFC4585 section 6.1 | 618 if (length < 12) { // 4 * 3, RFC4585 section 6.1 |
| 619 EndCurrentBlock(); | 619 EndCurrentBlock(); |
| 620 return false; | 620 return false; |
| 621 } | 621 } |
| 622 | 622 |
| 623 uint32 sender_ssrc; | 623 uint32 sender_ssrc; |
| 624 uint32 media_ssrc; | 624 uint32 media_ssrc; |
| 625 base::BigEndianReader big_endian_reader( | 625 base::BigEndianReader big_endian_reader( |
| 626 reinterpret_cast<const char*>(rtcp_data_), length); | 626 reinterpret_cast<const char*>(rtcp_data_), length); |
| 627 big_endian_reader.Skip(4); // Skip header. | 627 big_endian_reader.Skip(4); // Skip header. |
| 628 big_endian_reader.ReadU32(&sender_ssrc); | 628 big_endian_reader.ReadU32(&sender_ssrc); |
| 629 big_endian_reader.ReadU32(&media_ssrc); | 629 big_endian_reader.ReadU32(&media_ssrc); |
| 630 | 630 |
| 631 rtcp_data_ += 12; | 631 rtcp_data_ += 12; |
| 632 | 632 |
| 633 if (header.PT == transport::kPacketTypeGenericRtpFeedback) { | 633 if (header.PT == kPacketTypeGenericRtpFeedback) { |
| 634 // Transport layer feedback | 634 // Transport layer feedback |
| 635 switch (header.IC) { | 635 switch (header.IC) { |
| 636 case 1: | 636 case 1: |
| 637 // Nack | 637 // Nack |
| 638 field_type_ = kRtcpGenericRtpFeedbackNackCode; | 638 field_type_ = kRtcpGenericRtpFeedbackNackCode; |
| 639 field_.nack.sender_ssrc = sender_ssrc; | 639 field_.nack.sender_ssrc = sender_ssrc; |
| 640 field_.nack.media_ssrc = media_ssrc; | 640 field_.nack.media_ssrc = media_ssrc; |
| 641 state_ = kStateGenericRtpFeedbackNack; | 641 state_ = kStateGenericRtpFeedbackNack; |
| 642 return true; | 642 return true; |
| 643 case 2: | 643 case 2: |
| (...skipping 12 matching lines...) Expand all Loading... |
| 656 field_type_ = kRtcpGenericRtpFeedbackSrReqCode; | 656 field_type_ = kRtcpGenericRtpFeedbackSrReqCode; |
| 657 | 657 |
| 658 // Note: No state transition, sender report REQ is empty! | 658 // Note: No state transition, sender report REQ is empty! |
| 659 return true; | 659 return true; |
| 660 default: | 660 default: |
| 661 break; | 661 break; |
| 662 } | 662 } |
| 663 EndCurrentBlock(); | 663 EndCurrentBlock(); |
| 664 return false; | 664 return false; |
| 665 | 665 |
| 666 } else if (header.PT == transport::kPacketTypePayloadSpecific) { | 666 } else if (header.PT == kPacketTypePayloadSpecific) { |
| 667 // Payload specific feedback | 667 // Payload specific feedback |
| 668 switch (header.IC) { | 668 switch (header.IC) { |
| 669 case 1: | 669 case 1: |
| 670 // PLI | 670 // PLI |
| 671 field_type_ = kRtcpPayloadSpecificPliCode; | 671 field_type_ = kRtcpPayloadSpecificPliCode; |
| 672 field_.pli.sender_ssrc = sender_ssrc; | 672 field_.pli.sender_ssrc = sender_ssrc; |
| 673 field_.pli.media_ssrc = media_ssrc; | 673 field_.pli.media_ssrc = media_ssrc; |
| 674 | 674 |
| 675 // Note: No state transition, PLI FCI is empty! | 675 // Note: No state transition, PLI FCI is empty! |
| 676 return true; | 676 return true; |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1057 // If the sender adds new log messages we will end up here until we add | 1057 // If the sender adds new log messages we will end up here until we add |
| 1058 // the new messages in the receiver. | 1058 // the new messages in the receiver. |
| 1059 VLOG(1) << "Unexpected log message received: " << static_cast<int>(event); | 1059 VLOG(1) << "Unexpected log message received: " << static_cast<int>(event); |
| 1060 NOTREACHED(); | 1060 NOTREACHED(); |
| 1061 return UNKNOWN; | 1061 return UNKNOWN; |
| 1062 } | 1062 } |
| 1063 } | 1063 } |
| 1064 | 1064 |
| 1065 } // namespace cast | 1065 } // namespace cast |
| 1066 } // namespace media | 1066 } // namespace media |
| OLD | NEW |