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