| 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 |