Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1531)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_sender.cc

Issue 2190913002: Fix bug where transport sequence numbers are allocated for packets without the header extension reg… (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Comments addressed. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 uint32_t timestamp, 584 uint32_t timestamp,
585 int64_t capture_time_ms, 585 int64_t capture_time_ms,
586 int probe_cluster_id) { 586 int probe_cluster_id) {
587 // Always send full padding packets. This is accounted for by the 587 // Always send full padding packets. This is accounted for by the
588 // RtpPacketSender, 588 // RtpPacketSender,
589 // which will make sure we don't send too much padding even if a single packet 589 // which will make sure we don't send too much padding even if a single packet
590 // is larger than requested. 590 // is larger than requested.
591 size_t padding_bytes_in_packet = 591 size_t padding_bytes_in_packet =
592 std::min(MaxDataPayloadLength(), kMaxPaddingLength); 592 std::min(MaxDataPayloadLength(), kMaxPaddingLength);
593 size_t bytes_sent = 0; 593 size_t bytes_sent = 0;
594 bool using_transport_seq = rtp_header_extension_map_.IsRegistered( 594 bool using_transport_seq =
595 kRtpExtensionTransportSequenceNumber) && 595 IsRtpHeaderExtensionRegistered(kRtpExtensionTransportSequenceNumber) &&
596 transport_sequence_number_allocator_; 596 transport_sequence_number_allocator_;
597 for (; bytes > 0; bytes -= padding_bytes_in_packet) { 597 for (; bytes > 0; bytes -= padding_bytes_in_packet) {
598 if (bytes < padding_bytes_in_packet) 598 if (bytes < padding_bytes_in_packet)
599 bytes = padding_bytes_in_packet; 599 bytes = padding_bytes_in_packet;
600 600
601 uint32_t ssrc; 601 uint32_t ssrc;
602 uint16_t sequence_number; 602 uint16_t sequence_number;
603 int payload_type; 603 int payload_type;
604 bool over_rtx; 604 bool over_rtx;
605 { 605 {
606 rtc::CritScope lock(&send_critsect_); 606 rtc::CritScope lock(&send_critsect_);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 } 640 }
641 ssrc = ssrc_rtx_; 641 ssrc = ssrc_rtx_;
642 sequence_number = sequence_number_rtx_; 642 sequence_number = sequence_number_rtx_;
643 ++sequence_number_rtx_; 643 ++sequence_number_rtx_;
644 payload_type = rtx_payload_type_map_.begin()->second; 644 payload_type = rtx_payload_type_map_.begin()->second;
645 over_rtx = true; 645 over_rtx = true;
646 } 646 }
647 } 647 }
648 648
649 uint8_t padding_packet[IP_PACKET_SIZE]; 649 uint8_t padding_packet[IP_PACKET_SIZE];
650 size_t header_length = 650 size_t header_length = 0;
651 CreateRtpHeader(padding_packet, payload_type, ssrc, false, timestamp, 651 {
652 sequence_number, std::vector<uint32_t>()); 652 rtc::CritScope lock(&send_critsect_);
653 header_length =
654 CreateRtpHeader(padding_packet, payload_type, ssrc, false, timestamp,
655 sequence_number, std::vector<uint32_t>());
656 }
653 BuildPaddingPacket(padding_packet, header_length, padding_bytes_in_packet); 657 BuildPaddingPacket(padding_packet, header_length, padding_bytes_in_packet);
654 size_t length = padding_bytes_in_packet + header_length; 658 size_t length = padding_bytes_in_packet + header_length;
655 int64_t now_ms = clock_->TimeInMilliseconds(); 659 int64_t now_ms = clock_->TimeInMilliseconds();
656 660
657 RtpUtility::RtpHeaderParser rtp_parser(padding_packet, length); 661 RtpUtility::RtpHeaderParser rtp_parser(padding_packet, length);
658 RTPHeader rtp_header; 662 RTPHeader rtp_header;
659 rtp_parser.Parse(&rtp_header); 663 rtp_parser.Parse(&rtp_header);
660 664
661 if (capture_time_ms > 0) { 665 if (capture_time_ms > 0) {
662 UpdateTransmissionTimeOffset( 666 UpdateTransmissionTimeOffset(
663 padding_packet, length, rtp_header, now_ms - capture_time_ms); 667 padding_packet, length, rtp_header, now_ms - capture_time_ms);
664 } 668 }
665 669
666 UpdateAbsoluteSendTime(padding_packet, length, rtp_header, now_ms); 670 UpdateAbsoluteSendTime(padding_packet, length, rtp_header, now_ms);
667 671
668 PacketOptions options; 672 PacketOptions options;
669 if (AllocateTransportSequenceNumber(&options.packet_id)) { 673 if (UpdateTransportSequenceNumber(padding_packet, length, rtp_header,
670 if (UpdateTransportSequenceNumber(options.packet_id, padding_packet, 674 &options.packet_id)) {
671 length, rtp_header)) { 675 if (transport_feedback_observer_)
672 if (transport_feedback_observer_) 676 transport_feedback_observer_->AddPacket(options.packet_id, length,
673 transport_feedback_observer_->AddPacket(options.packet_id, length, 677 probe_cluster_id);
674 probe_cluster_id);
675 }
676 } 678 }
677 679
678 if (!SendPacketToNetwork(padding_packet, length, options)) 680 if (!SendPacketToNetwork(padding_packet, length, options))
679 break; 681 break;
680 682
681 bytes_sent += padding_bytes_in_packet; 683 bytes_sent += padding_bytes_in_packet;
682 UpdateRtpStats(padding_packet, length, rtp_header, over_rtx, false); 684 UpdateRtpStats(padding_packet, length, rtp_header, over_rtx, false);
683 } 685 }
684 686
685 return bytes_sent; 687 return bytes_sent;
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 buffer_to_send_ptr = data_buffer_rtx; 854 buffer_to_send_ptr = data_buffer_rtx;
853 } 855 }
854 856
855 int64_t now_ms = clock_->TimeInMilliseconds(); 857 int64_t now_ms = clock_->TimeInMilliseconds();
856 int64_t diff_ms = now_ms - capture_time_ms; 858 int64_t diff_ms = now_ms - capture_time_ms;
857 UpdateTransmissionTimeOffset(buffer_to_send_ptr, length, rtp_header, 859 UpdateTransmissionTimeOffset(buffer_to_send_ptr, length, rtp_header,
858 diff_ms); 860 diff_ms);
859 UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms); 861 UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms);
860 862
861 PacketOptions options; 863 PacketOptions options;
862 if (AllocateTransportSequenceNumber(&options.packet_id)) { 864 if (UpdateTransportSequenceNumber(buffer_to_send_ptr, length, rtp_header,
863 if (UpdateTransportSequenceNumber(options.packet_id, buffer_to_send_ptr, 865 &options.packet_id)) {
864 length, rtp_header)) { 866 if (transport_feedback_observer_)
865 if (transport_feedback_observer_) 867 transport_feedback_observer_->AddPacket(options.packet_id, length,
866 transport_feedback_observer_->AddPacket(options.packet_id, length, 868 probe_cluster_id);
867 probe_cluster_id);
868 }
869 } 869 }
870 870
871 if (!is_retransmit && !send_over_rtx) { 871 if (!is_retransmit && !send_over_rtx) {
872 UpdateDelayStatistics(capture_time_ms, now_ms); 872 UpdateDelayStatistics(capture_time_ms, now_ms);
873 UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc); 873 UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc);
874 } 874 }
875 875
876 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options); 876 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options);
877 if (ret) { 877 if (ret) {
878 rtc::CritScope lock(&send_critsect_); 878 rtc::CritScope lock(&send_critsect_);
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 corrected_time_ms > last_capture_time_ms_sent_) { 985 corrected_time_ms > last_capture_time_ms_sent_) {
986 last_capture_time_ms_sent_ = corrected_time_ms; 986 last_capture_time_ms_sent_ = corrected_time_ms;
987 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), 987 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
988 "PacedSend", corrected_time_ms, 988 "PacedSend", corrected_time_ms,
989 "capture_time_ms", corrected_time_ms); 989 "capture_time_ms", corrected_time_ms);
990 } 990 }
991 return 0; 991 return 0;
992 } 992 }
993 993
994 PacketOptions options; 994 PacketOptions options;
995 if (AllocateTransportSequenceNumber(&options.packet_id)) { 995 if (UpdateTransportSequenceNumber(buffer, length, rtp_header,
996 if (UpdateTransportSequenceNumber(options.packet_id, buffer, length, 996 &options.packet_id)) {
997 rtp_header)) { 997 if (transport_feedback_observer_)
998 if (transport_feedback_observer_) 998 transport_feedback_observer_->AddPacket(options.packet_id, length,
999 transport_feedback_observer_->AddPacket(options.packet_id, length, 999 PacketInfo::kNotAProbe);
1000 PacketInfo::kNotAProbe);
1001 }
1002 } 1000 }
1003 UpdateDelayStatistics(capture_time_ms, now_ms); 1001 UpdateDelayStatistics(capture_time_ms, now_ms);
1004 UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc); 1002 UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc);
1005 1003
1006 bool sent = SendPacketToNetwork(buffer, length, options); 1004 bool sent = SendPacketToNetwork(buffer, length, options);
1007 1005
1008 // Mark the packet as sent in the history even if send failed. Dropping a 1006 // Mark the packet as sent in the history even if send failed. Dropping a
1009 // packet here should be treated as any other packet drop so we should be 1007 // packet here should be treated as any other packet drop so we should be
1010 // ready for a retransmission. 1008 // ready for a retransmission.
1011 packet_history_.SetSent(rtp_header.sequenceNumber); 1009 packet_history_.SetSent(rtp_header.sequenceNumber);
(...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after
1580 default: 1578 default:
1581 RTC_NOTREACHED(); 1579 RTC_NOTREACHED();
1582 } 1580 }
1583 1581
1584 // Update absolute send time field (convert ms to 24-bit unsigned with 18 bit 1582 // Update absolute send time field (convert ms to 24-bit unsigned with 18 bit
1585 // fractional part). 1583 // fractional part).
1586 ByteWriter<uint32_t, 3>::WriteBigEndian(rtp_packet + offset + 1, 1584 ByteWriter<uint32_t, 3>::WriteBigEndian(rtp_packet + offset + 1,
1587 ConvertMsTo24Bits(now_ms)); 1585 ConvertMsTo24Bits(now_ms));
1588 } 1586 }
1589 1587
1590 bool RTPSender::UpdateTransportSequenceNumber( 1588 bool RTPSender::UpdateTransportSequenceNumber(uint8_t* rtp_packet,
1591 uint16_t sequence_number, 1589 size_t rtp_packet_length,
1592 uint8_t* rtp_packet, 1590 const RTPHeader& rtp_header,
1593 size_t rtp_packet_length, 1591 int* sequence_number) const {
1594 const RTPHeader& rtp_header) const { 1592 RTC_DCHECK(sequence_number);
1595 size_t offset; 1593 size_t offset;
1596 rtc::CritScope lock(&send_critsect_); 1594 rtc::CritScope lock(&send_critsect_);
1597 1595
1598 switch (VerifyExtension(kRtpExtensionTransportSequenceNumber, rtp_packet, 1596 switch (VerifyExtension(kRtpExtensionTransportSequenceNumber, rtp_packet,
1599 rtp_packet_length, rtp_header, 1597 rtp_packet_length, rtp_header,
1600 kTransportSequenceNumberLength, &offset)) { 1598 kTransportSequenceNumberLength, &offset)) {
1601 case ExtensionStatus::kNotRegistered: 1599 case ExtensionStatus::kNotRegistered:
1602 return false; 1600 return false;
1603 case ExtensionStatus::kError: 1601 case ExtensionStatus::kError:
1604 LOG(LS_WARNING) << "Failed to update transport sequence number"; 1602 LOG(LS_WARNING) << "Failed to update transport sequence number";
1605 return false; 1603 return false;
1606 case ExtensionStatus::kOk: 1604 case ExtensionStatus::kOk:
1607 break; 1605 break;
1608 default: 1606 default:
1609 RTC_NOTREACHED(); 1607 RTC_NOTREACHED();
1610 } 1608 }
1611 1609
1612 BuildTransportSequenceNumberExtension(rtp_packet + offset, sequence_number); 1610 if (!AllocateTransportSequenceNumber(sequence_number))
1611 return false;
1612
1613 BuildTransportSequenceNumberExtension(rtp_packet + offset, *sequence_number);
1613 return true; 1614 return true;
1614 } 1615 }
1615 1616
1616 bool RTPSender::AllocateTransportSequenceNumber(int* packet_id) const { 1617 bool RTPSender::AllocateTransportSequenceNumber(int* packet_id) const {
1617 if (!transport_sequence_number_allocator_) 1618 if (!transport_sequence_number_allocator_)
1618 return false; 1619 return false;
1619 1620
1620 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber(); 1621 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber();
1621 return true; 1622 return true;
1622 } 1623 }
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
1884 rtc::CritScope lock(&send_critsect_); 1885 rtc::CritScope lock(&send_critsect_);
1885 1886
1886 RtpState state; 1887 RtpState state;
1887 state.sequence_number = sequence_number_rtx_; 1888 state.sequence_number = sequence_number_rtx_;
1888 state.start_timestamp = start_timestamp_; 1889 state.start_timestamp = start_timestamp_;
1889 1890
1890 return state; 1891 return state;
1891 } 1892 }
1892 1893
1893 } // namespace webrtc 1894 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender.h ('k') | webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698