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 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 BitrateStatisticsObserver* const callback_; | 94 BitrateStatisticsObserver* const callback_; |
95 BitrateObserver total_bitrate_observer_; | 95 BitrateObserver total_bitrate_observer_; |
96 BitrateObserver retransmit_bitrate_observer_; | 96 BitrateObserver retransmit_bitrate_observer_; |
97 uint32_t ssrc_; | 97 uint32_t ssrc_; |
98 }; | 98 }; |
99 | 99 |
100 RTPSender::RTPSender(bool audio, | 100 RTPSender::RTPSender(bool audio, |
101 Clock* clock, | 101 Clock* clock, |
102 Transport* transport, | 102 Transport* transport, |
103 RtpAudioFeedback* audio_feedback, | 103 RtpAudioFeedback* audio_feedback, |
104 PacedSender* paced_sender, | 104 RtpPacketSender* paced_sender, |
105 PacketRouter* packet_router, | 105 SequenceNumberAllocator* sequence_number_allocator, |
106 TransportFeedbackObserver* transport_feedback_observer, | 106 TransportFeedbackObserver* transport_feedback_observer, |
107 BitrateStatisticsObserver* bitrate_callback, | 107 BitrateStatisticsObserver* bitrate_callback, |
108 FrameCountObserver* frame_count_observer, | 108 FrameCountObserver* frame_count_observer, |
109 SendSideDelayObserver* send_side_delay_observer) | 109 SendSideDelayObserver* send_side_delay_observer) |
110 : clock_(clock), | 110 : clock_(clock), |
111 // TODO(holmer): Remove this conversion when we remove the use of | 111 // TODO(holmer): Remove this conversion when we remove the use of |
112 // TickTime. | 112 // TickTime. |
113 clock_delta_ms_(clock_->TimeInMilliseconds() - | 113 clock_delta_ms_(clock_->TimeInMilliseconds() - |
114 TickTime::MillisecondTimestamp()), | 114 TickTime::MillisecondTimestamp()), |
115 bitrates_(new BitrateAggregator(bitrate_callback)), | 115 bitrates_(new BitrateAggregator(bitrate_callback)), |
116 total_bitrate_sent_(clock, bitrates_->total_bitrate_observer()), | 116 total_bitrate_sent_(clock, bitrates_->total_bitrate_observer()), |
117 audio_configured_(audio), | 117 audio_configured_(audio), |
118 audio_(audio ? new RTPSenderAudio(clock, this, audio_feedback) : nullptr), | 118 audio_(audio ? new RTPSenderAudio(clock, this, audio_feedback) : nullptr), |
119 video_(audio ? nullptr : new RTPSenderVideo(clock, this)), | 119 video_(audio ? nullptr : new RTPSenderVideo(clock, this)), |
120 paced_sender_(paced_sender), | 120 paced_sender_(paced_sender), |
121 packet_router_(packet_router), | 121 sequence_number_allocator_(sequence_number_allocator), |
122 transport_feedback_observer_(transport_feedback_observer), | 122 transport_feedback_observer_(transport_feedback_observer), |
123 last_capture_time_ms_sent_(0), | 123 last_capture_time_ms_sent_(0), |
124 send_critsect_(CriticalSectionWrapper::CreateCriticalSection()), | 124 send_critsect_(CriticalSectionWrapper::CreateCriticalSection()), |
125 transport_(transport), | 125 transport_(transport), |
126 sending_media_(true), // Default to sending media. | 126 sending_media_(true), // Default to sending media. |
127 max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP. | 127 max_payload_length_(IP_PACKET_SIZE - 28), // Default is IP-v4/UDP. |
128 packet_over_head_(28), | 128 packet_over_head_(28), |
129 payload_type_(-1), | 129 payload_type_(-1), |
130 payload_type_map_(), | 130 payload_type_map_(), |
131 rtp_header_extension_map_(), | 131 rtp_header_extension_map_(), |
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 } | 579 } |
580 // Set number of padding bytes in the last byte of the packet. | 580 // Set number of padding bytes in the last byte of the packet. |
581 packet[header_length + padding_length - 1] = | 581 packet[header_length + padding_length - 1] = |
582 static_cast<uint8_t>(padding_length); | 582 static_cast<uint8_t>(padding_length); |
583 } | 583 } |
584 | 584 |
585 size_t RTPSender::SendPadData(size_t bytes, | 585 size_t RTPSender::SendPadData(size_t bytes, |
586 bool timestamp_provided, | 586 bool timestamp_provided, |
587 uint32_t timestamp, | 587 uint32_t timestamp, |
588 int64_t capture_time_ms) { | 588 int64_t capture_time_ms) { |
589 // Always send full padding packets. This is accounted for by the PacedSender, | 589 // Always send full padding packets. This is accounted for by the |
| 590 // RtpPacketSender, |
590 // which will make sure we don't send too much padding even if a single packet | 591 // which will make sure we don't send too much padding even if a single packet |
591 // is larger than requested. | 592 // is larger than requested. |
592 size_t padding_bytes_in_packet = | 593 size_t padding_bytes_in_packet = |
593 std::min(MaxDataPayloadLength(), kMaxPaddingLength); | 594 std::min(MaxDataPayloadLength(), kMaxPaddingLength); |
594 size_t bytes_sent = 0; | 595 size_t bytes_sent = 0; |
595 bool using_transport_seq = rtp_header_extension_map_.IsRegistered( | 596 bool using_transport_seq = rtp_header_extension_map_.IsRegistered( |
596 kRtpExtensionTransportSequenceNumber) && | 597 kRtpExtensionTransportSequenceNumber) && |
597 packet_router_; | 598 sequence_number_allocator_; |
598 for (; bytes > 0; bytes -= padding_bytes_in_packet) { | 599 for (; bytes > 0; bytes -= padding_bytes_in_packet) { |
599 if (bytes < padding_bytes_in_packet) | 600 if (bytes < padding_bytes_in_packet) |
600 bytes = padding_bytes_in_packet; | 601 bytes = padding_bytes_in_packet; |
601 | 602 |
602 uint32_t ssrc; | 603 uint32_t ssrc; |
603 uint16_t sequence_number; | 604 uint16_t sequence_number; |
604 int payload_type; | 605 int payload_type; |
605 bool over_rtx; | 606 bool over_rtx; |
606 { | 607 { |
607 CriticalSectionScoped cs(send_critsect_.get()); | 608 CriticalSectionScoped cs(send_critsect_.get()); |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
704 RtpUtility::RtpHeaderParser rtp_parser(data_buffer, length); | 705 RtpUtility::RtpHeaderParser rtp_parser(data_buffer, length); |
705 RTPHeader header; | 706 RTPHeader header; |
706 if (!rtp_parser.Parse(header)) { | 707 if (!rtp_parser.Parse(header)) { |
707 assert(false); | 708 assert(false); |
708 return -1; | 709 return -1; |
709 } | 710 } |
710 // Convert from TickTime to Clock since capture_time_ms is based on | 711 // Convert from TickTime to Clock since capture_time_ms is based on |
711 // TickTime. | 712 // TickTime. |
712 int64_t corrected_capture_tims_ms = capture_time_ms + clock_delta_ms_; | 713 int64_t corrected_capture_tims_ms = capture_time_ms + clock_delta_ms_; |
713 if (!paced_sender_->SendPacket( | 714 if (!paced_sender_->SendPacket( |
714 PacedSender::kHighPriority, header.ssrc, header.sequenceNumber, | 715 RtpPacketSender::kHighPriority, header.ssrc, header.sequenceNumber, |
715 corrected_capture_tims_ms, length - header.headerLength, true)) { | 716 corrected_capture_tims_ms, length - header.headerLength, true)) { |
716 // We can't send the packet right now. | 717 // We can't send the packet right now. |
717 // We will be called when it is time. | 718 // We will be called when it is time. |
718 return length; | 719 return length; |
719 } | 720 } |
720 } | 721 } |
721 int rtx = kRtxOff; | 722 int rtx = kRtxOff; |
722 { | 723 { |
723 CriticalSectionScoped lock(send_critsect_.get()); | 724 CriticalSectionScoped lock(send_critsect_.get()); |
724 rtx = rtx_; | 725 rtx = rtx_; |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
910 int64_t now_ms = clock_->TimeInMilliseconds(); | 911 int64_t now_ms = clock_->TimeInMilliseconds(); |
911 int64_t diff_ms = now_ms - capture_time_ms; | 912 int64_t diff_ms = now_ms - capture_time_ms; |
912 UpdateTransmissionTimeOffset(buffer_to_send_ptr, length, rtp_header, | 913 UpdateTransmissionTimeOffset(buffer_to_send_ptr, length, rtp_header, |
913 diff_ms); | 914 diff_ms); |
914 UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms); | 915 UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms); |
915 | 916 |
916 uint16_t transport_seq = 0; | 917 uint16_t transport_seq = 0; |
917 // TODO(sprang): Potentially too much overhead in IsRegistered()? | 918 // TODO(sprang): Potentially too much overhead in IsRegistered()? |
918 bool using_transport_seq = rtp_header_extension_map_.IsRegistered( | 919 bool using_transport_seq = rtp_header_extension_map_.IsRegistered( |
919 kRtpExtensionTransportSequenceNumber) && | 920 kRtpExtensionTransportSequenceNumber) && |
920 packet_router_ && !is_retransmit; | 921 sequence_number_allocator_ && !is_retransmit; |
921 if (using_transport_seq) { | 922 if (using_transport_seq) { |
922 transport_seq = | 923 transport_seq = |
923 UpdateTransportSequenceNumber(buffer_to_send_ptr, length, rtp_header); | 924 UpdateTransportSequenceNumber(buffer_to_send_ptr, length, rtp_header); |
924 } | 925 } |
925 | 926 |
926 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length); | 927 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length); |
927 if (ret) { | 928 if (ret) { |
928 CriticalSectionScoped lock(send_critsect_.get()); | 929 CriticalSectionScoped lock(send_critsect_.get()); |
929 media_has_been_sent_ = true; | 930 media_has_been_sent_ = true; |
930 } | 931 } |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
993 if (!sending_media_) | 994 if (!sending_media_) |
994 return 0; | 995 return 0; |
995 } | 996 } |
996 size_t bytes_sent = TrySendRedundantPayloads(bytes); | 997 size_t bytes_sent = TrySendRedundantPayloads(bytes); |
997 if (bytes_sent < bytes) | 998 if (bytes_sent < bytes) |
998 bytes_sent += SendPadData(bytes - bytes_sent, false, 0, 0); | 999 bytes_sent += SendPadData(bytes - bytes_sent, false, 0, 0); |
999 return bytes_sent; | 1000 return bytes_sent; |
1000 } | 1001 } |
1001 | 1002 |
1002 // TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again. | 1003 // TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again. |
1003 int32_t RTPSender::SendToNetwork( | 1004 int32_t RTPSender::SendToNetwork(uint8_t* buffer, |
1004 uint8_t *buffer, size_t payload_length, size_t rtp_header_length, | 1005 size_t payload_length, |
1005 int64_t capture_time_ms, StorageType storage, | 1006 size_t rtp_header_length, |
1006 PacedSender::Priority priority) { | 1007 int64_t capture_time_ms, |
| 1008 StorageType storage, |
| 1009 RtpPacketSender::Priority priority) { |
1007 RtpUtility::RtpHeaderParser rtp_parser(buffer, | 1010 RtpUtility::RtpHeaderParser rtp_parser(buffer, |
1008 payload_length + rtp_header_length); | 1011 payload_length + rtp_header_length); |
1009 RTPHeader rtp_header; | 1012 RTPHeader rtp_header; |
1010 rtp_parser.Parse(rtp_header); | 1013 rtp_parser.Parse(rtp_header); |
1011 | 1014 |
1012 int64_t now_ms = clock_->TimeInMilliseconds(); | 1015 int64_t now_ms = clock_->TimeInMilliseconds(); |
1013 | 1016 |
1014 // |capture_time_ms| <= 0 is considered invalid. | 1017 // |capture_time_ms| <= 0 is considered invalid. |
1015 // TODO(holmer): This should be changed all over Video Engine so that negative | 1018 // TODO(holmer): This should be changed all over Video Engine so that negative |
1016 // time is consider invalid, while 0 is considered a valid time. | 1019 // time is consider invalid, while 0 is considered a valid time. |
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1608 return 0; | 1611 return 0; |
1609 case ExtensionStatus::kError: | 1612 case ExtensionStatus::kError: |
1610 LOG(LS_WARNING) << "Failed to update transport sequence number"; | 1613 LOG(LS_WARNING) << "Failed to update transport sequence number"; |
1611 return 0; | 1614 return 0; |
1612 case ExtensionStatus::kOk: | 1615 case ExtensionStatus::kOk: |
1613 break; | 1616 break; |
1614 default: | 1617 default: |
1615 RTC_NOTREACHED(); | 1618 RTC_NOTREACHED(); |
1616 } | 1619 } |
1617 | 1620 |
1618 uint16_t seq = packet_router_->AllocateSequenceNumber(); | 1621 uint16_t seq = sequence_number_allocator_->AllocateSequenceNumber(); |
1619 BuildTransportSequenceNumberExtension(rtp_packet + offset, seq); | 1622 BuildTransportSequenceNumberExtension(rtp_packet + offset, seq); |
1620 return seq; | 1623 return seq; |
1621 } | 1624 } |
1622 | 1625 |
1623 void RTPSender::SetSendingStatus(bool enabled) { | 1626 void RTPSender::SetSendingStatus(bool enabled) { |
1624 if (enabled) { | 1627 if (enabled) { |
1625 uint32_t frequency_hz = SendPayloadFrequency(); | 1628 uint32_t frequency_hz = SendPayloadFrequency(); |
1626 uint32_t RTPtime = RtpUtility::GetCurrentRTP(clock_, frequency_hz); | 1629 uint32_t RTPtime = RtpUtility::GetCurrentRTP(clock_, frequency_hz); |
1627 | 1630 |
1628 // Will be ignored if it's already configured via API. | 1631 // Will be ignored if it's already configured via API. |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1895 CriticalSectionScoped lock(send_critsect_.get()); | 1898 CriticalSectionScoped lock(send_critsect_.get()); |
1896 | 1899 |
1897 RtpState state; | 1900 RtpState state; |
1898 state.sequence_number = sequence_number_rtx_; | 1901 state.sequence_number = sequence_number_rtx_; |
1899 state.start_timestamp = start_timestamp_; | 1902 state.start_timestamp = start_timestamp_; |
1900 | 1903 |
1901 return state; | 1904 return state; |
1902 } | 1905 } |
1903 | 1906 |
1904 } // namespace webrtc | 1907 } // namespace webrtc |
OLD | NEW |