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

Unified Diff: webrtc/modules/rtp_rtcp/source/rtp_sender.cc

Issue 1478253002: Add histogram stats for send delay for a sent video stream. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years 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 side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698