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 |
11 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" |
12 | 12 |
13 #include <stdlib.h> // srand | |
14 #include <algorithm> | 13 #include <algorithm> |
15 #include <utility> | 14 #include <utility> |
16 | 15 |
17 #include "webrtc/base/checks.h" | 16 #include "webrtc/base/checks.h" |
18 #include "webrtc/base/logging.h" | 17 #include "webrtc/base/logging.h" |
19 #include "webrtc/base/trace_event.h" | 18 #include "webrtc/base/trace_event.h" |
20 #include "webrtc/call.h" | 19 #include "webrtc/call.h" |
21 #include "webrtc/call/rtc_event_log.h" | 20 #include "webrtc/call/rtc_event_log.h" |
22 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" | 21 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" |
23 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 22 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
23 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" | |
24 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h" | |
24 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h" | 25 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h" |
25 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" | 26 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" |
26 #include "webrtc/modules/rtp_rtcp/source/time_util.h" | 27 #include "webrtc/modules/rtp_rtcp/source/time_util.h" |
27 #include "webrtc/system_wrappers/include/tick_util.h" | 28 #include "webrtc/system_wrappers/include/tick_util.h" |
28 | 29 |
29 namespace webrtc { | 30 namespace webrtc { |
30 | 31 |
32 namespace { | |
31 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP. | 33 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP. |
32 static const size_t kMaxPaddingLength = 224; | 34 constexpr size_t kMaxPaddingLength = 224; |
33 static const int kSendSideDelayWindowMs = 1000; | 35 constexpr int kSendSideDelayWindowMs = 1000; |
34 static const uint32_t kAbsSendTimeFraction = 18; | 36 constexpr size_t kRtpHeaderLength = 12; |
35 | 37 constexpr uint16_t kMaxInitRtpSeqNumber = 32767; // 2^15 -1. |
36 namespace { | 38 constexpr uint32_t kTimestampTicksPerMs = 90; |
37 | |
38 const size_t kRtpHeaderLength = 12; | |
39 const uint16_t kMaxInitRtpSeqNumber = 32767; // 2^15 -1. | |
40 | 39 |
41 const char* FrameTypeToString(FrameType frame_type) { | 40 const char* FrameTypeToString(FrameType frame_type) { |
42 switch (frame_type) { | 41 switch (frame_type) { |
43 case kEmptyFrame: | 42 case kEmptyFrame: |
44 return "empty"; | 43 return "empty"; |
45 case kAudioFrameSpeech: return "audio_speech"; | 44 case kAudioFrameSpeech: return "audio_speech"; |
46 case kAudioFrameCN: return "audio_cn"; | 45 case kAudioFrameCN: return "audio_cn"; |
47 case kVideoFrameKey: return "video_key"; | 46 case kVideoFrameKey: return "video_key"; |
48 case kVideoFrameDelta: return "video_delta"; | 47 case kVideoFrameDelta: return "video_delta"; |
49 } | 48 } |
50 return ""; | 49 return ""; |
51 } | 50 } |
52 | 51 |
53 // TODO(holmer): Merge this with the implementation in | 52 void CountPacket(RtpPacketCounter* counter, const RtpPacketToSend& packet) { |
54 // remote_bitrate_estimator_abs_send_time.cc. | 53 ++counter->packets; |
55 uint32_t ConvertMsTo24Bits(int64_t time_ms) { | 54 counter->header_bytes += packet.headers_size(); |
56 uint32_t time_24_bits = | 55 counter->padding_bytes += packet.padding_size(); |
57 static_cast<uint32_t>( | 56 counter->payload_bytes += packet.payload_size(); |
58 ((static_cast<uint64_t>(time_ms) << kAbsSendTimeFraction) + 500) / | |
59 1000) & | |
60 0x00FFFFFF; | |
61 return time_24_bits; | |
62 } | 57 } |
58 | |
63 } // namespace | 59 } // namespace |
64 | 60 |
65 RTPSender::BitrateAggregator::BitrateAggregator( | 61 RTPSender::BitrateAggregator::BitrateAggregator( |
66 BitrateStatisticsObserver* bitrate_callback) | 62 BitrateStatisticsObserver* bitrate_callback) |
67 : callback_(bitrate_callback), | 63 : callback_(bitrate_callback), |
68 total_bitrate_observer_(*this), | 64 total_bitrate_observer_(*this), |
69 retransmit_bitrate_observer_(*this), | 65 retransmit_bitrate_observer_(*this), |
70 ssrc_(0) {} | 66 ssrc_(0) {} |
71 | 67 |
72 void RTPSender::BitrateAggregator::OnStatsUpdated() const { | 68 void RTPSender::BitrateAggregator::OnStatsUpdated() const { |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
162 timestamp_(0), | 158 timestamp_(0), |
163 capture_time_ms_(0), | 159 capture_time_ms_(0), |
164 last_timestamp_time_ms_(0), | 160 last_timestamp_time_ms_(0), |
165 media_has_been_sent_(false), | 161 media_has_been_sent_(false), |
166 last_packet_marker_bit_(false), | 162 last_packet_marker_bit_(false), |
167 csrcs_(), | 163 csrcs_(), |
168 rtx_(kRtxOff), | 164 rtx_(kRtxOff), |
169 target_bitrate_(0) { | 165 target_bitrate_(0) { |
170 memset(nack_byte_count_times_, 0, sizeof(nack_byte_count_times_)); | 166 memset(nack_byte_count_times_, 0, sizeof(nack_byte_count_times_)); |
171 memset(nack_byte_count_, 0, sizeof(nack_byte_count_)); | 167 memset(nack_byte_count_, 0, sizeof(nack_byte_count_)); |
172 // We need to seed the random generator for BuildPaddingPacket() below. | |
173 // TODO(holmer,tommi): Note that TimeInMilliseconds might return 0 on Mac | |
174 // early on in the process. | |
175 srand(static_cast<uint32_t>(clock_->TimeInMilliseconds())); | |
176 ssrc_ = ssrc_db_->CreateSSRC(); | 168 ssrc_ = ssrc_db_->CreateSSRC(); |
177 RTC_DCHECK(ssrc_ != 0); | 169 RTC_DCHECK(ssrc_ != 0); |
178 ssrc_rtx_ = ssrc_db_->CreateSSRC(); | 170 ssrc_rtx_ = ssrc_db_->CreateSSRC(); |
179 RTC_DCHECK(ssrc_rtx_ != 0); | 171 RTC_DCHECK(ssrc_rtx_ != 0); |
180 | 172 |
181 bitrates_.set_ssrc(ssrc_); | 173 bitrates_.set_ssrc(ssrc_); |
182 // Random start, 16 bits. Can't be 0. | 174 // Random start, 16 bits. Can't be 0. |
183 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); | 175 sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
184 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); | 176 sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber); |
185 } | 177 } |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
385 int rtx; | 377 int rtx; |
386 { | 378 { |
387 rtc::CritScope lock(&send_critsect_); | 379 rtc::CritScope lock(&send_critsect_); |
388 rtx = rtx_; | 380 rtx = rtx_; |
389 } | 381 } |
390 if (audio_configured_) { | 382 if (audio_configured_) { |
391 return max_payload_length_ - RTPHeaderLength(); | 383 return max_payload_length_ - RTPHeaderLength(); |
392 } else { | 384 } else { |
393 return max_payload_length_ - RTPHeaderLength() // RTP overhead. | 385 return max_payload_length_ - RTPHeaderLength() // RTP overhead. |
394 - video_->FECPacketOverhead() // FEC/ULP/RED overhead. | 386 - video_->FECPacketOverhead() // FEC/ULP/RED overhead. |
395 - ((rtx) ? 2 : 0); // RTX overhead. | 387 - (rtx ? kRtxHeaderSize : 0); // RTX overhead. |
396 } | 388 } |
397 } | 389 } |
398 | 390 |
399 size_t RTPSender::MaxPayloadLength() const { | 391 size_t RTPSender::MaxPayloadLength() const { |
400 return max_payload_length_; | 392 return max_payload_length_; |
401 } | 393 } |
402 | 394 |
403 void RTPSender::SetRtxStatus(int mode) { | 395 void RTPSender::SetRtxStatus(int mode) { |
404 rtc::CritScope lock(&send_critsect_); | 396 rtc::CritScope lock(&send_critsect_); |
405 rtx_ = mode; | 397 rtx_ = mode; |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
547 | 539 |
548 size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send) { | 540 size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send) { |
549 { | 541 { |
550 rtc::CritScope lock(&send_critsect_); | 542 rtc::CritScope lock(&send_critsect_); |
551 if (!sending_media_) | 543 if (!sending_media_) |
552 return 0; | 544 return 0; |
553 if ((rtx_ & kRtxRedundantPayloads) == 0) | 545 if ((rtx_ & kRtxRedundantPayloads) == 0) |
554 return 0; | 546 return 0; |
555 } | 547 } |
556 | 548 |
557 uint8_t buffer[IP_PACKET_SIZE]; | |
558 int bytes_left = static_cast<int>(bytes_to_send); | 549 int bytes_left = static_cast<int>(bytes_to_send); |
559 while (bytes_left > 0) { | 550 while (bytes_left > 0) { |
560 size_t length = bytes_left; | 551 std::unique_ptr<RtpPacketToSend> packet = |
561 int64_t capture_time_ms; | 552 packet_history_.GetBestFittingPacket(bytes_left); |
562 if (!packet_history_.GetBestFittingPacket(buffer, &length, | 553 if (!packet) { |
stefan-webrtc
2016/05/09 11:49:23
Remove {}
danilchap
2016/05/09 13:45:22
Done.
What is rule of thumb for not having {}?
stefan-webrtc
2016/05/12 12:22:34
I usually go by "if statement <=2 lines, no {}, ot
| |
563 &capture_time_ms)) { | |
564 break; | 554 break; |
565 } | 555 } |
566 if (!PrepareAndSendPacket(buffer, length, capture_time_ms, true, false)) | 556 size_t payload_size = packet->payload_size(); |
557 if (!PrepareAndSendPacket(std::move(packet), true, false)) { | |
stefan-webrtc
2016/05/09 11:49:23
Remove {}
danilchap
2016/05/09 13:45:22
Done.
| |
567 break; | 558 break; |
568 RtpUtility::RtpHeaderParser rtp_parser(buffer, length); | 559 } |
569 RTPHeader rtp_header; | 560 bytes_left -= payload_size; |
570 rtp_parser.Parse(&rtp_header); | |
stefan-webrtc
2016/05/09 11:49:23
Woho!
| |
571 bytes_left -= static_cast<int>(length - rtp_header.headerLength); | |
572 } | 561 } |
573 return bytes_to_send - bytes_left; | 562 return bytes_to_send - bytes_left; |
574 } | 563 } |
575 | 564 |
576 void RTPSender::BuildPaddingPacket(uint8_t* packet, | |
577 size_t header_length, | |
578 size_t padding_length) { | |
579 packet[0] |= 0x20; // Set padding bit. | |
580 int32_t* data = reinterpret_cast<int32_t*>(&(packet[header_length])); | |
581 | |
582 // Fill data buffer with random data. | |
583 for (size_t j = 0; j < (padding_length >> 2); ++j) { | |
584 data[j] = rand(); // NOLINT | |
585 } | |
586 // Set number of padding bytes in the last byte of the packet. | |
587 packet[header_length + padding_length - 1] = | |
588 static_cast<uint8_t>(padding_length); | |
589 } | |
590 | |
591 size_t RTPSender::SendPadData(size_t bytes, | 565 size_t RTPSender::SendPadData(size_t bytes, |
592 bool timestamp_provided, | 566 bool timestamp_provided, |
593 uint32_t timestamp, | 567 uint32_t timestamp, |
594 int64_t capture_time_ms) { | 568 int64_t capture_time_ms) { |
595 // Always send full padding packets. This is accounted for by the | 569 // Always send full padding packets. This is accounted for by the |
596 // RtpPacketSender, | 570 // RtpPacketSender, |
597 // which will make sure we don't send too much padding even if a single packet | 571 // which will make sure we don't send too much padding even if a single packet |
598 // is larger than requested. | 572 // is larger than requested. |
599 size_t padding_bytes_in_packet = | 573 size_t padding_bytes_in_packet = |
600 std::min(MaxDataPayloadLength(), kMaxPaddingLength); | 574 std::min(MaxDataPayloadLength(), kMaxPaddingLength); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
647 (clock_->TimeInMilliseconds() - last_timestamp_time_ms_); | 621 (clock_->TimeInMilliseconds() - last_timestamp_time_ms_); |
648 } | 622 } |
649 ssrc = ssrc_rtx_; | 623 ssrc = ssrc_rtx_; |
650 sequence_number = sequence_number_rtx_; | 624 sequence_number = sequence_number_rtx_; |
651 ++sequence_number_rtx_; | 625 ++sequence_number_rtx_; |
652 payload_type = rtx_payload_type_map_.begin()->second; | 626 payload_type = rtx_payload_type_map_.begin()->second; |
653 over_rtx = true; | 627 over_rtx = true; |
654 } | 628 } |
655 } | 629 } |
656 | 630 |
657 uint8_t padding_packet[IP_PACKET_SIZE]; | 631 RtpPacketToSend padding_packet(&rtp_header_extension_map_, IP_PACKET_SIZE); |
658 size_t header_length = | 632 padding_packet.SetPayloadType(payload_type); |
659 CreateRtpHeader(padding_packet, payload_type, ssrc, false, timestamp, | 633 padding_packet.SetMarker(false); |
660 sequence_number, std::vector<uint32_t>()); | 634 padding_packet.SetSequenceNumber(sequence_number); |
661 BuildPaddingPacket(padding_packet, header_length, padding_bytes_in_packet); | 635 padding_packet.SetTimestamp(timestamp); |
662 size_t length = padding_bytes_in_packet + header_length; | 636 padding_packet.SetSsrc(ssrc); |
637 | |
663 int64_t now_ms = clock_->TimeInMilliseconds(); | 638 int64_t now_ms = clock_->TimeInMilliseconds(); |
664 | 639 |
665 RtpUtility::RtpHeaderParser rtp_parser(padding_packet, length); | 640 if (capture_time_ms > 0) { |
666 RTPHeader rtp_header; | 641 padding_packet.SetExtension<TransmissionOffset>( |
667 rtp_parser.Parse(&rtp_header); | 642 kTimestampTicksPerMs * (now_ms - capture_time_ms)); |
643 } | |
644 padding_packet.SetExtension<AbsoluteSendTime>(now_ms); | |
668 | 645 |
669 if (capture_time_ms > 0) { | 646 PacketOptions options; |
670 UpdateTransmissionTimeOffset( | 647 bool has_transport_seq_no = |
671 padding_packet, length, rtp_header, now_ms - capture_time_ms); | 648 AllocateTransportSequenceNumber(&options.packet_id) && |
649 padding_packet.SetExtension<TransportSequenceNumber>(options.packet_id); | |
650 | |
651 padding_packet.SetPadding(padding_bytes_in_packet, &random_); | |
652 | |
653 if (has_transport_seq_no && transport_feedback_observer_) { | |
654 transport_feedback_observer_->AddPacket(options.packet_id, | |
655 padding_packet.size(), true); | |
672 } | 656 } |
673 | 657 |
674 UpdateAbsoluteSendTime(padding_packet, length, rtp_header, now_ms); | 658 if (!SendPacketToNetwork(padding_packet, options)) |
675 | |
676 PacketOptions options; | |
677 if (AllocateTransportSequenceNumber(&options.packet_id)) { | |
678 if (UpdateTransportSequenceNumber(options.packet_id, padding_packet, | |
679 length, rtp_header)) { | |
680 if (transport_feedback_observer_) | |
681 transport_feedback_observer_->AddPacket(options.packet_id, length, | |
682 true); | |
683 } | |
684 } | |
685 | |
686 if (!SendPacketToNetwork(padding_packet, length, options)) | |
687 break; | 659 break; |
688 | 660 |
689 bytes_sent += padding_bytes_in_packet; | 661 bytes_sent += padding_bytes_in_packet; |
690 UpdateRtpStats(padding_packet, length, rtp_header, over_rtx, false); | 662 UpdateRtpStats(padding_packet, over_rtx, false); |
691 } | 663 } |
692 | 664 |
693 return bytes_sent; | 665 return bytes_sent; |
694 } | 666 } |
695 | 667 |
696 void RTPSender::SetStorePacketsStatus(bool enable, uint16_t number_to_store) { | 668 void RTPSender::SetStorePacketsStatus(bool enable, uint16_t number_to_store) { |
697 packet_history_.SetStorePacketsStatus(enable, number_to_store); | 669 packet_history_.SetStorePacketsStatus(enable, number_to_store); |
698 } | 670 } |
699 | 671 |
700 bool RTPSender::StorePackets() const { | 672 bool RTPSender::StorePackets() const { |
701 return packet_history_.StorePackets(); | 673 return packet_history_.StorePackets(); |
702 } | 674 } |
703 | 675 |
704 int32_t RTPSender::ReSendPacket(uint16_t packet_id, int64_t min_resend_time) { | 676 int32_t RTPSender::ReSendPacket(uint16_t packet_id, int64_t min_resend_time) { |
705 size_t length = IP_PACKET_SIZE; | 677 std::unique_ptr<RtpPacketToSend> packet = |
706 uint8_t data_buffer[IP_PACKET_SIZE]; | 678 packet_history_.GetPacketAndSetSendTime(packet_id, min_resend_time, true); |
707 int64_t capture_time_ms; | 679 if (!packet) { |
708 | |
709 if (!packet_history_.GetPacketAndSetSendTime(packet_id, min_resend_time, true, | |
710 data_buffer, &length, | |
711 &capture_time_ms)) { | |
712 // Packet not found. | 680 // Packet not found. |
713 return 0; | 681 return 0; |
714 } | 682 } |
715 | 683 |
716 if (paced_sender_) { | 684 if (paced_sender_) { |
717 RtpUtility::RtpHeaderParser rtp_parser(data_buffer, length); | |
718 RTPHeader header; | |
719 if (!rtp_parser.Parse(&header)) { | |
720 assert(false); | |
721 return -1; | |
722 } | |
723 // Convert from TickTime to Clock since capture_time_ms is based on | 685 // Convert from TickTime to Clock since capture_time_ms is based on |
724 // TickTime. | 686 // TickTime. |
725 int64_t corrected_capture_tims_ms = capture_time_ms + clock_delta_ms_; | 687 int64_t corrected_capture_tims_ms = |
726 paced_sender_->InsertPacket( | 688 packet->capture_time_ms() + clock_delta_ms_; |
727 RtpPacketSender::kNormalPriority, header.ssrc, header.sequenceNumber, | 689 paced_sender_->InsertPacket(RtpPacketSender::kNormalPriority, |
728 corrected_capture_tims_ms, length - header.headerLength, true); | 690 packet->Ssrc(), packet->SequenceNumber(), |
691 corrected_capture_tims_ms, | |
692 packet->payload_size(), true); | |
729 | 693 |
730 return length; | 694 return packet->size(); |
731 } | 695 } |
732 int rtx = kRtxOff; | 696 int rtx = kRtxOff; |
733 { | 697 { |
734 rtc::CritScope lock(&send_critsect_); | 698 rtc::CritScope lock(&send_critsect_); |
735 rtx = rtx_; | 699 rtx = rtx_; |
736 } | 700 } |
737 if (!PrepareAndSendPacket(data_buffer, length, capture_time_ms, | 701 int32_t packet_size = static_cast<int32_t>(packet->size()); |
738 (rtx & kRtxRetransmitted) > 0, true)) { | 702 if (!PrepareAndSendPacket(std::move(packet), (rtx & kRtxRetransmitted) > 0, |
703 true)) { | |
739 return -1; | 704 return -1; |
740 } | 705 } |
741 return static_cast<int32_t>(length); | 706 return packet_size; |
742 } | 707 } |
743 | 708 |
744 bool RTPSender::SendPacketToNetwork(const uint8_t* packet, | 709 bool RTPSender::SendPacketToNetwork(const RtpPacketToSend& packet, |
745 size_t size, | |
746 const PacketOptions& options) { | 710 const PacketOptions& options) { |
747 int bytes_sent = -1; | 711 int bytes_sent = -1; |
748 if (transport_) { | 712 if (transport_) { |
749 bytes_sent = transport_->SendRtp(packet, size, options) | 713 bytes_sent = transport_->SendRtp(packet.data(), packet.size(), options) |
750 ? static_cast<int>(size) | 714 ? static_cast<int>(packet.size()) |
751 : -1; | 715 : -1; |
752 if (event_log_ && bytes_sent > 0) { | 716 if (event_log_ && bytes_sent > 0) { |
753 event_log_->LogRtpHeader(kOutgoingPacket, MediaType::ANY, packet, size); | 717 event_log_->LogRtpHeader(kOutgoingPacket, MediaType::ANY, packet.data(), |
718 packet.size()); | |
754 } | 719 } |
755 } | 720 } |
756 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 721 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
757 "RTPSender::SendPacketToNetwork", "size", size, "sent", | 722 "RTPSender::SendPacketToNetwork", "size", packet.size(), |
758 bytes_sent); | 723 "sent", bytes_sent); |
759 // TODO(pwestin): Add a separate bitrate for sent bitrate after pacer. | 724 // TODO(pwestin): Add a separate bitrate for sent bitrate after pacer. |
760 if (bytes_sent <= 0) { | 725 if (bytes_sent <= 0) { |
761 LOG(LS_WARNING) << "Transport failed to send packet"; | 726 LOG(LS_WARNING) << "Transport failed to send packet"; |
762 return false; | 727 return false; |
763 } | 728 } |
764 return true; | 729 return true; |
765 } | 730 } |
766 | 731 |
767 int RTPSender::SelectiveRetransmissions() const { | 732 int RTPSender::SelectiveRetransmissions() const { |
768 if (!video_) | 733 if (!video_) |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
865 nack_byte_count_times_[i + 1] = nack_byte_count_times_[i]; | 830 nack_byte_count_times_[i + 1] = nack_byte_count_times_[i]; |
866 } | 831 } |
867 nack_byte_count_[0] = bytes; | 832 nack_byte_count_[0] = bytes; |
868 nack_byte_count_times_[0] = now; | 833 nack_byte_count_times_[0] = now; |
869 } | 834 } |
870 | 835 |
871 // Called from pacer when we can send the packet. | 836 // Called from pacer when we can send the packet. |
872 bool RTPSender::TimeToSendPacket(uint16_t sequence_number, | 837 bool RTPSender::TimeToSendPacket(uint16_t sequence_number, |
873 int64_t capture_time_ms, | 838 int64_t capture_time_ms, |
874 bool retransmission) { | 839 bool retransmission) { |
875 size_t length = IP_PACKET_SIZE; | 840 std::unique_ptr<RtpPacketToSend> packet = |
876 uint8_t data_buffer[IP_PACKET_SIZE]; | 841 packet_history_.GetPacketAndSetSendTime(sequence_number, 0, |
877 int64_t stored_time_ms; | 842 retransmission); |
878 | 843 if (!packet) { |
879 if (!packet_history_.GetPacketAndSetSendTime(sequence_number, | |
880 0, | |
881 retransmission, | |
882 data_buffer, | |
883 &length, | |
884 &stored_time_ms)) { | |
885 // Packet cannot be found. Allow sending to continue. | 844 // Packet cannot be found. Allow sending to continue. |
886 return true; | 845 return true; |
887 } | 846 } |
888 | 847 |
889 int rtx; | 848 int rtx; |
890 { | 849 { |
891 rtc::CritScope lock(&send_critsect_); | 850 rtc::CritScope lock(&send_critsect_); |
892 rtx = rtx_; | 851 rtx = rtx_; |
893 } | 852 } |
894 return PrepareAndSendPacket(data_buffer, | 853 return PrepareAndSendPacket(std::move(packet), |
895 length, | |
896 capture_time_ms, | |
897 retransmission && (rtx & kRtxRetransmitted) > 0, | 854 retransmission && (rtx & kRtxRetransmitted) > 0, |
898 retransmission); | 855 retransmission); |
899 } | 856 } |
900 | 857 |
901 bool RTPSender::PrepareAndSendPacket(uint8_t* buffer, | 858 bool RTPSender::PrepareAndSendPacket(std::unique_ptr<RtpPacketToSend> packet, |
902 size_t length, | |
903 int64_t capture_time_ms, | |
904 bool send_over_rtx, | 859 bool send_over_rtx, |
905 bool is_retransmit) { | 860 bool is_retransmit) { |
906 uint8_t* buffer_to_send_ptr = buffer; | 861 RTC_DCHECK(packet); |
862 int64_t capture_time_ms = packet->capture_time_ms(); | |
863 RtpPacketToSend* packet_to_send = packet.get(); | |
907 | 864 |
908 RtpUtility::RtpHeaderParser rtp_parser(buffer, length); | 865 if (!is_retransmit && packet->Marker()) { |
909 RTPHeader rtp_header; | |
910 rtp_parser.Parse(&rtp_header); | |
911 if (!is_retransmit && rtp_header.markerBit) { | |
912 TRACE_EVENT_ASYNC_END0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PacedSend", | 866 TRACE_EVENT_ASYNC_END0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PacedSend", |
913 capture_time_ms); | 867 capture_time_ms); |
914 } | 868 } |
915 | 869 |
916 TRACE_EVENT_INSTANT2( | 870 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
917 TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PrepareAndSendPacket", | 871 "PrepareAndSendPacket", "timestamp", packet->Timestamp(), |
918 "timestamp", rtp_header.timestamp, "seqnum", rtp_header.sequenceNumber); | 872 "seqnum", packet->SequenceNumber()); |
919 | 873 |
920 uint8_t data_buffer_rtx[IP_PACKET_SIZE]; | 874 std::unique_ptr<RtpPacketToSend> packet_rtx; |
921 if (send_over_rtx) { | 875 if (send_over_rtx) { |
922 BuildRtxPacket(buffer, &length, data_buffer_rtx); | 876 packet_rtx = BuildRtxPacket(*packet); |
923 buffer_to_send_ptr = data_buffer_rtx; | 877 RTC_DCHECK(packet_rtx); |
878 packet_to_send = packet_rtx.get(); | |
924 } | 879 } |
925 | 880 |
926 int64_t now_ms = clock_->TimeInMilliseconds(); | 881 int64_t now_ms = clock_->TimeInMilliseconds(); |
927 int64_t diff_ms = now_ms - capture_time_ms; | 882 int64_t diff_ms = now_ms - capture_time_ms; |
928 UpdateTransmissionTimeOffset(buffer_to_send_ptr, length, rtp_header, | 883 packet_to_send->SetExtension<TransmissionOffset>(kTimestampTicksPerMs * |
929 diff_ms); | 884 diff_ms); |
930 UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms); | 885 packet_to_send->SetExtension<AbsoluteSendTime>(now_ms); |
931 | 886 |
932 PacketOptions options; | 887 PacketOptions options; |
933 if (AllocateTransportSequenceNumber(&options.packet_id)) { | 888 if (AllocateTransportSequenceNumber(&options.packet_id)) { |
934 if (UpdateTransportSequenceNumber(options.packet_id, buffer_to_send_ptr, | 889 if (packet_to_send->SetExtension<TransportSequenceNumber>( |
935 length, rtp_header)) { | 890 options.packet_id)) { |
936 if (transport_feedback_observer_) | 891 if (transport_feedback_observer_) |
937 transport_feedback_observer_->AddPacket(options.packet_id, length, | 892 transport_feedback_observer_->AddPacket(options.packet_id, |
938 true); | 893 packet_to_send->size(), true); |
939 } | 894 } |
940 } | 895 } |
941 | 896 |
942 if (!is_retransmit && !send_over_rtx) { | 897 if (!is_retransmit && !send_over_rtx) { |
943 UpdateDelayStatistics(capture_time_ms, now_ms); | 898 UpdateDelayStatistics(packet->capture_time_ms(), now_ms); |
944 UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc); | 899 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(), |
900 packet->Ssrc()); | |
945 } | 901 } |
946 | 902 |
947 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options); | 903 if (!SendPacketToNetwork(*packet_to_send, options)) { |
stefan-webrtc
2016/05/09 11:49:23
Remove {}
| |
948 if (ret) { | 904 return false; |
905 } | |
906 { | |
949 rtc::CritScope lock(&send_critsect_); | 907 rtc::CritScope lock(&send_critsect_); |
950 media_has_been_sent_ = true; | 908 media_has_been_sent_ = true; |
951 } | 909 } |
952 UpdateRtpStats(buffer_to_send_ptr, length, rtp_header, send_over_rtx, | 910 UpdateRtpStats(*packet_to_send, send_over_rtx, is_retransmit); |
953 is_retransmit); | 911 return true; |
954 return ret; | |
955 } | 912 } |
956 | 913 |
957 void RTPSender::UpdateRtpStats(const uint8_t* buffer, | 914 void RTPSender::UpdateRtpStats(const RtpPacketToSend& packet, |
958 size_t packet_length, | |
959 const RTPHeader& header, | |
960 bool is_rtx, | 915 bool is_rtx, |
961 bool is_retransmit) { | 916 bool is_retransmit) { |
962 StreamDataCounters* counters; | 917 StreamDataCounters* counters; |
963 // Get ssrc before taking statistics_crit_ to avoid possible deadlock. | 918 // Get ssrc before taking statistics_crit_ to avoid possible deadlock. |
964 uint32_t ssrc = is_rtx ? RtxSsrc() : SSRC(); | 919 uint32_t ssrc = is_rtx ? RtxSsrc() : SSRC(); |
965 | 920 |
966 rtc::CritScope lock(&statistics_crit_); | 921 rtc::CritScope lock(&statistics_crit_); |
967 if (is_rtx) { | 922 if (is_rtx) { |
968 counters = &rtx_rtp_stats_; | 923 counters = &rtx_rtp_stats_; |
969 } else { | 924 } else { |
970 counters = &rtp_stats_; | 925 counters = &rtp_stats_; |
971 } | 926 } |
972 | 927 |
973 total_bitrate_sent_.Update(packet_length); | 928 total_bitrate_sent_.Update(packet.size()); |
974 | 929 |
975 if (counters->first_packet_time_ms == -1) { | 930 if (counters->first_packet_time_ms == -1) { |
976 counters->first_packet_time_ms = clock_->TimeInMilliseconds(); | 931 counters->first_packet_time_ms = clock_->TimeInMilliseconds(); |
977 } | 932 } |
978 if (IsFecPacket(buffer, header)) { | 933 if (IsFecPacket(packet)) { |
979 counters->fec.AddPacket(packet_length, header); | 934 CountPacket(&counters->fec, packet); |
980 } | 935 } |
981 if (is_retransmit) { | 936 if (is_retransmit) { |
982 counters->retransmitted.AddPacket(packet_length, header); | 937 CountPacket(&counters->retransmitted, packet); |
983 } | 938 } |
984 counters->transmitted.AddPacket(packet_length, header); | 939 CountPacket(&counters->transmitted, packet); |
985 | 940 |
986 if (rtp_stats_callback_) { | 941 if (rtp_stats_callback_) { |
987 rtp_stats_callback_->DataCountersUpdated(*counters, ssrc); | 942 rtp_stats_callback_->DataCountersUpdated(*counters, ssrc); |
988 } | 943 } |
989 } | 944 } |
990 | 945 |
991 bool RTPSender::IsFecPacket(const uint8_t* buffer, | 946 bool RTPSender::IsFecPacket(const RtpPacketToSend& packet) const { |
992 const RTPHeader& header) const { | |
993 if (!video_) { | 947 if (!video_) { |
994 return false; | 948 return false; |
995 } | 949 } |
996 bool fec_enabled; | 950 bool fec_enabled; |
997 uint8_t pt_red; | 951 uint8_t pt_red; |
998 uint8_t pt_fec; | 952 uint8_t pt_fec; |
999 video_->GenericFECStatus(&fec_enabled, &pt_red, &pt_fec); | 953 video_->GenericFECStatus(&fec_enabled, &pt_red, &pt_fec); |
1000 return fec_enabled && | 954 return fec_enabled && packet.PayloadType() == pt_red && |
1001 header.payloadType == pt_red && | 955 packet.payload()[0] == pt_fec; |
1002 buffer[header.headerLength] == pt_fec; | |
1003 } | 956 } |
1004 | 957 |
1005 size_t RTPSender::TimeToSendPadding(size_t bytes) { | 958 size_t RTPSender::TimeToSendPadding(size_t bytes) { |
1006 if (audio_configured_ || bytes == 0) | 959 if (audio_configured_ || bytes == 0) |
1007 return 0; | 960 return 0; |
1008 size_t bytes_sent = TrySendRedundantPayloads(bytes); | 961 size_t bytes_sent = TrySendRedundantPayloads(bytes); |
1009 if (bytes_sent < bytes) | 962 if (bytes_sent < bytes) |
1010 bytes_sent += SendPadData(bytes - bytes_sent, false, 0, 0); | 963 bytes_sent += SendPadData(bytes - bytes_sent, false, 0, 0); |
1011 return bytes_sent; | 964 return bytes_sent; |
1012 } | 965 } |
1013 | 966 |
1014 // TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again. | |
1015 int32_t RTPSender::SendToNetwork(uint8_t* buffer, | 967 int32_t RTPSender::SendToNetwork(uint8_t* buffer, |
1016 size_t payload_length, | 968 size_t payload_length, |
1017 size_t rtp_header_length, | 969 size_t rtp_header_length, |
1018 int64_t capture_time_ms, | 970 int64_t capture_time_ms, |
1019 StorageType storage, | 971 StorageType storage, |
1020 RtpPacketSender::Priority priority) { | 972 RtpPacketSender::Priority priority) { |
1021 size_t length = payload_length + rtp_header_length; | 973 size_t length = payload_length + rtp_header_length; |
1022 RtpUtility::RtpHeaderParser rtp_parser(buffer, length); | 974 std::unique_ptr<RtpPacketToSend> packet( |
975 new RtpPacketToSend(&rtp_header_extension_map_, length)); | |
976 RTC_CHECK(packet->Parse(buffer, length)); | |
977 packet->set_capture_time_ms(capture_time_ms); | |
978 return SendToNetwork(std::move(packet), storage, priority) ? 0 : -1; | |
danilchap
2016/05/09 10:24:57
Here payload_length is ignored and packet->payload
| |
979 } | |
1023 | 980 |
1024 RTPHeader rtp_header; | 981 bool RTPSender::SendToNetwork(std::unique_ptr<RtpPacketToSend> packet, |
1025 rtp_parser.Parse(&rtp_header); | 982 StorageType storage, |
1026 | 983 RtpPacketSender::Priority priority) { |
984 RTC_DCHECK(packet); | |
1027 int64_t now_ms = clock_->TimeInMilliseconds(); | 985 int64_t now_ms = clock_->TimeInMilliseconds(); |
1028 | 986 |
1029 // |capture_time_ms| <= 0 is considered invalid. | 987 // |capture_time_ms| <= 0 is considered invalid. |
1030 // TODO(holmer): This should be changed all over Video Engine so that negative | 988 // TODO(holmer): This should be changed all over Video Engine so that negative |
1031 // time is consider invalid, while 0 is considered a valid time. | 989 // time is consider invalid, while 0 is considered a valid time. |
1032 if (capture_time_ms > 0) { | 990 if (packet->capture_time_ms() > 0) { |
1033 UpdateTransmissionTimeOffset(buffer, length, rtp_header, | 991 packet->SetExtension<TransmissionOffset>( |
1034 now_ms - capture_time_ms); | 992 kTimestampTicksPerMs * (now_ms - packet->capture_time_ms())); |
1035 } | 993 } |
1036 | 994 packet->SetExtension<AbsoluteSendTime>(now_ms); |
1037 UpdateAbsoluteSendTime(buffer, length, rtp_header, now_ms); | |
1038 | |
1039 // Used for NACK and to spread out the transmission of packets. | |
1040 if (packet_history_.PutRTPPacket(buffer, length, capture_time_ms, storage) != | |
1041 0) { | |
1042 return -1; | |
1043 } | |
1044 | 995 |
1045 if (paced_sender_) { | 996 if (paced_sender_) { |
997 uint16_t seq_no = packet->SequenceNumber(); | |
998 uint32_t ssrc = packet->Ssrc(); | |
1046 // Correct offset between implementations of millisecond time stamps in | 999 // Correct offset between implementations of millisecond time stamps in |
1047 // TickTime and Clock. | 1000 // TickTime and Clock. |
1048 int64_t corrected_time_ms = capture_time_ms + clock_delta_ms_; | 1001 int64_t corrected_time_ms = packet->capture_time_ms() + clock_delta_ms_; |
1049 paced_sender_->InsertPacket(priority, rtp_header.ssrc, | 1002 size_t payload_length = packet->payload_size(); |
1050 rtp_header.sequenceNumber, corrected_time_ms, | 1003 packet_history_.PutRtpPacket(std::move(packet), storage, false); |
1004 | |
1005 paced_sender_->InsertPacket(priority, ssrc, seq_no, corrected_time_ms, | |
1051 payload_length, false); | 1006 payload_length, false); |
danilchap
2016/05/09 10:24:57
This is the only place in this function that cares
| |
1052 if (last_capture_time_ms_sent_ == 0 || | 1007 if (last_capture_time_ms_sent_ == 0 || |
1053 corrected_time_ms > last_capture_time_ms_sent_) { | 1008 corrected_time_ms > last_capture_time_ms_sent_) { |
1054 last_capture_time_ms_sent_ = corrected_time_ms; | 1009 last_capture_time_ms_sent_ = corrected_time_ms; |
1055 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 1010 TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
1056 "PacedSend", corrected_time_ms, | 1011 "PacedSend", corrected_time_ms, |
1057 "capture_time_ms", corrected_time_ms); | 1012 "capture_time_ms", corrected_time_ms); |
1058 } | 1013 } |
1059 return 0; | 1014 return true; |
1060 } | 1015 } |
1061 | 1016 |
1062 PacketOptions options; | 1017 PacketOptions options; |
1063 if (AllocateTransportSequenceNumber(&options.packet_id)) { | 1018 if (AllocateTransportSequenceNumber(&options.packet_id)) { |
1064 if (UpdateTransportSequenceNumber(options.packet_id, buffer, length, | 1019 if (packet->SetExtension<TransportSequenceNumber>(options.packet_id)) { |
1065 rtp_header)) { | |
1066 if (transport_feedback_observer_) | 1020 if (transport_feedback_observer_) |
stefan-webrtc
2016/05/09 11:49:23
{}
danilchap
2016/05/09 13:45:22
Done.
| |
1067 transport_feedback_observer_->AddPacket(options.packet_id, length, | 1021 transport_feedback_observer_->AddPacket(options.packet_id, |
1068 true); | 1022 packet->size(), true); |
1069 } | 1023 } |
1070 } | 1024 } |
1071 UpdateDelayStatistics(capture_time_ms, now_ms); | 1025 UpdateDelayStatistics(packet->capture_time_ms(), now_ms); |
1072 UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc); | 1026 UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(), |
1027 packet->Ssrc()); | |
1073 | 1028 |
1074 bool sent = SendPacketToNetwork(buffer, length, options); | 1029 bool sent = SendPacketToNetwork(*packet, options); |
1030 | |
1031 if (sent) { | |
1032 { | |
1033 rtc::CritScope lock(&send_critsect_); | |
1034 media_has_been_sent_ = true; | |
1035 } | |
1036 UpdateRtpStats(*packet, false, false); | |
1037 } | |
1075 | 1038 |
1076 // Mark the packet as sent in the history even if send failed. Dropping a | 1039 // Mark the packet as sent in the history even if send failed. Dropping a |
1077 // packet here should be treated as any other packet drop so we should be | 1040 // packet here should be treated as any other packet drop so we should be |
1078 // ready for a retransmission. | 1041 // ready for a retransmission. |
1079 packet_history_.SetSent(rtp_header.sequenceNumber); | 1042 packet_history_.PutRtpPacket(std::move(packet), storage, true); |
1080 | 1043 |
1081 if (!sent) | 1044 return sent; |
1082 return -1; | |
1083 | |
1084 { | |
1085 rtc::CritScope lock(&send_critsect_); | |
1086 media_has_been_sent_ = true; | |
1087 } | |
1088 UpdateRtpStats(buffer, length, rtp_header, false, false); | |
1089 return 0; | |
1090 } | 1045 } |
1091 | 1046 |
1092 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { | 1047 void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { |
1093 if (!send_side_delay_observer_ || capture_time_ms <= 0) | 1048 if (!send_side_delay_observer_ || capture_time_ms <= 0) |
1094 return; | 1049 return; |
1095 | 1050 |
1096 uint32_t ssrc; | 1051 uint32_t ssrc; |
1097 int avg_delay_ms = 0; | 1052 int avg_delay_ms = 0; |
1098 int max_delay_ms = 0; | 1053 int max_delay_ms = 0; |
1099 { | 1054 { |
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1504 | 1459 |
1505 // Verify first byte in block. | 1460 // Verify first byte in block. |
1506 const uint8_t first_block_byte = (id << 4) + (extension_length_bytes - 2); | 1461 const uint8_t first_block_byte = (id << 4) + (extension_length_bytes - 2); |
1507 if (rtp_packet[block_pos] != first_block_byte) | 1462 if (rtp_packet[block_pos] != first_block_byte) |
1508 return ExtensionStatus::kError; | 1463 return ExtensionStatus::kError; |
1509 | 1464 |
1510 *extension_offset = block_pos; | 1465 *extension_offset = block_pos; |
1511 return ExtensionStatus::kOk; | 1466 return ExtensionStatus::kOk; |
1512 } | 1467 } |
1513 | 1468 |
1514 void RTPSender::UpdateTransmissionTimeOffset(uint8_t* rtp_packet, | |
1515 size_t rtp_packet_length, | |
1516 const RTPHeader& rtp_header, | |
1517 int64_t time_diff_ms) const { | |
1518 size_t offset; | |
1519 rtc::CritScope lock(&send_critsect_); | |
1520 switch (VerifyExtension(kRtpExtensionTransmissionTimeOffset, rtp_packet, | |
1521 rtp_packet_length, rtp_header, | |
1522 kTransmissionTimeOffsetLength, &offset)) { | |
1523 case ExtensionStatus::kNotRegistered: | |
1524 return; | |
1525 case ExtensionStatus::kError: | |
1526 LOG(LS_WARNING) << "Failed to update transmission time offset."; | |
1527 return; | |
1528 case ExtensionStatus::kOk: | |
1529 break; | |
1530 default: | |
1531 RTC_NOTREACHED(); | |
1532 } | |
1533 | |
1534 // Update transmission offset field (converting to a 90 kHz timestamp). | |
1535 ByteWriter<int32_t, 3>::WriteBigEndian(rtp_packet + offset + 1, | |
1536 time_diff_ms * 90); // RTP timestamp. | |
1537 } | |
1538 | |
1539 bool RTPSender::UpdateAudioLevel(uint8_t* rtp_packet, | 1469 bool RTPSender::UpdateAudioLevel(uint8_t* rtp_packet, |
1540 size_t rtp_packet_length, | 1470 size_t rtp_packet_length, |
1541 const RTPHeader& rtp_header, | 1471 const RTPHeader& rtp_header, |
1542 bool is_voiced, | 1472 bool is_voiced, |
1543 uint8_t dBov) const { | 1473 uint8_t dBov) const { |
1544 size_t offset; | 1474 size_t offset; |
1545 rtc::CritScope lock(&send_critsect_); | 1475 rtc::CritScope lock(&send_critsect_); |
1546 | 1476 |
1547 switch (VerifyExtension(kRtpExtensionAudioLevel, rtp_packet, | 1477 switch (VerifyExtension(kRtpExtensionAudioLevel, rtp_packet, |
1548 rtp_packet_length, rtp_header, kAudioLevelLength, | 1478 rtp_packet_length, rtp_header, kAudioLevelLength, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1580 case ExtensionStatus::kOk: | 1510 case ExtensionStatus::kOk: |
1581 break; | 1511 break; |
1582 default: | 1512 default: |
1583 RTC_NOTREACHED(); | 1513 RTC_NOTREACHED(); |
1584 } | 1514 } |
1585 | 1515 |
1586 rtp_packet[offset + 1] = ConvertVideoRotationToCVOByte(rotation); | 1516 rtp_packet[offset + 1] = ConvertVideoRotationToCVOByte(rotation); |
1587 return true; | 1517 return true; |
1588 } | 1518 } |
1589 | 1519 |
1590 void RTPSender::UpdateAbsoluteSendTime(uint8_t* rtp_packet, | |
1591 size_t rtp_packet_length, | |
1592 const RTPHeader& rtp_header, | |
1593 int64_t now_ms) const { | |
1594 size_t offset; | |
1595 rtc::CritScope lock(&send_critsect_); | |
1596 | |
1597 switch (VerifyExtension(kRtpExtensionAbsoluteSendTime, rtp_packet, | |
1598 rtp_packet_length, rtp_header, | |
1599 kAbsoluteSendTimeLength, &offset)) { | |
1600 case ExtensionStatus::kNotRegistered: | |
1601 return; | |
1602 case ExtensionStatus::kError: | |
1603 LOG(LS_WARNING) << "Failed to update absolute send time"; | |
1604 return; | |
1605 case ExtensionStatus::kOk: | |
1606 break; | |
1607 default: | |
1608 RTC_NOTREACHED(); | |
1609 } | |
1610 | |
1611 // Update absolute send time field (convert ms to 24-bit unsigned with 18 bit | |
1612 // fractional part). | |
1613 ByteWriter<uint32_t, 3>::WriteBigEndian(rtp_packet + offset + 1, | |
1614 ConvertMsTo24Bits(now_ms)); | |
1615 } | |
1616 | |
1617 bool RTPSender::UpdateTransportSequenceNumber( | |
1618 uint16_t sequence_number, | |
1619 uint8_t* rtp_packet, | |
1620 size_t rtp_packet_length, | |
1621 const RTPHeader& rtp_header) const { | |
1622 size_t offset; | |
1623 rtc::CritScope lock(&send_critsect_); | |
1624 | |
1625 switch (VerifyExtension(kRtpExtensionTransportSequenceNumber, rtp_packet, | |
1626 rtp_packet_length, rtp_header, | |
1627 kTransportSequenceNumberLength, &offset)) { | |
1628 case ExtensionStatus::kNotRegistered: | |
1629 return false; | |
1630 case ExtensionStatus::kError: | |
1631 LOG(LS_WARNING) << "Failed to update transport sequence number"; | |
1632 return false; | |
1633 case ExtensionStatus::kOk: | |
1634 break; | |
1635 default: | |
1636 RTC_NOTREACHED(); | |
1637 } | |
1638 | |
1639 BuildTransportSequenceNumberExtension(rtp_packet + offset, sequence_number); | |
1640 return true; | |
1641 } | |
1642 | |
1643 bool RTPSender::AllocateTransportSequenceNumber(int* packet_id) const { | 1520 bool RTPSender::AllocateTransportSequenceNumber(int* packet_id) const { |
1644 if (!transport_sequence_number_allocator_) | 1521 if (!transport_sequence_number_allocator_) |
1645 return false; | 1522 return false; |
1646 | 1523 |
1647 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber(); | 1524 *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber(); |
1648 return true; | 1525 return true; |
1649 } | 1526 } |
1650 | 1527 |
1651 void RTPSender::SetSendingStatus(bool enabled) { | 1528 void RTPSender::SetSendingStatus(bool enabled) { |
1652 if (enabled) { | 1529 if (enabled) { |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1813 int32_t RTPSender::SetFecParameters( | 1690 int32_t RTPSender::SetFecParameters( |
1814 const FecProtectionParams *delta_params, | 1691 const FecProtectionParams *delta_params, |
1815 const FecProtectionParams *key_params) { | 1692 const FecProtectionParams *key_params) { |
1816 if (audio_configured_) { | 1693 if (audio_configured_) { |
1817 return -1; | 1694 return -1; |
1818 } | 1695 } |
1819 video_->SetFecParameters(delta_params, key_params); | 1696 video_->SetFecParameters(delta_params, key_params); |
1820 return 0; | 1697 return 0; |
1821 } | 1698 } |
1822 | 1699 |
1823 void RTPSender::BuildRtxPacket(uint8_t* buffer, size_t* length, | 1700 std::unique_ptr<RtpPacketToSend> RTPSender::BuildRtxPacket( |
1824 uint8_t* buffer_rtx) { | 1701 const RtpPacketToSend& packet) { |
1825 rtc::CritScope lock(&send_critsect_); | 1702 // TODO(danilchap): Create rtx packet with extra capacity for SRTP |
1826 uint8_t* data_buffer_rtx = buffer_rtx; | 1703 // when transport interface would be updated to take buffer class. |
1827 // Add RTX header. | 1704 std::unique_ptr<RtpPacketToSend> rtx_packet(new RtpPacketToSend( |
1828 RtpUtility::RtpHeaderParser rtp_parser( | 1705 &rtp_header_extension_map_, packet.size() + kRtxHeaderSize)); |
1829 reinterpret_cast<const uint8_t*>(buffer), *length); | 1706 // Add original RTP header. |
1707 rtx_packet->CopyHeaderFrom(packet); | |
1830 | 1708 |
1831 RTPHeader rtp_header; | 1709 { |
1832 rtp_parser.Parse(&rtp_header); | 1710 rtc::CritScope lock(&send_critsect_); |
1711 // Replace payload type, if a specific type is set for RTX. | |
1712 auto kv = rtx_payload_type_map_.find(packet.PayloadType()); | |
1833 | 1713 |
1834 // Add original RTP header. | 1714 // Use rtx mapping associated with media codec if we can't find one, |
1835 memcpy(data_buffer_rtx, buffer, rtp_header.headerLength); | 1715 // assume it's red. |
1716 // TODO(holmer): Remove once old Chrome versions don't rely on this. | |
1717 if (kv == rtx_payload_type_map_.end()) | |
1718 kv = rtx_payload_type_map_.find(payload_type_); | |
1719 if (kv != rtx_payload_type_map_.end()) | |
1720 rtx_packet->SetPayloadType(kv->second); | |
1836 | 1721 |
1837 // Replace payload type, if a specific type is set for RTX. | 1722 // Replace sequence number. |
1838 auto kv = rtx_payload_type_map_.find(rtp_header.payloadType); | 1723 rtx_packet->SetSequenceNumber(sequence_number_rtx_++); |
1839 // Use rtx mapping associated with media codec if we can't find one, assuming | |
1840 // it's red. | |
1841 // TODO(holmer): Remove once old Chrome versions don't rely on this. | |
1842 if (kv == rtx_payload_type_map_.end()) | |
1843 kv = rtx_payload_type_map_.find(payload_type_); | |
1844 if (kv != rtx_payload_type_map_.end()) | |
1845 data_buffer_rtx[1] = kv->second; | |
1846 if (rtp_header.markerBit) | |
1847 data_buffer_rtx[1] |= kRtpMarkerBitMask; | |
1848 | 1724 |
1849 // Replace sequence number. | 1725 // Replace SSRC. |
1850 uint8_t* ptr = data_buffer_rtx + 2; | 1726 rtx_packet->SetSsrc(ssrc_rtx_); |
1851 ByteWriter<uint16_t>::WriteBigEndian(ptr, sequence_number_rtx_++); | 1727 } |
1852 | 1728 |
1853 // Replace SSRC. | 1729 uint8_t* rtx_payload = |
1854 ptr += 6; | 1730 rtx_packet->AllocatePayload(packet.payload_size() + kRtxHeaderSize); |
1855 ByteWriter<uint32_t>::WriteBigEndian(ptr, ssrc_rtx_); | 1731 RTC_DCHECK(rtx_payload); |
1856 | |
1857 // Add OSN (original sequence number). | 1732 // Add OSN (original sequence number). |
1858 ptr = data_buffer_rtx + rtp_header.headerLength; | 1733 ByteWriter<uint16_t>::WriteBigEndian(rtx_payload, packet.SequenceNumber()); |
1859 ByteWriter<uint16_t>::WriteBigEndian(ptr, rtp_header.sequenceNumber); | |
1860 ptr += 2; | |
1861 | 1734 |
1862 // Add original payload data. | 1735 // Add original payload data. |
1863 memcpy(ptr, buffer + rtp_header.headerLength, | 1736 memcpy(rtx_payload + kRtxHeaderSize, packet.payload(), packet.payload_size()); |
1864 *length - rtp_header.headerLength); | 1737 |
1865 *length += 2; | 1738 return rtx_packet; |
1866 } | 1739 } |
1867 | 1740 |
1868 void RTPSender::RegisterRtpStatisticsCallback( | 1741 void RTPSender::RegisterRtpStatisticsCallback( |
1869 StreamDataCountersCallback* callback) { | 1742 StreamDataCountersCallback* callback) { |
1870 rtc::CritScope cs(&statistics_crit_); | 1743 rtc::CritScope cs(&statistics_crit_); |
1871 rtp_stats_callback_ = callback; | 1744 rtp_stats_callback_ = callback; |
1872 } | 1745 } |
1873 | 1746 |
1874 StreamDataCountersCallback* RTPSender::GetRtpStatisticsCallback() const { | 1747 StreamDataCountersCallback* RTPSender::GetRtpStatisticsCallback() const { |
1875 rtc::CritScope cs(&statistics_crit_); | 1748 rtc::CritScope cs(&statistics_crit_); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1913 rtc::CritScope lock(&send_critsect_); | 1786 rtc::CritScope lock(&send_critsect_); |
1914 | 1787 |
1915 RtpState state; | 1788 RtpState state; |
1916 state.sequence_number = sequence_number_rtx_; | 1789 state.sequence_number = sequence_number_rtx_; |
1917 state.start_timestamp = start_timestamp_; | 1790 state.start_timestamp = start_timestamp_; |
1918 | 1791 |
1919 return state; | 1792 return state; |
1920 } | 1793 } |
1921 | 1794 |
1922 } // namespace webrtc | 1795 } // namespace webrtc |
OLD | NEW |