| Index: media/cast/net/rtcp/rtcp_utility.cc
|
| diff --git a/media/cast/net/rtcp/rtcp_utility.cc b/media/cast/net/rtcp/rtcp_utility.cc
|
| index 91fccc1968b2394b84e2372b584cfc0fca31d72a..4f99cd4174b5c05a4bf5555cb43a1b50a921c2d3 100644
|
| --- a/media/cast/net/rtcp/rtcp_utility.cc
|
| +++ b/media/cast/net/rtcp/rtcp_utility.cc
|
| @@ -49,12 +49,6 @@ RtcpFieldTypes RtcpParser::Iterate() {
|
| case kStateReportBlock:
|
| IterateReportBlockItem();
|
| break;
|
| - case kStateSdes:
|
| - IterateSdesItem();
|
| - break;
|
| - case kStateBye:
|
| - IterateByeItem();
|
| - break;
|
| case kStateApplicationSpecificCastReceiverFrameLog:
|
| IterateCastReceiverLogFrame();
|
| break;
|
| @@ -67,21 +61,9 @@ RtcpFieldTypes RtcpParser::Iterate() {
|
| case kStateExtendedReportDelaySinceLastReceiverReport:
|
| IterateExtendedReportDelaySinceLastReceiverReportItem();
|
| break;
|
| - case kStateGenericRtpFeedbackNack:
|
| - IterateNackItem();
|
| - break;
|
| - case kStatePayloadSpecificRpsi:
|
| - IterateRpsiItem();
|
| - break;
|
| - case kStatePayloadSpecificFir:
|
| - IterateFirItem();
|
| - break;
|
| case kStatePayloadSpecificApplication:
|
| IteratePayloadSpecificAppItem();
|
| break;
|
| - case kStatePayloadSpecificRemb:
|
| - IteratePayloadSpecificRembItem();
|
| - break;
|
| case kStatePayloadSpecificCast:
|
| IteratePayloadSpecificCastItem();
|
| break;
|
| @@ -116,20 +98,6 @@ void RtcpParser::IterateTopLevel() {
|
| number_of_blocks_ = header.IC;
|
| ParseRR();
|
| return;
|
| - case kPacketTypeSdes:
|
| - // number of Sdes blocks
|
| - number_of_blocks_ = header.IC;
|
| - if (!ParseSdes()) {
|
| - break; // Nothing supported found, continue to next block!
|
| - }
|
| - return;
|
| - case kPacketTypeBye:
|
| - number_of_blocks_ = header.IC;
|
| - if (!ParseBye()) {
|
| - // Nothing supported found, continue to next block!
|
| - break;
|
| - }
|
| - return;
|
| case kPacketTypeApplicationDefined:
|
| if (!ParseApplicationDefined(header.IC)) {
|
| // Nothing supported found, continue to next block!
|
| @@ -162,18 +130,6 @@ void RtcpParser::IterateReportBlockItem() {
|
| Iterate();
|
| }
|
|
|
| -void RtcpParser::IterateSdesItem() {
|
| - bool success = ParseSdesItem();
|
| - if (!success)
|
| - Iterate();
|
| -}
|
| -
|
| -void RtcpParser::IterateByeItem() {
|
| - bool success = ParseByeItem();
|
| - if (!success)
|
| - Iterate();
|
| -}
|
| -
|
| void RtcpParser::IterateExtendedReportItem() {
|
| bool success = ParseExtendedReportItem();
|
| if (!success)
|
| @@ -186,36 +142,12 @@ void RtcpParser::IterateExtendedReportDelaySinceLastReceiverReportItem() {
|
| Iterate();
|
| }
|
|
|
| -void RtcpParser::IterateNackItem() {
|
| - bool success = ParseNackItem();
|
| - if (!success)
|
| - Iterate();
|
| -}
|
| -
|
| -void RtcpParser::IterateRpsiItem() {
|
| - bool success = ParseRpsiItem();
|
| - if (!success)
|
| - Iterate();
|
| -}
|
| -
|
| -void RtcpParser::IterateFirItem() {
|
| - bool success = ParseFirItem();
|
| - if (!success)
|
| - Iterate();
|
| -}
|
| -
|
| void RtcpParser::IteratePayloadSpecificAppItem() {
|
| bool success = ParsePayloadSpecificAppItem();
|
| if (!success)
|
| Iterate();
|
| }
|
|
|
| -void RtcpParser::IteratePayloadSpecificRembItem() {
|
| - bool success = ParsePayloadSpecificRembItem();
|
| - if (!success)
|
| - Iterate();
|
| -}
|
| -
|
| void RtcpParser::IteratePayloadSpecificCastItem() {
|
| bool success = ParsePayloadSpecificCastItem();
|
| if (!success)
|
| @@ -379,139 +311,6 @@ bool RtcpParser::ParseReportBlockItem() {
|
| return true;
|
| }
|
|
|
| -bool RtcpParser::ParseSdes() {
|
| - ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
|
| -
|
| - if (length < 8) {
|
| - state_ = kStateTopLevel;
|
| - EndCurrentBlock();
|
| - return false;
|
| - }
|
| - rtcp_data_ += 4; // Skip header
|
| -
|
| - state_ = kStateSdes;
|
| - field_type_ = kRtcpSdesCode;
|
| - return true;
|
| -}
|
| -
|
| -bool RtcpParser::ParseSdesItem() {
|
| - if (number_of_blocks_ <= 0) {
|
| - state_ = kStateTopLevel;
|
| - EndCurrentBlock();
|
| - return false;
|
| - }
|
| - number_of_blocks_--;
|
| -
|
| - // Find c_name item in a Sdes chunk.
|
| - while (rtcp_data_ < rtcp_block_end_) {
|
| - ptrdiff_t data_length = rtcp_block_end_ - rtcp_data_;
|
| - if (data_length < 4) {
|
| - state_ = kStateTopLevel;
|
| - EndCurrentBlock();
|
| - return false;
|
| - }
|
| -
|
| - uint32 ssrc;
|
| - base::BigEndianReader big_endian_reader(
|
| - reinterpret_cast<const char*>(rtcp_data_), data_length);
|
| - big_endian_reader.ReadU32(&ssrc);
|
| - rtcp_data_ += 4;
|
| -
|
| - bool found_c_name = ParseSdesTypes();
|
| - if (found_c_name) {
|
| - field_.c_name.sender_ssrc = ssrc;
|
| - return true;
|
| - }
|
| - }
|
| - state_ = kStateTopLevel;
|
| - EndCurrentBlock();
|
| - return false;
|
| -}
|
| -
|
| -bool RtcpParser::ParseSdesTypes() {
|
| - // Only the c_name item is mandatory. RFC 3550 page 46.
|
| - bool found_c_name = false;
|
| - ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
|
| - base::BigEndianReader big_endian_reader(
|
| - reinterpret_cast<const char*>(rtcp_data_), length);
|
| -
|
| - while (big_endian_reader.remaining() > 0) {
|
| - uint8 tag;
|
| - big_endian_reader.ReadU8(&tag);
|
| -
|
| - if (tag == 0) {
|
| - // End tag! 4 octet aligned.
|
| - rtcp_data_ = rtcp_block_end_;
|
| - return found_c_name;
|
| - }
|
| -
|
| - if (big_endian_reader.remaining() > 0) {
|
| - uint8 len;
|
| - big_endian_reader.ReadU8(&len);
|
| -
|
| - if (tag == 1) { // c_name.
|
| - // Sanity check.
|
| - if (big_endian_reader.remaining() < len) {
|
| - state_ = kStateTopLevel;
|
| - EndCurrentBlock();
|
| - return false;
|
| - }
|
| - int i = 0;
|
| - for (; i < len; ++i) {
|
| - uint8 c;
|
| - big_endian_reader.ReadU8(&c);
|
| - if ((c < ' ') || (c > '{') || (c == '%') || (c == '\\')) {
|
| - // Illegal char.
|
| - state_ = kStateTopLevel;
|
| - EndCurrentBlock();
|
| - return false;
|
| - }
|
| - field_.c_name.name[i] = c;
|
| - }
|
| - // Make sure we are null terminated.
|
| - field_.c_name.name[i] = 0;
|
| - field_type_ = kRtcpSdesChunkCode;
|
| - found_c_name = true;
|
| - } else {
|
| - big_endian_reader.Skip(len);
|
| - }
|
| - }
|
| - }
|
| - // No end tag found!
|
| - state_ = kStateTopLevel;
|
| - EndCurrentBlock();
|
| - return false;
|
| -}
|
| -
|
| -bool RtcpParser::ParseBye() {
|
| - rtcp_data_ += 4; // Skip header.
|
| - state_ = kStateBye;
|
| - return ParseByeItem();
|
| -}
|
| -
|
| -bool RtcpParser::ParseByeItem() {
|
| - ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
|
| - if (length < 4 || number_of_blocks_ == 0) {
|
| - state_ = kStateTopLevel;
|
| - EndCurrentBlock();
|
| - return false;
|
| - }
|
| -
|
| - field_type_ = kRtcpByeCode;
|
| -
|
| - base::BigEndianReader big_endian_reader(
|
| - reinterpret_cast<const char*>(rtcp_data_), length);
|
| - big_endian_reader.ReadU32(&field_.bye.sender_ssrc);
|
| - rtcp_data_ += 4;
|
| -
|
| - // We can have several CSRCs attached.
|
| - if (length >= 4 * number_of_blocks_) {
|
| - rtcp_data_ += (number_of_blocks_ - 1) * 4;
|
| - }
|
| - number_of_blocks_ = 0;
|
| - return true;
|
| -}
|
| -
|
| bool RtcpParser::ParseApplicationDefined(uint8 subtype) {
|
| ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
|
| if (length < 16 || subtype != kReceiverLogSubtype) {
|
| @@ -630,61 +429,20 @@ bool RtcpParser::ParseFeedBackCommon(const RtcpCommonHeader& header) {
|
|
|
| rtcp_data_ += 12;
|
|
|
| - if (header.PT == kPacketTypeGenericRtpFeedback) {
|
| - // Transport layer feedback
|
| - switch (header.IC) {
|
| - case 1:
|
| - // Nack
|
| - field_type_ = kRtcpGenericRtpFeedbackNackCode;
|
| - field_.nack.sender_ssrc = sender_ssrc;
|
| - field_.nack.media_ssrc = media_ssrc;
|
| - state_ = kStateGenericRtpFeedbackNack;
|
| - return true;
|
| - case 2:
|
| - // Used to be ACK is this code point, which is removed conficts with
|
| - // http://tools.ietf.org/html/draft-levin-avt-rtcp-burst-00
|
| - break;
|
| - case 3:
|
| - // Tmmbr
|
| - break;
|
| - case 4:
|
| - // Tmmbn
|
| - break;
|
| - case 5:
|
| - // RFC 6051 RTCP-sender_report-REQ Rapid Synchronisation of RTP Flows
|
| - // Trigger a new Rtcp sender_report
|
| - field_type_ = kRtcpGenericRtpFeedbackSrReqCode;
|
| -
|
| - // Note: No state transition, sender report REQ is empty!
|
| - return true;
|
| - default:
|
| - break;
|
| - }
|
| - EndCurrentBlock();
|
| - return false;
|
| -
|
| - } else if (header.PT == kPacketTypePayloadSpecific) {
|
| + if (header.PT == kPacketTypePayloadSpecific) {
|
| // Payload specific feedback
|
| switch (header.IC) {
|
| case 1:
|
| // PLI
|
| - field_type_ = kRtcpPayloadSpecificPliCode;
|
| - field_.pli.sender_ssrc = sender_ssrc;
|
| - field_.pli.media_ssrc = media_ssrc;
|
| -
|
| - // Note: No state transition, PLI FCI is empty!
|
| - return true;
|
| + break;
|
| case 2:
|
| - // Sli
|
| + // SLI.
|
| break;
|
| case 3:
|
| - field_type_ = kRtcpPayloadSpecificRpsiCode;
|
| - field_.rpsi.sender_ssrc = sender_ssrc;
|
| - field_.rpsi.media_ssrc = media_ssrc;
|
| - state_ = kStatePayloadSpecificRpsi;
|
| - return true;
|
| + // RPSI.
|
| + break;
|
| case 4:
|
| - // fir
|
| + // FIR.
|
| break;
|
| case 15:
|
| field_type_ = kRtcpPayloadSpecificAppCode;
|
| @@ -705,65 +463,6 @@ bool RtcpParser::ParseFeedBackCommon(const RtcpCommonHeader& header) {
|
| }
|
| }
|
|
|
| -bool RtcpParser::ParseRpsiItem() {
|
| - // RFC 4585 6.3.3. Reference Picture Selection Indication (rpsi)
|
| - /*
|
| - 0 1 2 3
|
| - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
| - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| - | PB |0| Payload Type| Native rpsi bit string |
|
| - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| - | defined per codec ... | Padding (0) |
|
| - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| - */
|
| - ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
|
| -
|
| - if (length < 4) {
|
| - state_ = kStateTopLevel;
|
| - EndCurrentBlock();
|
| - return false;
|
| - }
|
| - if (length > 2 + kRtcpRpsiDataSize) {
|
| - state_ = kStateTopLevel;
|
| - EndCurrentBlock();
|
| - return false;
|
| - }
|
| -
|
| - field_type_ = kRtcpPayloadSpecificRpsiCode;
|
| -
|
| - uint8 padding_bits;
|
| - base::BigEndianReader big_endian_reader(
|
| - reinterpret_cast<const char*>(rtcp_data_), length);
|
| - big_endian_reader.ReadU8(&padding_bits);
|
| - big_endian_reader.ReadU8(&field_.rpsi.payload_type);
|
| - big_endian_reader.ReadBytes(&field_.rpsi.native_bit_string, length - 2);
|
| - field_.rpsi.number_of_valid_bits =
|
| - static_cast<uint16>(length - 2) * 8 - padding_bits;
|
| -
|
| - rtcp_data_ += length;
|
| - return true;
|
| -}
|
| -
|
| -bool RtcpParser::ParseNackItem() {
|
| - // RFC 4585 6.2.1. Generic Nack
|
| -
|
| - ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
|
| - if (length < 4) {
|
| - state_ = kStateTopLevel;
|
| - EndCurrentBlock();
|
| - return false;
|
| - }
|
| -
|
| - field_type_ = kRtcpGenericRtpFeedbackNackItemCode;
|
| -
|
| - base::BigEndianReader big_endian_reader(
|
| - reinterpret_cast<const char*>(rtcp_data_), length);
|
| - big_endian_reader.ReadU16(&field_.nack_item.packet_id);
|
| - big_endian_reader.ReadU16(&field_.nack_item.bitmask);
|
| - rtcp_data_ += 4;
|
| - return true;
|
| -}
|
| -
|
| bool RtcpParser::ParsePayloadSpecificAppItem() {
|
| ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
|
|
|
| @@ -778,11 +477,7 @@ bool RtcpParser::ParsePayloadSpecificAppItem() {
|
| big_endian_reader.ReadU32(&name);
|
| rtcp_data_ += 4;
|
|
|
| - if (name == kRemb) {
|
| - field_type_ = kRtcpPayloadSpecificRembCode;
|
| - state_ = kStatePayloadSpecificRemb;
|
| - return true;
|
| - } else if (name == kCast) {
|
| + if (name == kCast) {
|
| field_type_ = kRtcpPayloadSpecificCastCode;
|
| state_ = kStatePayloadSpecificCast;
|
| return true;
|
| @@ -792,46 +487,6 @@ bool RtcpParser::ParsePayloadSpecificAppItem() {
|
| return false;
|
| }
|
|
|
| -bool RtcpParser::ParsePayloadSpecificRembItem() {
|
| - ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
|
| -
|
| - if (length < 4) {
|
| - state_ = kStateTopLevel;
|
| - EndCurrentBlock();
|
| - return false;
|
| - }
|
| -
|
| - base::BigEndianReader big_endian_reader(
|
| - reinterpret_cast<const char*>(rtcp_data_), length);
|
| - big_endian_reader.ReadU8(&field_.remb_item.number_of_ssrcs);
|
| -
|
| - uint8 byte_1;
|
| - uint8 byte_2;
|
| - uint8 byte_3;
|
| - big_endian_reader.ReadU8(&byte_1);
|
| - big_endian_reader.ReadU8(&byte_2);
|
| - big_endian_reader.ReadU8(&byte_3);
|
| - rtcp_data_ += 4;
|
| -
|
| - uint8 br_exp = (byte_1 >> 2) & 0x3F;
|
| - uint32 br_mantissa = ((byte_1 & 0x03) << 16) + (byte_2 << 8) + byte_3;
|
| - field_.remb_item.bitrate = (br_mantissa << br_exp);
|
| -
|
| - ptrdiff_t length_ssrcs = rtcp_block_end_ - rtcp_data_;
|
| - if (length_ssrcs < 4 * field_.remb_item.number_of_ssrcs) {
|
| - state_ = kStateTopLevel;
|
| - EndCurrentBlock();
|
| - return false;
|
| - }
|
| -
|
| - field_type_ = kRtcpPayloadSpecificRembItemCode;
|
| -
|
| - for (int i = 0; i < field_.remb_item.number_of_ssrcs; i++) {
|
| - big_endian_reader.ReadU32(&field_.remb_item.ssrcs[i]);
|
| - }
|
| - return true;
|
| -}
|
| -
|
| bool RtcpParser::ParsePayloadSpecificCastItem() {
|
| ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
|
| if (length < 4) {
|
| @@ -879,26 +534,6 @@ bool RtcpParser::ParsePayloadSpecificCastNackItem() {
|
| return true;
|
| }
|
|
|
| -bool RtcpParser::ParseFirItem() {
|
| - // RFC 5104 4.3.1. Full Intra Request (fir)
|
| - ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
|
| -
|
| - if (length < 8) {
|
| - state_ = kStateTopLevel;
|
| - EndCurrentBlock();
|
| - return false;
|
| - }
|
| - field_type_ = kRtcpPayloadSpecificFirItemCode;
|
| -
|
| - base::BigEndianReader big_endian_reader(
|
| - reinterpret_cast<const char*>(rtcp_data_), length);
|
| - big_endian_reader.ReadU32(&field_.fir_item.ssrc);
|
| - big_endian_reader.ReadU8(&field_.fir_item.command_sequence_number);
|
| -
|
| - rtcp_data_ += 8;
|
| - return true;
|
| -}
|
| -
|
| bool RtcpParser::ParseExtendedReport() {
|
| ptrdiff_t length = rtcp_block_end_ - rtcp_data_;
|
| if (length < 8)
|
| @@ -936,7 +571,7 @@ bool RtcpParser::ParseExtendedReportItem() {
|
| rtcp_data_ += 4;
|
|
|
| switch (block_type) {
|
| - case 4:
|
| + case 4: // RRTR. RFC3611 Section 4.4.
|
| if (block_length != 2) {
|
| // Invalid block length.
|
| state_ = kStateTopLevel;
|
| @@ -944,7 +579,7 @@ bool RtcpParser::ParseExtendedReportItem() {
|
| return false;
|
| }
|
| return ParseExtendedReportReceiverReferenceTimeReport();
|
| - case 5:
|
| + case 5: // DLRR. RFC3611 Section 4.5.
|
| if (block_length % 3 != 0) {
|
| // Invalid block length.
|
| state_ = kStateTopLevel;
|
|
|