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 12 matching lines...) Expand all Loading... |
23 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" | 23 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
24 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h" | 24 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h" |
25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" | 25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" |
26 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h" | 26 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h" |
27 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" | 27 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" |
28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" | 28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" |
29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h" | 29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h" |
30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h" | 30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h" |
31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" | 31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" |
32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h" | 32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h" |
33 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rpsi.h" | |
34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h" | 33 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h" |
35 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" | 34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" |
36 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h" | |
37 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbn.h" | 35 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbn.h" |
38 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h" | 36 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h" |
39 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" | 37 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" |
40 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h" | 38 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h" |
41 #include "webrtc/modules/rtp_rtcp/source/time_util.h" | 39 #include "webrtc/modules/rtp_rtcp/source/time_util.h" |
42 #include "webrtc/modules/rtp_rtcp/source/tmmbr_help.h" | 40 #include "webrtc/modules/rtp_rtcp/source/tmmbr_help.h" |
43 | 41 |
44 namespace webrtc { | 42 namespace webrtc { |
45 | 43 |
46 namespace { | 44 namespace { |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 size_t bytes_sent_; | 120 size_t bytes_sent_; |
123 | 121 |
124 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(PacketContainer); | 122 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(PacketContainer); |
125 }; | 123 }; |
126 | 124 |
127 class RTCPSender::RtcpContext { | 125 class RTCPSender::RtcpContext { |
128 public: | 126 public: |
129 RtcpContext(const FeedbackState& feedback_state, | 127 RtcpContext(const FeedbackState& feedback_state, |
130 int32_t nack_size, | 128 int32_t nack_size, |
131 const uint16_t* nack_list, | 129 const uint16_t* nack_list, |
132 uint64_t picture_id, | |
133 NtpTime now) | 130 NtpTime now) |
134 : feedback_state_(feedback_state), | 131 : feedback_state_(feedback_state), |
135 nack_size_(nack_size), | 132 nack_size_(nack_size), |
136 nack_list_(nack_list), | 133 nack_list_(nack_list), |
137 picture_id_(picture_id), | |
138 now_(now) {} | 134 now_(now) {} |
139 | 135 |
140 const FeedbackState& feedback_state_; | 136 const FeedbackState& feedback_state_; |
141 const int32_t nack_size_; | 137 const int32_t nack_size_; |
142 const uint16_t* nack_list_; | 138 const uint16_t* nack_list_; |
143 const uint64_t picture_id_; | |
144 const NtpTime now_; | 139 const NtpTime now_; |
145 }; | 140 }; |
146 | 141 |
147 RTCPSender::RTCPSender( | 142 RTCPSender::RTCPSender( |
148 bool audio, | 143 bool audio, |
149 Clock* clock, | 144 Clock* clock, |
150 ReceiveStatistics* receive_statistics, | 145 ReceiveStatistics* receive_statistics, |
151 RtcpPacketTypeCounterObserver* packet_type_counter_observer, | 146 RtcpPacketTypeCounterObserver* packet_type_counter_observer, |
152 RtcEventLog* event_log, | 147 RtcEventLog* event_log, |
153 Transport* outgoing_transport) | 148 Transport* outgoing_transport) |
(...skipping 29 matching lines...) Expand all Loading... |
183 | 178 |
184 xr_send_receiver_reference_time_enabled_(false), | 179 xr_send_receiver_reference_time_enabled_(false), |
185 packet_type_counter_observer_(packet_type_counter_observer) { | 180 packet_type_counter_observer_(packet_type_counter_observer) { |
186 RTC_DCHECK(transport_ != nullptr); | 181 RTC_DCHECK(transport_ != nullptr); |
187 | 182 |
188 builders_[kRtcpSr] = &RTCPSender::BuildSR; | 183 builders_[kRtcpSr] = &RTCPSender::BuildSR; |
189 builders_[kRtcpRr] = &RTCPSender::BuildRR; | 184 builders_[kRtcpRr] = &RTCPSender::BuildRR; |
190 builders_[kRtcpSdes] = &RTCPSender::BuildSDES; | 185 builders_[kRtcpSdes] = &RTCPSender::BuildSDES; |
191 builders_[kRtcpPli] = &RTCPSender::BuildPLI; | 186 builders_[kRtcpPli] = &RTCPSender::BuildPLI; |
192 builders_[kRtcpFir] = &RTCPSender::BuildFIR; | 187 builders_[kRtcpFir] = &RTCPSender::BuildFIR; |
193 builders_[kRtcpSli] = &RTCPSender::BuildSLI; | |
194 builders_[kRtcpRpsi] = &RTCPSender::BuildRPSI; | |
195 builders_[kRtcpRemb] = &RTCPSender::BuildREMB; | 188 builders_[kRtcpRemb] = &RTCPSender::BuildREMB; |
196 builders_[kRtcpBye] = &RTCPSender::BuildBYE; | 189 builders_[kRtcpBye] = &RTCPSender::BuildBYE; |
197 builders_[kRtcpApp] = &RTCPSender::BuildAPP; | 190 builders_[kRtcpApp] = &RTCPSender::BuildAPP; |
198 builders_[kRtcpTmmbr] = &RTCPSender::BuildTMMBR; | 191 builders_[kRtcpTmmbr] = &RTCPSender::BuildTMMBR; |
199 builders_[kRtcpTmmbn] = &RTCPSender::BuildTMMBN; | 192 builders_[kRtcpTmmbn] = &RTCPSender::BuildTMMBN; |
200 builders_[kRtcpNack] = &RTCPSender::BuildNACK; | 193 builders_[kRtcpNack] = &RTCPSender::BuildNACK; |
201 builders_[kRtcpAnyExtendedReports] = &RTCPSender::BuildExtendedReports; | 194 builders_[kRtcpAnyExtendedReports] = &RTCPSender::BuildExtendedReports; |
202 } | 195 } |
203 | 196 |
204 RTCPSender::~RTCPSender() {} | 197 RTCPSender::~RTCPSender() {} |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
509 | 502 |
510 TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 503 TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
511 "RTCPSender::FIR"); | 504 "RTCPSender::FIR"); |
512 ++packet_type_counter_.fir_packets; | 505 ++packet_type_counter_.fir_packets; |
513 TRACE_COUNTER_ID1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RTCP_FIRCount", | 506 TRACE_COUNTER_ID1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RTCP_FIRCount", |
514 ssrc_, packet_type_counter_.fir_packets); | 507 ssrc_, packet_type_counter_.fir_packets); |
515 | 508 |
516 return std::unique_ptr<rtcp::RtcpPacket>(fir); | 509 return std::unique_ptr<rtcp::RtcpPacket>(fir); |
517 } | 510 } |
518 | 511 |
519 /* | |
520 0 1 2 3 | |
521 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |
522 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
523 | First | Number | PictureID | | |
524 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
525 */ | |
526 std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildSLI(const RtcpContext& ctx) { | |
527 rtcp::Sli* sli = new rtcp::Sli(); | |
528 sli->SetSenderSsrc(ssrc_); | |
529 sli->SetMediaSsrc(remote_ssrc_); | |
530 // Crop picture id to 6 least significant bits. | |
531 sli->AddPictureId(ctx.picture_id_ & 0x3F); | |
532 | |
533 return std::unique_ptr<rtcp::RtcpPacket>(sli); | |
534 } | |
535 | |
536 /* | |
537 0 1 2 3 | |
538 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |
539 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
540 | PB |0| Payload Type| Native RPSI bit string | | |
541 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
542 | defined per codec ... | Padding (0) | | |
543 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
544 */ | |
545 /* | |
546 * Note: not generic made for VP8 | |
547 */ | |
548 std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildRPSI( | |
549 const RtcpContext& ctx) { | |
550 if (ctx.feedback_state_.send_payload_type == 0xFF) | |
551 return nullptr; | |
552 | |
553 rtcp::Rpsi* rpsi = new rtcp::Rpsi(); | |
554 rpsi->SetSenderSsrc(ssrc_); | |
555 rpsi->SetMediaSsrc(remote_ssrc_); | |
556 rpsi->SetPayloadType(ctx.feedback_state_.send_payload_type); | |
557 rpsi->SetPictureId(ctx.picture_id_); | |
558 | |
559 return std::unique_ptr<rtcp::RtcpPacket>(rpsi); | |
560 } | |
561 | |
562 std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildREMB( | 512 std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildREMB( |
563 const RtcpContext& ctx) { | 513 const RtcpContext& ctx) { |
564 rtcp::Remb* remb = new rtcp::Remb(); | 514 rtcp::Remb* remb = new rtcp::Remb(); |
565 remb->SetSenderSsrc(ssrc_); | 515 remb->SetSenderSsrc(ssrc_); |
566 remb->SetBitrateBps(remb_bitrate_); | 516 remb->SetBitrateBps(remb_bitrate_); |
567 remb->SetSsrcs(remb_ssrcs_); | 517 remb->SetSsrcs(remb_ssrcs_); |
568 | 518 |
569 TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 519 TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
570 "RTCPSender::REMB"); | 520 "RTCPSender::REMB"); |
571 | 521 |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 | 679 |
730 xr->SetVoipMetric(voip); | 680 xr->SetVoipMetric(voip); |
731 } | 681 } |
732 | 682 |
733 return std::move(xr); | 683 return std::move(xr); |
734 } | 684 } |
735 | 685 |
736 int32_t RTCPSender::SendRTCP(const FeedbackState& feedback_state, | 686 int32_t RTCPSender::SendRTCP(const FeedbackState& feedback_state, |
737 RTCPPacketType packetType, | 687 RTCPPacketType packetType, |
738 int32_t nack_size, | 688 int32_t nack_size, |
739 const uint16_t* nack_list, | 689 const uint16_t* nack_list) { |
740 uint64_t pictureID) { | |
741 return SendCompoundRTCP( | 690 return SendCompoundRTCP( |
742 feedback_state, std::set<RTCPPacketType>(&packetType, &packetType + 1), | 691 feedback_state, std::set<RTCPPacketType>(&packetType, &packetType + 1), |
743 nack_size, nack_list, pictureID); | 692 nack_size, nack_list); |
744 } | 693 } |
745 | 694 |
746 int32_t RTCPSender::SendCompoundRTCP( | 695 int32_t RTCPSender::SendCompoundRTCP( |
747 const FeedbackState& feedback_state, | 696 const FeedbackState& feedback_state, |
748 const std::set<RTCPPacketType>& packet_types, | 697 const std::set<RTCPPacketType>& packet_types, |
749 int32_t nack_size, | 698 int32_t nack_size, |
750 const uint16_t* nack_list, | 699 const uint16_t* nack_list) { |
751 uint64_t pictureID) { | |
752 PacketContainer container(transport_, event_log_); | 700 PacketContainer container(transport_, event_log_); |
753 size_t max_packet_size; | 701 size_t max_packet_size; |
754 | 702 |
755 { | 703 { |
756 rtc::CritScope lock(&critical_section_rtcp_sender_); | 704 rtc::CritScope lock(&critical_section_rtcp_sender_); |
757 if (method_ == RtcpMode::kOff) { | 705 if (method_ == RtcpMode::kOff) { |
758 LOG(LS_WARNING) << "Can't send rtcp if it is disabled."; | 706 LOG(LS_WARNING) << "Can't send rtcp if it is disabled."; |
759 return -1; | 707 return -1; |
760 } | 708 } |
761 // Add all flags as volatile. Non volatile entries will not be overwritten. | 709 // Add all flags as volatile. Non volatile entries will not be overwritten. |
(...skipping 13 matching lines...) Expand all Loading... |
775 if (sending_ && method_ == RtcpMode::kCompound) { | 723 if (sending_ && method_ == RtcpMode::kCompound) { |
776 // Not allowed to send any RTCP packet without sender report. | 724 // Not allowed to send any RTCP packet without sender report. |
777 return -1; | 725 return -1; |
778 } | 726 } |
779 } | 727 } |
780 | 728 |
781 if (packet_type_counter_.first_packet_time_ms == -1) | 729 if (packet_type_counter_.first_packet_time_ms == -1) |
782 packet_type_counter_.first_packet_time_ms = clock_->TimeInMilliseconds(); | 730 packet_type_counter_.first_packet_time_ms = clock_->TimeInMilliseconds(); |
783 | 731 |
784 // We need to send our NTP even if we haven't received any reports. | 732 // We need to send our NTP even if we haven't received any reports. |
785 RtcpContext context(feedback_state, nack_size, nack_list, pictureID, | 733 RtcpContext context(feedback_state, nack_size, nack_list, |
786 clock_->CurrentNtpTime()); | 734 clock_->CurrentNtpTime()); |
787 | 735 |
788 PrepareReport(feedback_state); | 736 PrepareReport(feedback_state); |
789 | 737 |
790 std::unique_ptr<rtcp::RtcpPacket> packet_bye; | 738 std::unique_ptr<rtcp::RtcpPacket> packet_bye; |
791 | 739 |
792 auto it = report_flags_.begin(); | 740 auto it = report_flags_.begin(); |
793 while (it != report_flags_.end()) { | 741 while (it != report_flags_.end()) { |
794 auto builder_it = builders_.find(it->type); | 742 auto builder_it = builders_.find(it->type); |
795 RTC_DCHECK(builder_it != builders_.end()) | 743 RTC_DCHECK(builder_it != builders_.end()) |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1052 max_packet_size = max_packet_size_; | 1000 max_packet_size = max_packet_size_; |
1053 } | 1001 } |
1054 | 1002 |
1055 RTC_DCHECK_LE(max_packet_size, IP_PACKET_SIZE); | 1003 RTC_DCHECK_LE(max_packet_size, IP_PACKET_SIZE); |
1056 uint8_t buffer[IP_PACKET_SIZE]; | 1004 uint8_t buffer[IP_PACKET_SIZE]; |
1057 return packet.BuildExternalBuffer(buffer, max_packet_size, &sender) && | 1005 return packet.BuildExternalBuffer(buffer, max_packet_size, &sender) && |
1058 !sender.send_failure_; | 1006 !sender.send_failure_; |
1059 } | 1007 } |
1060 | 1008 |
1061 } // namespace webrtc | 1009 } // namespace webrtc |
OLD | NEW |