Index: webrtc/modules/rtp_rtcp/source/rtp_sender.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc |
index d004cd8d4fbe6239d6515a2d328cb777807dc33b..4c45c4954429c5fbcaffd8a24ed1e39adcde593d 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc |
@@ -119,7 +119,8 @@ RTPSender::RTPSender( |
TransportFeedbackObserver* transport_feedback_observer, |
BitrateStatisticsObserver* bitrate_callback, |
FrameCountObserver* frame_count_observer, |
- SendSideDelayObserver* send_side_delay_observer) |
+ SendSideDelayObserver* send_side_delay_observer, |
+ SendPacketObserver* send_packet_observer) |
: clock_(clock), |
// TODO(holmer): Remove this conversion when we remove the use of |
// TickTime. |
@@ -157,6 +158,7 @@ RTPSender::RTPSender( |
rtp_stats_callback_(NULL), |
frame_count_observer_(frame_count_observer), |
send_side_delay_observer_(send_side_delay_observer), |
+ send_packet_observer_(send_packet_observer), |
// RTP variables |
start_timestamp_forced_(false), |
start_timestamp_(0), |
@@ -608,9 +610,6 @@ size_t RTPSender::SendPadData(size_t bytes, |
size_t padding_bytes_in_packet = |
std::min(MaxDataPayloadLength(), kMaxPaddingLength); |
size_t bytes_sent = 0; |
- bool using_transport_seq = rtp_header_extension_map_.IsRegistered( |
- kRtpExtensionTransportSequenceNumber) && |
- transport_sequence_number_allocator_; |
for (; bytes > 0; bytes -= padding_bytes_in_packet) { |
if (bytes < padding_bytes_in_packet) |
bytes = padding_bytes_in_packet; |
@@ -677,13 +676,13 @@ size_t RTPSender::SendPadData(size_t bytes, |
UpdateAbsoluteSendTime(padding_packet, length, rtp_header, now_ms); |
PacketOptions options; |
- if (using_transport_seq) { |
- options.packet_id = |
- UpdateTransportSequenceNumber(padding_packet, length, rtp_header); |
- } |
- |
- if (using_transport_seq && transport_feedback_observer_) { |
- transport_feedback_observer_->AddPacket(options.packet_id, length, true); |
+ if (UseTransportSequenceNumber(&options.packet_id)) { |
+ UpdateTransportSequenceNumber(options.packet_id, padding_packet, length, |
+ rtp_header); |
+ if (transport_feedback_observer_) { |
+ transport_feedback_observer_->AddPacket(options.packet_id, length, |
+ true); |
+ } |
} |
if (!SendPacketToNetwork(padding_packet, length, options)) |
@@ -885,9 +884,7 @@ bool RTPSender::TimeToSendPacket(uint16_t sequence_number, |
// Packet cannot be found. Allow sending to continue. |
return true; |
} |
- if (!retransmission && capture_time_ms > 0) { |
- UpdateDelayStatistics(capture_time_ms, clock_->TimeInMilliseconds()); |
- } |
+ |
int rtx; |
{ |
CriticalSectionScoped lock(send_critsect_.get()); |
@@ -931,19 +928,17 @@ bool RTPSender::PrepareAndSendPacket(uint8_t* buffer, |
diff_ms); |
UpdateAbsoluteSendTime(buffer_to_send_ptr, length, rtp_header, now_ms); |
- // TODO(sprang): Potentially too much overhead in IsRegistered()? |
- bool using_transport_seq = rtp_header_extension_map_.IsRegistered( |
- kRtpExtensionTransportSequenceNumber) && |
- transport_sequence_number_allocator_; |
- |
PacketOptions options; |
- if (using_transport_seq) { |
- options.packet_id = |
- UpdateTransportSequenceNumber(buffer_to_send_ptr, length, rtp_header); |
+ if (UseTransportSequenceNumber(&options.packet_id)) { |
+ UpdateTransportSequenceNumber(options.packet_id, buffer_to_send_ptr, length, |
+ rtp_header); |
+ if (transport_feedback_observer_) |
+ transport_feedback_observer_->AddPacket(options.packet_id, length, true); |
} |
- if (using_transport_seq && transport_feedback_observer_) { |
- transport_feedback_observer_->AddPacket(options.packet_id, length, true); |
+ if (!is_retransmit && !send_over_rtx) { |
+ UpdateDelayStatistics(capture_time_ms, now_ms); |
+ UpdateOnSendPacket(options.packet_id, capture_time_ms, rtp_header.ssrc); |
} |
bool ret = SendPacketToNetwork(buffer_to_send_ptr, length, options); |
@@ -956,6 +951,17 @@ bool RTPSender::PrepareAndSendPacket(uint8_t* buffer, |
return ret; |
} |
+bool RTPSender::UseTransportSequenceNumber(int* packet_id) const { |
stefan-webrtc
2016/01/18 19:48:25
Maybe this should say that it actually allocates a
åsapersson
2016/04/06 14:52:37
Changed to AllocateTransportSequenceNumber. Remove
|
+ if (!transport_sequence_number_allocator_) |
+ return false; |
+ |
+ *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber(); |
+ |
+ // TODO(sprang): Potentially too much overhead in IsRegistered()? |
+ return rtp_header_extension_map_.IsRegistered( |
+ kRtpExtensionTransportSequenceNumber); |
+} |
+ |
void RTPSender::UpdateRtpStats(const uint8_t* buffer, |
size_t packet_length, |
const RTPHeader& header, |
@@ -1065,9 +1071,8 @@ int32_t RTPSender::SendToNetwork(uint8_t* buffer, |
} |
return 0; |
} |
- if (capture_time_ms > 0) { |
- UpdateDelayStatistics(capture_time_ms, now_ms); |
- } |
+ |
+ UpdateDelayStatistics(capture_time_ms, now_ms); |
size_t length = payload_length + rtp_header_length; |
bool sent = SendPacketToNetwork(buffer, length, PacketOptions()); |
@@ -1089,7 +1094,7 @@ int32_t RTPSender::SendToNetwork(uint8_t* buffer, |
} |
void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { |
- if (!send_side_delay_observer_) |
+ if (!send_side_delay_observer_ || capture_time_ms <= 0) |
stefan-webrtc
2016/01/18 19:48:25
Do you think it would be possible to instead use a
åsapersson
2016/04/06 14:52:37
Not sure if set in all codec wrappers, would need
|
return; |
uint32_t ssrc; |
@@ -1121,6 +1126,15 @@ void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) { |
ssrc); |
} |
+void RTPSender::UpdateOnSendPacket(int packet_id, |
+ int64_t capture_time_ms, |
+ uint32_t ssrc) { |
+ if (!send_packet_observer_ || capture_time_ms <= 0 || packet_id == -1) |
stefan-webrtc
2016/01/18 19:48:25
Same here about DCHECK. Should be able to DCHECK b
åsapersson
2016/04/06 14:52:37
packet_id could be -1 as it is now.
|
+ return; |
+ |
+ send_packet_observer_->OnSendPacket(packet_id, capture_time_ms, ssrc); |
+} |
+ |
void RTPSender::ProcessBitrate() { |
CriticalSectionScoped cs(send_critsect_.get()); |
total_bitrate_sent_.Process(); |
@@ -1611,7 +1625,8 @@ void RTPSender::UpdateAbsoluteSendTime(uint8_t* rtp_packet, |
ConvertMsTo24Bits(now_ms)); |
} |
-uint16_t RTPSender::UpdateTransportSequenceNumber( |
+bool RTPSender::UpdateTransportSequenceNumber( |
+ uint16_t sequence_number, |
uint8_t* rtp_packet, |
size_t rtp_packet_length, |
const RTPHeader& rtp_header) const { |
@@ -1622,19 +1637,18 @@ uint16_t RTPSender::UpdateTransportSequenceNumber( |
rtp_packet_length, rtp_header, |
kTransportSequenceNumberLength, &offset)) { |
case ExtensionStatus::kNotRegistered: |
- return 0; |
+ return false; |
case ExtensionStatus::kError: |
LOG(LS_WARNING) << "Failed to update transport sequence number"; |
- return 0; |
+ return false; |
case ExtensionStatus::kOk: |
break; |
default: |
RTC_NOTREACHED(); |
} |
- uint16_t seq = transport_sequence_number_allocator_->AllocateSequenceNumber(); |
- BuildTransportSequenceNumberExtension(rtp_packet + offset, seq); |
- return seq; |
+ BuildTransportSequenceNumberExtension(rtp_packet + offset, sequence_number); |
+ return true; |
} |
void RTPSender::SetSendingStatus(bool enabled) { |