Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_sender.cc

Issue 2005313003: Propagate probing cluster id to SendTimeHistory. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Feedback fixes. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 525 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 } else if (frame_type == kVideoFrameDelta) { 536 } else if (frame_type == kVideoFrameDelta) {
537 ++frame_counts_.delta_frames; 537 ++frame_counts_.delta_frames;
538 } 538 }
539 if (frame_count_observer_) { 539 if (frame_count_observer_) {
540 frame_count_observer_->FrameCountUpdated(frame_counts_, ssrc); 540 frame_count_observer_->FrameCountUpdated(frame_counts_, ssrc);
541 } 541 }
542 542
543 return ret_val; 543 return ret_val;
544 } 544 }
545 545
546 size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send) { 546 size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send,
547 int probe_cluster_id) {
547 { 548 {
548 rtc::CritScope lock(&send_critsect_); 549 rtc::CritScope lock(&send_critsect_);
549 if (!sending_media_) 550 if (!sending_media_)
550 return 0; 551 return 0;
551 if ((rtx_ & kRtxRedundantPayloads) == 0) 552 if ((rtx_ & kRtxRedundantPayloads) == 0)
552 return 0; 553 return 0;
553 } 554 }
554 555
555 uint8_t buffer[IP_PACKET_SIZE]; 556 uint8_t buffer[IP_PACKET_SIZE];
556 int bytes_left = static_cast<int>(bytes_to_send); 557 int bytes_left = static_cast<int>(bytes_to_send);
557 while (bytes_left > 0) { 558 while (bytes_left > 0) {
558 size_t length = bytes_left; 559 size_t length = bytes_left;
559 int64_t capture_time_ms; 560 int64_t capture_time_ms;
560 if (!packet_history_.GetBestFittingPacket(buffer, &length, 561 if (!packet_history_.GetBestFittingPacket(buffer, &length,
561 &capture_time_ms)) { 562 &capture_time_ms)) {
562 break; 563 break;
563 } 564 }
564 if (!PrepareAndSendPacket(buffer, length, capture_time_ms, true, false)) 565 if (!PrepareAndSendPacket(buffer, length, capture_time_ms, true, false,
566 probe_cluster_id))
565 break; 567 break;
566 RtpUtility::RtpHeaderParser rtp_parser(buffer, length); 568 RtpUtility::RtpHeaderParser rtp_parser(buffer, length);
567 RTPHeader rtp_header; 569 RTPHeader rtp_header;
568 rtp_parser.Parse(&rtp_header); 570 rtp_parser.Parse(&rtp_header);
569 bytes_left -= static_cast<int>(length - rtp_header.headerLength); 571 bytes_left -= static_cast<int>(length - rtp_header.headerLength);
570 } 572 }
571 return bytes_to_send - bytes_left; 573 return bytes_to_send - bytes_left;
572 } 574 }
573 575
574 void RTPSender::BuildPaddingPacket(uint8_t* packet, 576 void RTPSender::BuildPaddingPacket(uint8_t* packet,
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 } 672 }
671 673
672 UpdateAbsoluteSendTime(padding_packet, length, rtp_header, now_ms); 674 UpdateAbsoluteSendTime(padding_packet, length, rtp_header, now_ms);
673 675
674 PacketOptions options; 676 PacketOptions options;
675 if (AllocateTransportSequenceNumber(&options.packet_id)) { 677 if (AllocateTransportSequenceNumber(&options.packet_id)) {
676 if (UpdateTransportSequenceNumber(options.packet_id, padding_packet, 678 if (UpdateTransportSequenceNumber(options.packet_id, padding_packet,
677 length, rtp_header)) { 679 length, rtp_header)) {
678 if (transport_feedback_observer_) 680 if (transport_feedback_observer_)
679 transport_feedback_observer_->AddPacket(options.packet_id, length, 681 transport_feedback_observer_->AddPacket(options.packet_id, length,
680 true); 682 PacketInfo::kNotAProbe);
stefan-webrtc 2016/05/26 16:29:50 Was this a bug? Should it have been covered by a t
681 } 683 }
682 } 684 }
683 685
684 if (!SendPacketToNetwork(padding_packet, length, options)) 686 if (!SendPacketToNetwork(padding_packet, length, options))
685 break; 687 break;
686 688
687 bytes_sent += padding_bytes_in_packet; 689 bytes_sent += padding_bytes_in_packet;
688 UpdateRtpStats(padding_packet, length, rtp_header, over_rtx, false); 690 UpdateRtpStats(padding_packet, length, rtp_header, over_rtx, false);
689 } 691 }
690 692
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 corrected_capture_tims_ms, length - header.headerLength, true); 728 corrected_capture_tims_ms, length - header.headerLength, true);
727 729
728 return length; 730 return length;
729 } 731 }
730 int rtx = kRtxOff; 732 int rtx = kRtxOff;
731 { 733 {
732 rtc::CritScope lock(&send_critsect_); 734 rtc::CritScope lock(&send_critsect_);
733 rtx = rtx_; 735 rtx = rtx_;
734 } 736 }
735 if (!PrepareAndSendPacket(data_buffer, length, capture_time_ms, 737 if (!PrepareAndSendPacket(data_buffer, length, capture_time_ms,
736 (rtx & kRtxRetransmitted) > 0, true)) { 738 (rtx & kRtxRetransmitted) > 0, true,
739 PacketInfo::kNotAProbe)) {
737 return -1; 740 return -1;
738 } 741 }
739 return static_cast<int32_t>(length); 742 return static_cast<int32_t>(length);
740 } 743 }
741 744
742 bool RTPSender::SendPacketToNetwork(const uint8_t* packet, 745 bool RTPSender::SendPacketToNetwork(const uint8_t* packet,
743 size_t size, 746 size_t size,
744 const PacketOptions& options) { 747 const PacketOptions& options) {
745 int bytes_sent = -1; 748 int bytes_sent = -1;
746 if (transport_) { 749 if (transport_) {
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
862 nack_byte_count_[i + 1] = nack_byte_count_[i]; 865 nack_byte_count_[i + 1] = nack_byte_count_[i];
863 nack_byte_count_times_[i + 1] = nack_byte_count_times_[i]; 866 nack_byte_count_times_[i + 1] = nack_byte_count_times_[i];
864 } 867 }
865 nack_byte_count_[0] = bytes; 868 nack_byte_count_[0] = bytes;
866 nack_byte_count_times_[0] = now; 869 nack_byte_count_times_[0] = now;
867 } 870 }
868 871
869 // Called from pacer when we can send the packet. 872 // Called from pacer when we can send the packet.
870 bool RTPSender::TimeToSendPacket(uint16_t sequence_number, 873 bool RTPSender::TimeToSendPacket(uint16_t sequence_number,
871 int64_t capture_time_ms, 874 int64_t capture_time_ms,
872 bool retransmission) { 875 bool retransmission,
876 int probe_cluster_id) {
873 size_t length = IP_PACKET_SIZE; 877 size_t length = IP_PACKET_SIZE;
874 uint8_t data_buffer[IP_PACKET_SIZE]; 878 uint8_t data_buffer[IP_PACKET_SIZE];
875 int64_t stored_time_ms; 879 int64_t stored_time_ms;
876 880
877 if (!packet_history_.GetPacketAndSetSendTime(sequence_number, 881 if (!packet_history_.GetPacketAndSetSendTime(sequence_number,
878 0, 882 0,
879 retransmission, 883 retransmission,
880 data_buffer, 884 data_buffer,
881 &length, 885 &length,
882 &stored_time_ms)) { 886 &stored_time_ms)) {
883 // Packet cannot be found. Allow sending to continue. 887 // Packet cannot be found. Allow sending to continue.
884 return true; 888 return true;
885 } 889 }
886 890
887 int rtx; 891 int rtx;
888 { 892 {
889 rtc::CritScope lock(&send_critsect_); 893 rtc::CritScope lock(&send_critsect_);
890 rtx = rtx_; 894 rtx = rtx_;
891 } 895 }
892 return PrepareAndSendPacket(data_buffer, 896 return PrepareAndSendPacket(data_buffer, length, capture_time_ms,
893 length,
894 capture_time_ms,
895 retransmission && (rtx & kRtxRetransmitted) > 0, 897 retransmission && (rtx & kRtxRetransmitted) > 0,
896 retransmission); 898 retransmission, probe_cluster_id);
897 } 899 }
898 900
899 bool RTPSender::PrepareAndSendPacket(uint8_t* buffer, 901 bool RTPSender::PrepareAndSendPacket(uint8_t* buffer,
900 size_t length, 902 size_t length,
901 int64_t capture_time_ms, 903 int64_t capture_time_ms,
902 bool send_over_rtx, 904 bool send_over_rtx,
903 bool is_retransmit) { 905 bool is_retransmit,
906 int probe_cluster_id) {
904 uint8_t* buffer_to_send_ptr = buffer; 907 uint8_t* buffer_to_send_ptr = buffer;
905 908
906 RtpUtility::RtpHeaderParser rtp_parser(buffer, length); 909 RtpUtility::RtpHeaderParser rtp_parser(buffer, length);
907 RTPHeader rtp_header; 910 RTPHeader rtp_header;
908 rtp_parser.Parse(&rtp_header); 911 rtp_parser.Parse(&rtp_header);
909 if (!is_retransmit && rtp_header.markerBit) { 912 if (!is_retransmit && rtp_header.markerBit) {
910 TRACE_EVENT_ASYNC_END0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PacedSend", 913 TRACE_EVENT_ASYNC_END0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PacedSend",
911 capture_time_ms); 914 capture_time_ms);
912 } 915 }
913 916
(...skipping 12 matching lines...) Expand all
926 UpdateTransmissionTimeOffset(buffer_to_send_ptr, length, rtp_header, 929 UpdateTransmissionTimeOffset(buffer_to_send_ptr, length, rtp_header,
927 diff_ms); 930 diff_ms);
928 UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms); 931 UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms);
929 932
930 PacketOptions options; 933 PacketOptions options;
931 if (AllocateTransportSequenceNumber(&options.packet_id)) { 934 if (AllocateTransportSequenceNumber(&options.packet_id)) {
932 if (UpdateTransportSequenceNumber(options.packet_id, buffer_to_send_ptr, 935 if (UpdateTransportSequenceNumber(options.packet_id, buffer_to_send_ptr,
933 length, rtp_header)) { 936 length, rtp_header)) {
934 if (transport_feedback_observer_) 937 if (transport_feedback_observer_)
935 transport_feedback_observer_->AddPacket(options.packet_id, length, 938 transport_feedback_observer_->AddPacket(options.packet_id, length,
936 true); 939 probe_cluster_id);
stefan-webrtc 2016/05/26 16:29:50 Same here
937 } 940 }
938 } 941 }
939 942
940 if (!is_retransmit && !send_over_rtx) { 943 if (!is_retransmit && !send_over_rtx) {
941 UpdateDelayStatistics(capture_time_ms, now_ms); 944 UpdateDelayStatistics(capture_time_ms, now_ms);
942 UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc); 945 UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc);
943 } 946 }
944 947
945 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options); 948 bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options);
946 if (ret) { 949 if (ret) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
993 } 996 }
994 bool fec_enabled; 997 bool fec_enabled;
995 uint8_t pt_red; 998 uint8_t pt_red;
996 uint8_t pt_fec; 999 uint8_t pt_fec;
997 video_->GenericFECStatus(&fec_enabled, &pt_red, &pt_fec); 1000 video_->GenericFECStatus(&fec_enabled, &pt_red, &pt_fec);
998 return fec_enabled && 1001 return fec_enabled &&
999 header.payloadType == pt_red && 1002 header.payloadType == pt_red &&
1000 buffer[header.headerLength] == pt_fec; 1003 buffer[header.headerLength] == pt_fec;
1001 } 1004 }
1002 1005
1003 size_t RTPSender::TimeToSendPadding(size_t bytes) { 1006 size_t RTPSender::TimeToSendPadding(size_t bytes, int probe_cluster_id) {
1004 if (audio_configured_ || bytes == 0) 1007 if (audio_configured_ || bytes == 0)
1005 return 0; 1008 return 0;
1006 size_t bytes_sent = TrySendRedundantPayloads(bytes); 1009 size_t bytes_sent = TrySendRedundantPayloads(bytes, probe_cluster_id);
1007 if (bytes_sent < bytes) 1010 if (bytes_sent < bytes)
1008 bytes_sent += SendPadData(bytes - bytes_sent, false, 0, 0); 1011 bytes_sent += SendPadData(bytes - bytes_sent, false, 0, 0);
danilchap 2016/05/31 08:58:24 Padding can use cluster_id too.
1009 return bytes_sent; 1012 return bytes_sent;
1010 } 1013 }
1011 1014
1012 // TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again. 1015 // TODO(pwestin): send in the RtpHeaderParser to avoid parsing it again.
1013 int32_t RTPSender::SendToNetwork(uint8_t* buffer, 1016 int32_t RTPSender::SendToNetwork(uint8_t* buffer,
1014 size_t payload_length, 1017 size_t payload_length,
1015 size_t rtp_header_length, 1018 size_t rtp_header_length,
1016 int64_t capture_time_ms, 1019 int64_t capture_time_ms,
1017 StorageType storage, 1020 StorageType storage,
1018 RtpPacketSender::Priority priority) { 1021 RtpPacketSender::Priority priority) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1056 } 1059 }
1057 return 0; 1060 return 0;
1058 } 1061 }
1059 1062
1060 PacketOptions options; 1063 PacketOptions options;
1061 if (AllocateTransportSequenceNumber(&options.packet_id)) { 1064 if (AllocateTransportSequenceNumber(&options.packet_id)) {
1062 if (UpdateTransportSequenceNumber(options.packet_id, buffer, length, 1065 if (UpdateTransportSequenceNumber(options.packet_id, buffer, length,
1063 rtp_header)) { 1066 rtp_header)) {
1064 if (transport_feedback_observer_) 1067 if (transport_feedback_observer_)
1065 transport_feedback_observer_->AddPacket(options.packet_id, length, 1068 transport_feedback_observer_->AddPacket(options.packet_id, length,
1066 true); 1069 PacketInfo::kNotAProbe);
1067 } 1070 }
1068 } 1071 }
1069 UpdateDelayStatistics(capture_time_ms, now_ms); 1072 UpdateDelayStatistics(capture_time_ms, now_ms);
1070 UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc); 1073 UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc);
1071 1074
1072 bool sent = SendPacketToNetwork(buffer, length, options); 1075 bool sent = SendPacketToNetwork(buffer, length, options);
1073 1076
1074 // Mark the packet as sent in the history even if send failed. Dropping a 1077 // Mark the packet as sent in the history even if send failed. Dropping a
1075 // packet here should be treated as any other packet drop so we should be 1078 // packet here should be treated as any other packet drop so we should be
1076 // ready for a retransmission. 1079 // ready for a retransmission.
(...skipping 834 matching lines...) Expand 10 before | Expand all | Expand 10 after
1911 rtc::CritScope lock(&send_critsect_); 1914 rtc::CritScope lock(&send_critsect_);
1912 1915
1913 RtpState state; 1916 RtpState state;
1914 state.sequence_number = sequence_number_rtx_; 1917 state.sequence_number = sequence_number_rtx_;
1915 state.start_timestamp = start_timestamp_; 1918 state.start_timestamp = start_timestamp_;
1916 1919
1917 return state; 1920 return state;
1918 } 1921 }
1919 1922
1920 } // namespace webrtc 1923 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698