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