Revert of Remove audio/video distinction for probe packets. (patchset #2 id:20001 of https://codereview.webrtc.org/2061193002/ )
Reason for revert:
Revert this because it broke the google3 import build.
http://webrtc-buildbot-master.mtv.corp.google.com:21000/builders/WebRTC%20google3%20Importer%20%28Shem%20TOT%29/builds/67/steps/blaze_regular_tests/logs/stdio
Original issue's description:
> Remove audio/video distinction for probe packets.
>
> Allows detecting large-enough audio packets as part of a probe,
> speculative fix for a rampup-time regression in M50. These packets are
> accounted on the send side when probing.
>
> BUG=webrtc:5985
> R=mflodman@webrtc.org, philipel@webrtc.org
>
> Committed: https://crrev.com/a7d88d38448f6a5677a017562765ab505b89d468
> Cr-Commit-Position: refs/heads/master@{#13210}
TBR=mflodman@webrtc.org,philipel@webrtc.org,pbos@webrtc.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=webrtc:5985
Review-Url: https://codereview.webrtc.org/2086633002
Cr-Commit-Position: refs/heads/master@{#13221}
diff --git a/webrtc/audio/audio_receive_stream.cc b/webrtc/audio/audio_receive_stream.cc
index a684003..c933f78 100644
--- a/webrtc/audio/audio_receive_stream.cc
+++ b/webrtc/audio/audio_receive_stream.cc
@@ -254,7 +254,7 @@
arrival_time_ms = (packet_time.timestamp + 500) / 1000;
size_t payload_size = length - header.headerLength;
remote_bitrate_estimator_->IncomingPacket(arrival_time_ms, payload_size,
- header);
+ header, false);
}
return channel_proxy_->ReceivedRTPPacket(packet, length, packet_time);
diff --git a/webrtc/audio/audio_receive_stream_unittest.cc b/webrtc/audio/audio_receive_stream_unittest.cc
index aed1d1a..8e26dd9 100644
--- a/webrtc/audio/audio_receive_stream_unittest.cc
+++ b/webrtc/audio/audio_receive_stream_unittest.cc
@@ -279,7 +279,7 @@
EXPECT_CALL(*helper.remote_bitrate_estimator(),
IncomingPacket(packet_time.timestamp / 1000,
rtp_packet.size() - kExpectedHeaderLength,
- VerifyHeaderExtension(expected_extension)))
+ VerifyHeaderExtension(expected_extension), false))
.Times(1);
EXPECT_CALL(*helper.channel_proxy(),
ReceivedRTPPacket(&rtp_packet[0],
diff --git a/webrtc/modules/congestion_controller/congestion_controller.cc b/webrtc/modules/congestion_controller/congestion_controller.cc
index a585e33..593f4a5 100644
--- a/webrtc/modules/congestion_controller/congestion_controller.cc
+++ b/webrtc/modules/congestion_controller/congestion_controller.cc
@@ -48,10 +48,11 @@
void IncomingPacket(int64_t arrival_time_ms,
size_t payload_size,
- const RTPHeader& header) override {
+ const RTPHeader& header,
+ bool was_paced) override {
CriticalSectionScoped cs(crit_sect_.get());
PickEstimatorFromHeader(header);
- rbe_->IncomingPacket(arrival_time_ms, payload_size, header);
+ rbe_->IncomingPacket(arrival_time_ms, payload_size, header, was_paced);
}
void Process() override {
diff --git a/webrtc/modules/congestion_controller/delay_based_bwe.cc b/webrtc/modules/congestion_controller/delay_based_bwe.cc
index 3a9537e..27cbf01 100644
--- a/webrtc/modules/congestion_controller/delay_based_bwe.cc
+++ b/webrtc/modules/congestion_controller/delay_based_bwe.cc
@@ -198,14 +198,15 @@
for (const auto& packet_info : packet_feedback_vector) {
IncomingPacketInfo(packet_info.arrival_time_ms,
ConvertMsTo24Bits(packet_info.send_time_ms),
- packet_info.payload_size, 0,
+ packet_info.payload_size, 0, packet_info.was_paced,
packet_info.probe_cluster_id);
}
}
void DelayBasedBwe::IncomingPacket(int64_t arrival_time_ms,
size_t payload_size,
- const RTPHeader& header) {
+ const RTPHeader& header,
+ bool was_paced) {
RTC_DCHECK(network_thread_.CalledOnValidThread());
if (!header.extension.hasAbsoluteSendTime) {
// NOTE! The BitrateEstimatorTest relies on this EXACT log line.
@@ -214,12 +215,14 @@
return;
}
IncomingPacketInfo(arrival_time_ms, header.extension.absoluteSendTime,
- payload_size, header.ssrc, PacketInfo::kNotAProbe);
+ payload_size, header.ssrc, was_paced,
+ PacketInfo::kNotAProbe);
}
void DelayBasedBwe::IncomingPacket(int64_t arrival_time_ms,
size_t payload_size,
const RTPHeader& header,
+ bool was_paced,
int probe_cluster_id) {
RTC_DCHECK(network_thread_.CalledOnValidThread());
if (!header.extension.hasAbsoluteSendTime) {
@@ -229,13 +232,14 @@
return;
}
IncomingPacketInfo(arrival_time_ms, header.extension.absoluteSendTime,
- payload_size, header.ssrc, probe_cluster_id);
+ payload_size, header.ssrc, was_paced, probe_cluster_id);
}
void DelayBasedBwe::IncomingPacketInfo(int64_t arrival_time_ms,
uint32_t send_time_24bits,
size_t payload_size,
uint32_t ssrc,
+ bool was_paced,
int probe_cluster_id) {
assert(send_time_24bits < (1ul << 24));
// Shift up send time to use the full 32 bits that inter_arrival works with,
diff --git a/webrtc/modules/congestion_controller/delay_based_bwe.h b/webrtc/modules/congestion_controller/delay_based_bwe.h
index 56214de..05fbbd8 100644
--- a/webrtc/modules/congestion_controller/delay_based_bwe.h
+++ b/webrtc/modules/congestion_controller/delay_based_bwe.h
@@ -40,11 +40,13 @@
void IncomingPacket(int64_t arrival_time_ms,
size_t payload_size,
- const RTPHeader& header) override;
+ const RTPHeader& header,
+ bool was_paced) override;
void IncomingPacket(int64_t arrival_time_ms,
size_t payload_size,
const RTPHeader& header,
+ bool was_paced,
int probe_cluster_id);
// This class relies on Process() being called periodically (at least once
@@ -110,6 +112,7 @@
uint32_t send_time_24bits,
size_t payload_size,
uint32_t ssrc,
+ bool was_paced,
int probe_cluster_id);
void ComputeClusters(std::list<Cluster>* clusters) const;
diff --git a/webrtc/modules/congestion_controller/delay_based_bwe_unittest.cc b/webrtc/modules/congestion_controller/delay_based_bwe_unittest.cc
index a78dd7f..7efd29f 100644
--- a/webrtc/modules/congestion_controller/delay_based_bwe_unittest.cc
+++ b/webrtc/modules/congestion_controller/delay_based_bwe_unittest.cc
@@ -33,6 +33,7 @@
int64_t arrival_time,
uint32_t rtp_timestamp,
uint32_t absolute_send_time,
+ bool was_paced,
int probe_cluster_id) {
RTPHeader header;
memset(&header, 0, sizeof(header));
@@ -41,7 +42,7 @@
header.extension.hasAbsoluteSendTime = true;
header.extension.absoluteSendTime = absolute_send_time;
bwe_.IncomingPacket(arrival_time + kArrivalTimeClockOffsetMs, payload_size,
- header, probe_cluster_id);
+ header, was_paced, probe_cluster_id);
}
void OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,
@@ -73,7 +74,8 @@
for (int i = 0; i < kNumProbes; ++i) {
clock_.AdvanceTimeMilliseconds(10);
now_ms = clock_.TimeInMilliseconds();
- IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000), 0);
+ IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000),
+ true, 0);
}
EXPECT_TRUE(bitrate_updated());
@@ -81,7 +83,8 @@
for (int i = 0; i < kNumProbes; ++i) {
clock_.AdvanceTimeMilliseconds(5);
now_ms = clock_.TimeInMilliseconds();
- IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000), 1);
+ IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000),
+ true, 1);
}
EXPECT_TRUE(bitrate_updated());
@@ -95,11 +98,12 @@
for (int i = 0; i < kNumProbes; ++i) {
clock_.AdvanceTimeMilliseconds(5);
now_ms = clock_.TimeInMilliseconds();
- IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000), 0);
+ IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000),
+ true, 0);
// Non-paced packet, arriving 5 ms after.
clock_.AdvanceTimeMilliseconds(5);
IncomingPacket(0, PacedSender::kMinProbePacketSize + 1, now_ms, 90 * now_ms,
- AbsSendTime(now_ms, 1000), PacketInfo::kNotAProbe);
+ AbsSendTime(now_ms, 1000), false, PacketInfo::kNotAProbe);
}
EXPECT_TRUE(bitrate_updated());
@@ -117,7 +121,7 @@
now_ms = clock_.TimeInMilliseconds();
send_time_ms += 10;
IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
- AbsSendTime(send_time_ms, 1000), 0);
+ AbsSendTime(send_time_ms, 1000), true, 0);
}
// Second burst sent at 8 * 1000 / 5 = 1600 kbps, arriving at 8 * 1000 / 8 =
@@ -127,7 +131,7 @@
now_ms = clock_.TimeInMilliseconds();
send_time_ms += 5;
IncomingPacket(0, 1000, now_ms, send_time_ms,
- AbsSendTime(send_time_ms, 1000), 1);
+ AbsSendTime(send_time_ms, 1000), true, 1);
}
EXPECT_TRUE(bitrate_updated());
@@ -144,7 +148,7 @@
send_time_ms += 10;
now_ms = clock_.TimeInMilliseconds();
IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
- AbsSendTime(send_time_ms, 1000), 23);
+ AbsSendTime(send_time_ms, 1000), true, 23);
}
EXPECT_TRUE(bitrate_updated());
@@ -161,7 +165,7 @@
send_time_ms += 10;
now_ms = clock_.TimeInMilliseconds();
IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
- AbsSendTime(send_time_ms, 1000), 0);
+ AbsSendTime(send_time_ms, 1000), true, 0);
}
EXPECT_FALSE(bitrate_updated());
@@ -177,7 +181,7 @@
send_time_ms += 5;
now_ms = clock_.TimeInMilliseconds();
IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
- AbsSendTime(send_time_ms, 1000), 1);
+ AbsSendTime(send_time_ms, 1000), true, 1);
}
EXPECT_TRUE(bitrate_updated());
@@ -194,7 +198,7 @@
send_time_ms += 1;
now_ms = clock_.TimeInMilliseconds();
IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
- AbsSendTime(send_time_ms, 1000), 1);
+ AbsSendTime(send_time_ms, 1000), true, 1);
}
EXPECT_TRUE(bitrate_updated());
@@ -209,7 +213,7 @@
clock_.AdvanceTimeMilliseconds(10);
now_ms = clock_.TimeInMilliseconds();
IncomingPacket(0, PacedSender::kMinProbePacketSize, now_ms, 90 * now_ms,
- AbsSendTime(now_ms, 1000), 1);
+ AbsSendTime(now_ms, 1000), true, 1);
}
EXPECT_FALSE(bitrate_updated());
@@ -219,7 +223,8 @@
for (int i = 0; i < kNumProbes; ++i) {
clock_.AdvanceTimeMilliseconds(10);
now_ms = clock_.TimeInMilliseconds();
- IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000), 1);
+ IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000),
+ true, 1);
}
// Wait long enough so that we can call Process again.
diff --git a/webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitrate_estimator.h b/webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitrate_estimator.h
index 6177303..2c35df8 100644
--- a/webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitrate_estimator.h
+++ b/webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitrate_estimator.h
@@ -28,7 +28,7 @@
public:
MOCK_METHOD1(IncomingPacketFeedbackVector,
void(const std::vector<PacketInfo>&));
- MOCK_METHOD3(IncomingPacket, void(int64_t, size_t, const RTPHeader&));
+ MOCK_METHOD4(IncomingPacket, void(int64_t, size_t, const RTPHeader&, bool));
MOCK_METHOD1(RemoveStream, void(uint32_t));
MOCK_CONST_METHOD2(LatestEstimate, bool(std::vector<uint32_t>*, uint32_t*));
diff --git a/webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h b/webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h
index d7d8d2c..e56c273 100644
--- a/webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h
+++ b/webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h
@@ -58,7 +58,8 @@
// Note that |arrival_time_ms| can be of an arbitrary time base.
virtual void IncomingPacket(int64_t arrival_time_ms,
size_t payload_size,
- const RTPHeader& header) = 0;
+ const RTPHeader& header,
+ bool was_paced) = 0;
// Removes all data for |ssrc|.
virtual void RemoveStream(uint32_t ssrc) = 0;
diff --git a/webrtc/modules/remote_bitrate_estimator/include/send_time_history.h b/webrtc/modules/remote_bitrate_estimator/include/send_time_history.h
index f59790b..a50faf6 100644
--- a/webrtc/modules/remote_bitrate_estimator/include/send_time_history.h
+++ b/webrtc/modules/remote_bitrate_estimator/include/send_time_history.h
@@ -26,6 +26,7 @@
void AddAndRemoveOld(uint16_t sequence_number,
size_t length,
+ bool was_paced,
int probe_cluster_id);
bool OnSentPacket(uint16_t sequence_number, int64_t timestamp);
// Look up PacketInfo for a sent packet, based on the sequence number, and
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc
index 21c54d1..21006b5 100644
--- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc
+++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc
@@ -211,14 +211,14 @@
for (const auto& packet_info : packet_feedback_vector) {
IncomingPacketInfo(packet_info.arrival_time_ms,
ConvertMsTo24Bits(packet_info.send_time_ms),
- packet_info.payload_size, 0);
+ packet_info.payload_size, 0, packet_info.was_paced);
}
}
-void RemoteBitrateEstimatorAbsSendTime::IncomingPacket(
- int64_t arrival_time_ms,
- size_t payload_size,
- const RTPHeader& header) {
+void RemoteBitrateEstimatorAbsSendTime::IncomingPacket(int64_t arrival_time_ms,
+ size_t payload_size,
+ const RTPHeader& header,
+ bool was_paced) {
RTC_DCHECK(network_thread_.CalledOnValidThread());
if (!header.extension.hasAbsoluteSendTime) {
LOG(LS_WARNING) << "RemoteBitrateEstimatorAbsSendTimeImpl: Incoming packet "
@@ -226,14 +226,15 @@
return;
}
IncomingPacketInfo(arrival_time_ms, header.extension.absoluteSendTime,
- payload_size, header.ssrc);
+ payload_size, header.ssrc, was_paced);
}
void RemoteBitrateEstimatorAbsSendTime::IncomingPacketInfo(
int64_t arrival_time_ms,
uint32_t send_time_24bits,
size_t payload_size,
- uint32_t ssrc) {
+ uint32_t ssrc,
+ bool was_paced) {
assert(send_time_24bits < (1ul << 24));
// Shift up send time to use the full 32 bits that inter_arrival works with,
// so wrapping works properly.
@@ -263,6 +264,10 @@
uint32_t ts_delta = 0;
int64_t t_delta = 0;
int size_delta = 0;
+ // For now only try to detect probes while we don't have a valid estimate, and
+ // make sure the packet was paced. We currently assume that only packets
+ // larger than 200 bytes are paced by the sender.
+ was_paced = was_paced && payload_size > PacedSender::kMinProbePacketSize;
bool update_estimate = false;
uint32_t target_bitrate_bps = 0;
std::vector<uint32_t> ssrcs;
@@ -274,10 +279,7 @@
RTC_DCHECK(estimator_.get());
ssrcs_[ssrc] = now_ms;
- // For now only try to detect probes while we don't have a valid estimate.
- // We currently assume that only packets larger than 200 bytes are paced by
- // the sender.
- if (payload_size > PacedSender::kMinProbePacketSize &&
+ if (was_paced &&
(!remote_rate_.ValidEstimate() ||
now_ms - first_packet_time_ms_ < kInitialProbingIntervalMs)) {
// TODO(holmer): Use a map instead to get correct order?
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h
index a1274d6..e84c749 100644
--- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h
+++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h
@@ -76,7 +76,8 @@
void IncomingPacket(int64_t arrival_time_ms,
size_t payload_size,
- const RTPHeader& header) override;
+ const RTPHeader& header,
+ bool was_paced) override;
// This class relies on Process() being called periodically (at least once
// every other second) for streams to be timed out properly. Therefore it
// shouldn't be detached from the ProcessThread except if it's about to be
@@ -101,7 +102,8 @@
void IncomingPacketInfo(int64_t arrival_time_ms,
uint32_t send_time_24bits,
size_t payload_size,
- uint32_t ssrc);
+ uint32_t ssrc,
+ bool was_paced);
void ComputeClusters(std::list<Cluster>* clusters) const;
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc
index 611a18d..6f8696a 100644
--- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc
+++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc
@@ -90,7 +90,7 @@
// RemoteBitrateEstimator.
const int64_t kStreamTimeOutMs = 2000;
const int64_t kProcessIntervalMs = 1000;
- IncomingPacket(0, 1000, clock_.TimeInMilliseconds(), 0, 0);
+ IncomingPacket(0, 1000, clock_.TimeInMilliseconds(), 0, 0, true);
clock_.AdvanceTimeMilliseconds(kStreamTimeOutMs + 1);
// Trigger timeout.
bitrate_estimator_->Process();
@@ -106,14 +106,16 @@
for (int i = 0; i < kProbeLength; ++i) {
clock_.AdvanceTimeMilliseconds(10);
now_ms = clock_.TimeInMilliseconds();
- IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000));
+ IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000),
+ true);
}
// Second burst sent at 8 * 1000 / 5 = 1600 kbps.
for (int i = 0; i < kProbeLength; ++i) {
clock_.AdvanceTimeMilliseconds(5);
now_ms = clock_.TimeInMilliseconds();
- IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000));
+ IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000),
+ true);
}
bitrate_estimator_->Process();
@@ -130,10 +132,12 @@
for (int i = 0; i < kProbeLength; ++i) {
clock_.AdvanceTimeMilliseconds(5);
now_ms = clock_.TimeInMilliseconds();
- IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000));
+ IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000),
+ true);
// Non-paced packet, arriving 5 ms after.
clock_.AdvanceTimeMilliseconds(5);
- IncomingPacket(0, 100, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000));
+ IncomingPacket(0, 100, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000),
+ false);
}
bitrate_estimator_->Process();
@@ -154,7 +158,7 @@
now_ms = clock_.TimeInMilliseconds();
send_time_ms += 10;
IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
- AbsSendTime(send_time_ms, 1000));
+ AbsSendTime(send_time_ms, 1000), true);
}
// Second burst sent at 8 * 1000 / 5 = 1600 kbps, arriving at 8 * 1000 / 8 =
@@ -164,7 +168,7 @@
now_ms = clock_.TimeInMilliseconds();
send_time_ms += 5;
IncomingPacket(0, 1000, now_ms, send_time_ms,
- AbsSendTime(send_time_ms, 1000));
+ AbsSendTime(send_time_ms, 1000), true);
}
bitrate_estimator_->Process();
@@ -184,7 +188,7 @@
send_time_ms += 10;
now_ms = clock_.TimeInMilliseconds();
IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
- AbsSendTime(send_time_ms, 1000));
+ AbsSendTime(send_time_ms, 1000), true);
}
bitrate_estimator_->Process();
@@ -203,7 +207,7 @@
send_time_ms += 10;
now_ms = clock_.TimeInMilliseconds();
IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
- AbsSendTime(send_time_ms, 1000));
+ AbsSendTime(send_time_ms, 1000), true);
}
bitrate_estimator_->Process();
@@ -221,7 +225,7 @@
send_time_ms += 5;
now_ms = clock_.TimeInMilliseconds();
IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
- AbsSendTime(send_time_ms, 1000));
+ AbsSendTime(send_time_ms, 1000), true);
}
bitrate_estimator_->Process();
@@ -241,7 +245,7 @@
send_time_ms += 1;
now_ms = clock_.TimeInMilliseconds();
IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
- AbsSendTime(send_time_ms, 1000));
+ AbsSendTime(send_time_ms, 1000), true);
}
bitrate_estimator_->Process();
@@ -257,7 +261,8 @@
for (int i = 0; i < kProbeLength; ++i) {
clock_.AdvanceTimeMilliseconds(10);
now_ms = clock_.TimeInMilliseconds();
- IncomingPacket(0, 200, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000));
+ IncomingPacket(0, 200, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000),
+ true);
}
bitrate_estimator_->Process();
@@ -268,7 +273,8 @@
for (int i = 0; i < kProbeLength; ++i) {
clock_.AdvanceTimeMilliseconds(10);
now_ms = clock_.TimeInMilliseconds();
- IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000));
+ IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000),
+ true);
}
// Wait long enough so that we can call Process again.
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc
index 182cbf9..d391f03 100644
--- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc
+++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc
@@ -67,10 +67,10 @@
}
}
-void RemoteBitrateEstimatorSingleStream::IncomingPacket(
- int64_t arrival_time_ms,
- size_t payload_size,
- const RTPHeader& header) {
+void RemoteBitrateEstimatorSingleStream::IncomingPacket(int64_t arrival_time_ms,
+ size_t payload_size,
+ const RTPHeader& header,
+ bool was_paced) {
uint32_t ssrc = header.ssrc;
uint32_t rtp_timestamp = header.timestamp +
header.extension.transmissionTimeOffset;
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h
index ff17c61..244dd42 100644
--- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h
+++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h
@@ -31,7 +31,8 @@
void IncomingPacket(int64_t arrival_time_ms,
size_t payload_size,
- const RTPHeader& header) override;
+ const RTPHeader& header,
+ bool was_paced) override;
void Process() override;
int64_t TimeUntilNextProcess() override;
void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override;
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc
index f958809..3cff498 100644
--- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc
+++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc
@@ -224,7 +224,8 @@
size_t payload_size,
int64_t arrival_time,
uint32_t rtp_timestamp,
- uint32_t absolute_send_time) {
+ uint32_t absolute_send_time,
+ bool was_paced) {
RTPHeader header;
memset(&header, 0, sizeof(header));
header.ssrc = ssrc;
@@ -232,7 +233,7 @@
header.extension.hasAbsoluteSendTime = true;
header.extension.absoluteSendTime = absolute_send_time;
bitrate_estimator_->IncomingPacket(arrival_time + kArrivalTimeClockOffsetMs,
- payload_size, header);
+ payload_size, header, was_paced);
}
// Generates a frame of packets belonging to a stream at a given bitrate and
@@ -257,7 +258,7 @@
clock_.TimeInMicroseconds());
IncomingPacket(packet->ssrc, packet->size,
(packet->arrival_time + 500) / 1000, packet->rtp_timestamp,
- AbsSendTime(packet->send_time, 1000000));
+ AbsSendTime(packet->send_time, 1000000), true);
if (bitrate_observer_->updated()) {
if (bitrate_observer_->latest_bitrate() < bitrate_bps)
overuse = true;
@@ -330,7 +331,7 @@
}
IncomingPacket(kDefaultSsrc, kMtu, clock_.TimeInMilliseconds(), timestamp,
- absolute_send_time);
+ absolute_send_time, true);
clock_.AdvanceTimeMilliseconds(1000 / kFramerate);
timestamp += 90 * kFrameIntervalMs;
absolute_send_time = AddAbsSendTime(absolute_send_time,
@@ -368,7 +369,7 @@
}
IncomingPacket(kDefaultSsrc, kMtu, clock_.TimeInMilliseconds(), timestamp,
- absolute_send_time);
+ absolute_send_time, true);
clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
timestamp += 90 * kFrameIntervalMs;
absolute_send_time = AddAbsSendTime(absolute_send_time,
@@ -385,12 +386,12 @@
absolute_send_time = AddAbsSendTime(absolute_send_time,
2 * kFrameIntervalAbsSendTime);
IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp,
- absolute_send_time);
- IncomingPacket(
- kDefaultSsrc, 1000, clock_.TimeInMilliseconds(),
- timestamp - 90 * kFrameIntervalMs,
- AddAbsSendTime(absolute_send_time,
- -static_cast<int>(kFrameIntervalAbsSendTime)));
+ absolute_send_time, true);
+ IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(),
+ timestamp - 90 * kFrameIntervalMs,
+ AddAbsSendTime(absolute_send_time,
+ -static_cast<int>(kFrameIntervalAbsSendTime)),
+ true);
}
bitrate_estimator_->Process();
EXPECT_TRUE(bitrate_observer_->updated());
@@ -523,7 +524,7 @@
// time for the first estimate to be generated and for Process() to be called.
for (int i = 0; i <= 6 * kFramerate; ++i) {
IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp,
- absolute_send_time);
+ absolute_send_time, true);
bitrate_estimator_->Process();
clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
timestamp += 90 * kFrameIntervalMs;
@@ -544,7 +545,7 @@
// Insert |kTimestampGroupLength| frames with just 1 timestamp ticks in
// between. Should be treated as part of the same group by the estimator.
IncomingPacket(kDefaultSsrc, 100, clock_.TimeInMilliseconds(), timestamp,
- absolute_send_time);
+ absolute_send_time, true);
clock_.AdvanceTimeMilliseconds(kFrameIntervalMs / kTimestampGroupLength);
timestamp += 1;
absolute_send_time = AddAbsSendTime(absolute_send_time,
@@ -574,7 +575,7 @@
for (size_t i = 0; i < 3000; ++i) {
IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp,
- absolute_send_time);
+ absolute_send_time, true);
timestamp += kFrameIntervalMs;
clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
absolute_send_time = AddAbsSendTime(absolute_send_time,
@@ -591,7 +592,7 @@
bitrate_estimator_->Process();
for (size_t i = 0; i < 21; ++i) {
IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp,
- absolute_send_time);
+ absolute_send_time, true);
timestamp += kFrameIntervalMs;
clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs);
absolute_send_time = AddAbsSendTime(absolute_send_time,
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h
index b4bff67..12ac9e8 100644
--- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h
+++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h
@@ -173,7 +173,8 @@
size_t payload_size,
int64_t arrival_time,
uint32_t rtp_timestamp,
- uint32_t absolute_send_time);
+ uint32_t absolute_send_time,
+ bool was_paced);
// Generates a frame of packets belonging to a stream at a given bitrate and
// with a given ssrc. The stream is pushed through a very simple simulated
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.cc b/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.cc
index 2172bce..eace9fc 100644
--- a/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.cc
+++ b/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.cc
@@ -43,7 +43,8 @@
void RemoteEstimatorProxy::IncomingPacket(int64_t arrival_time_ms,
size_t payload_size,
- const RTPHeader& header) {
+ const RTPHeader& header,
+ bool was_paced) {
if (!header.extension.hasTransportSequenceNumber) {
LOG(LS_WARNING) << "RemoteEstimatorProxy: Incoming packet "
"is missing the transport sequence number extension!";
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.h b/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.h
index 66373e2..93d5244 100644
--- a/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.h
+++ b/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.h
@@ -39,7 +39,8 @@
const std::vector<PacketInfo>& packet_feedback_vector) override;
void IncomingPacket(int64_t arrival_time_ms,
size_t payload_size,
- const RTPHeader& header) override;
+ const RTPHeader& header,
+ bool was_paced) override;
void RemoveStream(uint32_t ssrc) override {}
bool LatestEstimate(std::vector<unsigned int>* ssrcs,
unsigned int* bitrate_bps) const override;
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc b/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc
index a1264b2..3c3c729 100644
--- a/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc
+++ b/webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc
@@ -37,7 +37,7 @@
header.extension.hasTransportSequenceNumber = true;
header.extension.transportSequenceNumber = seq;
header.ssrc = kMediaSsrc;
- proxy_.IncomingPacket(time_ms, kDefaultPacketSize, header);
+ proxy_.IncomingPacket(time_ms, kDefaultPacketSize, header, true);
}
void Process() {
diff --git a/webrtc/modules/remote_bitrate_estimator/send_time_history.cc b/webrtc/modules/remote_bitrate_estimator/send_time_history.cc
index 2784df6..674028e 100644
--- a/webrtc/modules/remote_bitrate_estimator/send_time_history.cc
+++ b/webrtc/modules/remote_bitrate_estimator/send_time_history.cc
@@ -28,6 +28,7 @@
void SendTimeHistory::AddAndRemoveOld(uint16_t sequence_number,
size_t length,
+ bool was_paced,
int probe_cluster_id) {
EraseOld();
@@ -35,8 +36,9 @@
oldest_sequence_number_ = sequence_number;
history_.insert(std::pair<uint16_t, PacketInfo>(
- sequence_number, PacketInfo(clock_->TimeInMilliseconds(), 0, -1,
- sequence_number, length, probe_cluster_id)));
+ sequence_number,
+ PacketInfo(clock_->TimeInMilliseconds(), 0, -1, sequence_number, length,
+ was_paced, probe_cluster_id)));
}
bool SendTimeHistory::OnSentPacket(uint16_t sequence_number,
diff --git a/webrtc/modules/remote_bitrate_estimator/send_time_history_unittest.cc b/webrtc/modules/remote_bitrate_estimator/send_time_history_unittest.cc
index b181a3d..227391a 100644
--- a/webrtc/modules/remote_bitrate_estimator/send_time_history_unittest.cc
+++ b/webrtc/modules/remote_bitrate_estimator/send_time_history_unittest.cc
@@ -33,9 +33,11 @@
void AddPacketWithSendTime(uint16_t sequence_number,
size_t length,
+ bool was_paced,
int64_t send_time_ms,
int probe_cluster_id) {
- history_.AddAndRemoveOld(sequence_number, length, probe_cluster_id);
+ history_.AddAndRemoveOld(sequence_number, length, was_paced,
+ probe_cluster_id);
history_.OnSentPacket(sequence_number, send_time_ms);
}
@@ -46,28 +48,39 @@
// Help class extended so we can do EXPECT_EQ and collections.
class PacketInfo : public webrtc::PacketInfo {
public:
+ PacketInfo()
+ : webrtc::PacketInfo(-1,
+ 0,
+ 0,
+ 0,
+ 0,
+ false,
+ webrtc::PacketInfo::kNotAProbe) {}
PacketInfo(int64_t arrival_time_ms, uint16_t sequence_number)
: PacketInfo(arrival_time_ms,
0,
sequence_number,
0,
+ false,
PacketInfo::kNotAProbe) {}
PacketInfo(int64_t arrival_time_ms,
int64_t send_time_ms,
uint16_t sequence_number,
size_t payload_size,
+ bool was_paced,
int probe_cluster_id)
: webrtc::PacketInfo(-1,
arrival_time_ms,
send_time_ms,
sequence_number,
payload_size,
+ was_paced,
probe_cluster_id) {}
bool operator==(const PacketInfo& other) const {
return arrival_time_ms == other.arrival_time_ms &&
send_time_ms == other.send_time_ms &&
sequence_number == other.sequence_number &&
- payload_size == other.payload_size &&
+ payload_size == other.payload_size && was_paced == other.was_paced &&
probe_cluster_id == other.probe_cluster_id;
}
};
@@ -75,18 +88,18 @@
TEST_F(SendTimeHistoryTest, AddRemoveOne) {
const uint16_t kSeqNo = 10;
const int kProbeClusterId = 0;
- const PacketInfo kSentPacket(0, 1, kSeqNo, 1, kProbeClusterId);
- AddPacketWithSendTime(kSeqNo, 1, 1, kProbeClusterId);
+ const PacketInfo kSentPacket(0, 1, kSeqNo, 1, true, kProbeClusterId);
+ AddPacketWithSendTime(kSeqNo, 1, true, 1, kProbeClusterId);
- PacketInfo received_packet(0, 0, kSeqNo, 0, kProbeClusterId);
+ PacketInfo received_packet(0, 0, kSeqNo, 0, false, kProbeClusterId);
EXPECT_TRUE(history_.GetInfo(&received_packet, false));
EXPECT_EQ(kSentPacket, received_packet);
- PacketInfo received_packet2(0, 0, kSeqNo, 0, kProbeClusterId);
+ PacketInfo received_packet2(0, 0, kSeqNo, 0, false, kProbeClusterId);
EXPECT_TRUE(history_.GetInfo(&received_packet2, true));
EXPECT_EQ(kSentPacket, received_packet2);
- PacketInfo received_packet3(0, 0, kSeqNo, 0, kProbeClusterId);
+ PacketInfo received_packet3(0, 0, kSeqNo, 0, false, kProbeClusterId);
EXPECT_FALSE(history_.GetInfo(&received_packet3, true));
}
@@ -95,8 +108,9 @@
const int64_t kSendTime = 1000;
const int64_t kReceiveTime = 2000;
const size_t kPayloadSize = 42;
+ const bool kPaced = true;
- AddPacketWithSendTime(kSeqNo, kPayloadSize, kSendTime,
+ AddPacketWithSendTime(kSeqNo, kPayloadSize, kPaced, kSendTime,
PacketInfo::kNotAProbe);
PacketInfo info(kReceiveTime, kSeqNo);
@@ -105,6 +119,7 @@
EXPECT_EQ(kSendTime, info.send_time_ms);
EXPECT_EQ(kSeqNo, info.sequence_number);
EXPECT_EQ(kPayloadSize, info.payload_size);
+ EXPECT_EQ(kPaced, info.was_paced);
}
TEST_F(SendTimeHistoryTest, AddThenRemoveOutOfOrder) {
@@ -113,19 +128,20 @@
const size_t num_items = 100;
const size_t kPacketSize = 400;
const size_t kTransmissionTime = 1234;
+ const bool kPaced = true;
const int kProbeClusterId = 1;
for (size_t i = 0; i < num_items; ++i) {
sent_packets.push_back(PacketInfo(0, static_cast<int64_t>(i),
static_cast<uint16_t>(i), kPacketSize,
- kProbeClusterId));
+ kPaced, kProbeClusterId));
received_packets.push_back(PacketInfo(
static_cast<int64_t>(i) + kTransmissionTime, 0,
- static_cast<uint16_t>(i), kPacketSize, PacketInfo::kNotAProbe));
+ static_cast<uint16_t>(i), kPacketSize, false, PacketInfo::kNotAProbe));
}
for (size_t i = 0; i < num_items; ++i) {
- history_.AddAndRemoveOld(sent_packets[i].sequence_number,
- sent_packets[i].payload_size,
- sent_packets[i].probe_cluster_id);
+ history_.AddAndRemoveOld(
+ sent_packets[i].sequence_number, sent_packets[i].payload_size,
+ sent_packets[i].was_paced, sent_packets[i].probe_cluster_id);
}
for (size_t i = 0; i < num_items; ++i)
history_.OnSentPacket(sent_packets[i].sequence_number,
@@ -147,19 +163,21 @@
const int kItems = kDefaultHistoryLengthMs / 100;
for (int i = 0; i < kItems; ++i) {
clock_.AdvanceTimeMilliseconds(100);
- AddPacketWithSendTime(i, 0, i * 100, PacketInfo::kNotAProbe);
+ AddPacketWithSendTime(i, 0, false, i * 100, PacketInfo::kNotAProbe);
}
for (int i = 0; i < kItems; ++i) {
- PacketInfo info(0, 0, static_cast<uint16_t>(i), 0, PacketInfo::kNotAProbe);
+ PacketInfo info(0, 0, static_cast<uint16_t>(i), 0, false,
+ PacketInfo::kNotAProbe);
EXPECT_TRUE(history_.GetInfo(&info, false));
EXPECT_EQ(i * 100, info.send_time_ms);
}
clock_.AdvanceTimeMilliseconds(101);
- AddPacketWithSendTime(kItems, 0, kItems * 101, PacketInfo::kNotAProbe);
- PacketInfo info(0, 0, 0, 0, PacketInfo::kNotAProbe);
+ AddPacketWithSendTime(kItems, 0, false, kItems * 101, PacketInfo::kNotAProbe);
+ PacketInfo info(0, 0, 0, 0, false, PacketInfo::kNotAProbe);
EXPECT_FALSE(history_.GetInfo(&info, false));
for (int i = 1; i < (kItems + 1); ++i) {
- PacketInfo info2(0, 0, static_cast<uint16_t>(i), 0, PacketInfo::kNotAProbe);
+ PacketInfo info2(0, 0, static_cast<uint16_t>(i), 0, false,
+ PacketInfo::kNotAProbe);
EXPECT_TRUE(history_.GetInfo(&info2, false));
int64_t expected_time_ms = (i == kItems) ? i * 101 : i * 100;
EXPECT_EQ(expected_time_ms, info2.send_time_ms);
@@ -168,16 +186,17 @@
TEST_F(SendTimeHistoryTest, HistorySizeWithWraparound) {
const uint16_t kMaxSeqNo = std::numeric_limits<uint16_t>::max();
- AddPacketWithSendTime(kMaxSeqNo - 2, 0, 0, PacketInfo::kNotAProbe);
+ AddPacketWithSendTime(kMaxSeqNo - 2, 0, false, 0, PacketInfo::kNotAProbe);
clock_.AdvanceTimeMilliseconds(100);
- AddPacketWithSendTime(kMaxSeqNo - 1, 1, 100, PacketInfo::kNotAProbe);
+ AddPacketWithSendTime(kMaxSeqNo - 1, 1, false, 100, PacketInfo::kNotAProbe);
clock_.AdvanceTimeMilliseconds(100);
- AddPacketWithSendTime(kMaxSeqNo, 0, 200, PacketInfo::kNotAProbe);
+ AddPacketWithSendTime(kMaxSeqNo, 0, false, 200, PacketInfo::kNotAProbe);
clock_.AdvanceTimeMilliseconds(kDefaultHistoryLengthMs - 200 + 1);
- AddPacketWithSendTime(0, 0, kDefaultHistoryLengthMs, PacketInfo::kNotAProbe);
+ AddPacketWithSendTime(0, 0, false, kDefaultHistoryLengthMs,
+ PacketInfo::kNotAProbe);
PacketInfo info(0, static_cast<uint16_t>(kMaxSeqNo - 2));
EXPECT_FALSE(history_.GetInfo(&info, false));
@@ -193,7 +212,7 @@
EXPECT_TRUE(history_.GetInfo(&info5, true));
clock_.AdvanceTimeMilliseconds(100);
- AddPacketWithSendTime(1, 0, 1100, PacketInfo::kNotAProbe);
+ AddPacketWithSendTime(1, 0, false, 1100, PacketInfo::kNotAProbe);
PacketInfo info6(0, static_cast<uint16_t>(kMaxSeqNo - 2));
EXPECT_FALSE(history_.GetInfo(&info6, false));
@@ -210,26 +229,26 @@
TEST_F(SendTimeHistoryTest, InterlievedGetAndRemove) {
const uint16_t kSeqNo = 1;
const int64_t kTimestamp = 2;
- PacketInfo packets[3] = {{0, kTimestamp, kSeqNo, 0, 0},
- {0, kTimestamp + 1, kSeqNo + 1, 0, 1},
- {0, kTimestamp + 2, kSeqNo + 2, 0, 2}};
+ PacketInfo packets[3] = {{0, kTimestamp, kSeqNo, 0, false, 0},
+ {0, kTimestamp + 1, kSeqNo + 1, 0, false, 1},
+ {0, kTimestamp + 2, kSeqNo + 2, 0, false, 2}};
AddPacketWithSendTime(packets[0].sequence_number, packets[0].payload_size,
- packets[0].send_time_ms, 0);
+ packets[0].was_paced, packets[0].send_time_ms, 0);
AddPacketWithSendTime(packets[1].sequence_number, packets[1].payload_size,
- packets[1].send_time_ms, 1);
- PacketInfo info(0, 0, packets[0].sequence_number, 0, 0);
+ packets[1].was_paced, packets[1].send_time_ms, 1);
+ PacketInfo info(0, 0, packets[0].sequence_number, 0, false, 0);
EXPECT_TRUE(history_.GetInfo(&info, true));
EXPECT_EQ(packets[0], info);
AddPacketWithSendTime(packets[2].sequence_number, packets[2].payload_size,
- packets[2].send_time_ms, 2);
+ packets[2].was_paced, packets[2].send_time_ms, 2);
- PacketInfo info2(0, 0, packets[1].sequence_number, 0, 1);
+ PacketInfo info2(0, 0, packets[1].sequence_number, 0, false, 1);
EXPECT_TRUE(history_.GetInfo(&info2, true));
EXPECT_EQ(packets[1], info2);
- PacketInfo info3(0, 0, packets[2].sequence_number, 0, 2);
+ PacketInfo info3(0, 0, packets[2].sequence_number, 0, false, 2);
EXPECT_TRUE(history_.GetInfo(&info3, true));
EXPECT_EQ(packets[2], info3);
}
diff --git a/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.cc b/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.cc
index a9fd617..e0736c8 100644
--- a/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.cc
+++ b/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.cc
@@ -99,14 +99,18 @@
creation_time_us_(-1),
send_time_us_(-1),
sender_timestamp_us_(-1),
- payload_size_(0) {}
+ payload_size_(0),
+ paced_(false) {
+}
Packet::Packet(int flow_id, int64_t send_time_us, size_t payload_size)
: flow_id_(flow_id),
creation_time_us_(send_time_us),
send_time_us_(send_time_us),
sender_timestamp_us_(send_time_us),
- payload_size_(payload_size) {}
+ payload_size_(payload_size),
+ paced_(false) {
+}
Packet::~Packet() {
}
diff --git a/webrtc/modules/remote_bitrate_estimator/test/estimators/remb.cc b/webrtc/modules/remote_bitrate_estimator/test/estimators/remb.cc
index e2d3da9..6f0c125 100644
--- a/webrtc/modules/remote_bitrate_estimator/test/estimators/remb.cc
+++ b/webrtc/modules/remote_bitrate_estimator/test/estimators/remb.cc
@@ -95,7 +95,7 @@
step_ms = std::max<int64_t>(estimator_->TimeUntilNextProcess(), 0);
}
estimator_->IncomingPacket(arrival_time_ms, media_packet.payload_size(),
- media_packet.header());
+ media_packet.header(), true);
clock_.AdvanceTimeMilliseconds(arrival_time_ms - clock_.TimeInMilliseconds());
ASSERT_TRUE(arrival_time_ms == clock_.TimeInMilliseconds());
diff --git a/webrtc/modules/remote_bitrate_estimator/test/estimators/send_side.cc b/webrtc/modules/remote_bitrate_estimator/test/estimators/send_side.cc
index 7a31b54..2fa60a1 100644
--- a/webrtc/modules/remote_bitrate_estimator/test/estimators/send_side.cc
+++ b/webrtc/modules/remote_bitrate_estimator/test/estimators/send_side.cc
@@ -99,9 +99,9 @@
MediaPacket* media_packet = static_cast<MediaPacket*>(packet);
// TODO(philipel): Add probe_cluster_id to Packet class in order
// to create tests for probing using cluster ids.
- send_time_history_.AddAndRemoveOld(media_packet->header().sequenceNumber,
- media_packet->payload_size(),
- PacketInfo::kNotAProbe);
+ send_time_history_.AddAndRemoveOld(
+ media_packet->header().sequenceNumber, media_packet->payload_size(),
+ packet->paced(), PacketInfo::kNotAProbe);
send_time_history_.OnSentPacket(media_packet->header().sequenceNumber,
media_packet->sender_timestamp_ms());
}
diff --git a/webrtc/modules/remote_bitrate_estimator/test/packet.h b/webrtc/modules/remote_bitrate_estimator/test/packet.h
index 9aa596c..4a361c4 100644
--- a/webrtc/modules/remote_bitrate_estimator/test/packet.h
+++ b/webrtc/modules/remote_bitrate_estimator/test/packet.h
@@ -42,6 +42,8 @@
virtual void set_sender_timestamp_us(int64_t sender_timestamp_us) {
sender_timestamp_us_ = sender_timestamp_us;
}
+ virtual void set_paced(bool paced) { paced_ = paced; }
+ virtual bool paced() const { return paced_; }
virtual int64_t creation_time_ms() const {
return (creation_time_us_ + 500) / 1000;
}
@@ -56,6 +58,7 @@
int64_t send_time_us_; // Time the packet left last processor touching it.
int64_t sender_timestamp_us_; // Time the packet left the Sender.
size_t payload_size_; // Size of the (non-existent, simulated) payload.
+ bool paced_; // True if sent through paced sender.
};
class MediaPacket : public Packet {
diff --git a/webrtc/modules/remote_bitrate_estimator/test/packet_sender.cc b/webrtc/modules/remote_bitrate_estimator/test/packet_sender.cc
index 06fbc6e..2f3c2d2 100644
--- a/webrtc/modules/remote_bitrate_estimator/test/packet_sender.cc
+++ b/webrtc/modules/remote_bitrate_estimator/test/packet_sender.cc
@@ -267,6 +267,8 @@
}
Packets to_transfer;
to_transfer.splice(to_transfer.begin(), queue_, queue_.begin(), it);
+ for (Packet* packet : to_transfer)
+ packet->set_paced(true);
bwe_->OnPacketsSent(to_transfer);
batch->merge(to_transfer, DereferencingComparator<Packet>);
}
diff --git a/webrtc/modules/remote_bitrate_estimator/tools/bwe_rtp_play.cc b/webrtc/modules/remote_bitrate_estimator/tools/bwe_rtp_play.cc
index f5dbaef..08dc0e6 100644
--- a/webrtc/modules/remote_bitrate_estimator/tools/bwe_rtp_play.cc
+++ b/webrtc/modules/remote_bitrate_estimator/tools/bwe_rtp_play.cc
@@ -83,7 +83,7 @@
packet_length = packet.original_length;
}
rbe->IncomingPacket(clock.TimeInMilliseconds(),
- packet_length - header.headerLength, header);
+ packet_length - header.headerLength, header, true);
++packet_counter;
}
if (!rtp_reader->NextPacket(&packet)) {
diff --git a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.cc b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.cc
index f691198..18e3c0c 100644
--- a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.cc
+++ b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.cc
@@ -59,9 +59,11 @@
void TransportFeedbackAdapter::AddPacket(uint16_t sequence_number,
size_t length,
+ bool was_paced,
int probe_cluster_id) {
rtc::CritScope cs(&lock_);
- send_time_history_.AddAndRemoveOld(sequence_number, length, probe_cluster_id);
+ send_time_history_.AddAndRemoveOld(sequence_number, length, was_paced,
+ probe_cluster_id);
}
void TransportFeedbackAdapter::OnSentPacket(uint16_t sequence_number,
diff --git a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h
index 3cde381..384a64f 100644
--- a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h
+++ b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h
@@ -40,6 +40,7 @@
// Implements TransportFeedbackObserver.
void AddPacket(uint16_t sequence_number,
size_t length,
+ bool was_paced,
int probe_cluster_id) override;
void OnSentPacket(uint16_t sequence_number, int64_t send_time_ms);
void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override;
diff --git a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter_unittest.cc b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter_unittest.cc
index f9ac8c9..1e99e51 100644
--- a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter_unittest.cc
+++ b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter_unittest.cc
@@ -92,6 +92,7 @@
EXPECT_EQ(truth[i].send_time_ms, input[i].send_time_ms);
EXPECT_EQ(truth[i].sequence_number, input[i].sequence_number);
EXPECT_EQ(truth[i].payload_size, input[i].payload_size);
+ EXPECT_EQ(truth[i].was_paced, input[i].was_paced);
EXPECT_EQ(truth[i].probe_cluster_id, input[i].probe_cluster_id);
}
}
@@ -99,7 +100,7 @@
// Utility method, to reset arrival_time_ms before adding send time.
void OnSentPacket(PacketInfo info) {
info.arrival_time_ms = 0;
- adapter_->AddPacket(info.sequence_number, info.payload_size,
+ adapter_->AddPacket(info.sequence_number, info.payload_size, info.was_paced,
info.probe_cluster_id);
adapter_->OnSentPacket(info.sequence_number, info.send_time_ms);
}
@@ -114,11 +115,11 @@
TEST_F(TransportFeedbackAdapterTest, AdaptsFeedbackAndPopulatesSendTimes) {
std::vector<PacketInfo> packets;
- packets.push_back(PacketInfo(100, 200, 0, 1500, 0));
- packets.push_back(PacketInfo(110, 210, 1, 1500, 0));
- packets.push_back(PacketInfo(120, 220, 2, 1500, 0));
- packets.push_back(PacketInfo(130, 230, 3, 1500, 1));
- packets.push_back(PacketInfo(140, 240, 4, 1500, 1));
+ packets.push_back(PacketInfo(100, 200, 0, 1500, true, 0));
+ packets.push_back(PacketInfo(110, 210, 1, 1500, true, 0));
+ packets.push_back(PacketInfo(120, 220, 2, 1500, true, 0));
+ packets.push_back(PacketInfo(130, 230, 3, 1500, true, 1));
+ packets.push_back(PacketInfo(140, 240, 4, 1500, true, 1));
for (const PacketInfo& packet : packets)
OnSentPacket(packet);
@@ -145,11 +146,11 @@
TEST_F(TransportFeedbackAdapterTest, HandlesDroppedPackets) {
std::vector<PacketInfo> packets;
- packets.push_back(PacketInfo(100, 200, 0, 1500, 1));
- packets.push_back(PacketInfo(110, 210, 1, 1500, 2));
- packets.push_back(PacketInfo(120, 220, 2, 1500, 3));
- packets.push_back(PacketInfo(130, 230, 3, 1500, 4));
- packets.push_back(PacketInfo(140, 240, 4, 1500, 5));
+ packets.push_back(PacketInfo(100, 200, 0, 1500, true, 1));
+ packets.push_back(PacketInfo(110, 210, 1, 1500, true, 2));
+ packets.push_back(PacketInfo(120, 220, 2, 1500, true, 3));
+ packets.push_back(PacketInfo(130, 230, 3, 1500, true, 4));
+ packets.push_back(PacketInfo(140, 240, 4, 1500, true, 5));
const uint16_t kSendSideDropBefore = 1;
const uint16_t kReceiveSideDropAfter = 3;
@@ -190,12 +191,12 @@
static_cast<int64_t>(1 << 8) *
static_cast<int64_t>((1 << 23) - 1) / 1000;
std::vector<PacketInfo> packets;
- packets.push_back(PacketInfo(kHighArrivalTimeMs - 64, 200, 0, 1500,
+ packets.push_back(PacketInfo(kHighArrivalTimeMs - 64, 200, 0, 1500, true,
PacketInfo::kNotAProbe));
- packets.push_back(PacketInfo(kHighArrivalTimeMs + 64, 210, 1, 1500,
+ packets.push_back(PacketInfo(kHighArrivalTimeMs + 64, 210, 1, 1500, true,
PacketInfo::kNotAProbe));
- packets.push_back(
- PacketInfo(kHighArrivalTimeMs, 220, 2, 1500, PacketInfo::kNotAProbe));
+ packets.push_back(PacketInfo(kHighArrivalTimeMs, 220, 2, 1500, true,
+ PacketInfo::kNotAProbe));
for (const PacketInfo& packet : packets)
OnSentPacket(packet);
@@ -228,9 +229,9 @@
TEST_F(TransportFeedbackAdapterTest, HandlesReordering) {
std::vector<PacketInfo> packets;
- packets.push_back(PacketInfo(120, 200, 0, 1500, 0));
- packets.push_back(PacketInfo(110, 210, 1, 1500, 0));
- packets.push_back(PacketInfo(100, 220, 2, 1500, 0));
+ packets.push_back(PacketInfo(120, 200, 0, 1500, true, 0));
+ packets.push_back(PacketInfo(110, 210, 1, 1500, true, 0));
+ packets.push_back(PacketInfo(100, 220, 2, 1500, true, 0));
std::vector<PacketInfo> expected_packets;
expected_packets.push_back(packets[2]);
expected_packets.push_back(packets[1]);
diff --git a/webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h b/webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h
index 05320f7..8875d65 100644
--- a/webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h
+++ b/webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h
@@ -251,18 +251,21 @@
-1,
sequence_number,
0,
+ false,
kNotAProbe) {}
PacketInfo(int64_t arrival_time_ms,
int64_t send_time_ms,
uint16_t sequence_number,
size_t payload_size,
+ bool was_paced,
int probe_cluster_id)
: PacketInfo(-1,
arrival_time_ms,
send_time_ms,
sequence_number,
payload_size,
+ was_paced,
probe_cluster_id) {}
PacketInfo(int64_t creation_time_ms,
@@ -270,12 +273,14 @@
int64_t send_time_ms,
uint16_t sequence_number,
size_t payload_size,
+ bool was_paced,
int probe_cluster_id)
: creation_time_ms(creation_time_ms),
arrival_time_ms(arrival_time_ms),
send_time_ms(send_time_ms),
sequence_number(sequence_number),
payload_size(payload_size),
+ was_paced(was_paced),
probe_cluster_id(probe_cluster_id) {}
static constexpr int kNotAProbe = -1;
@@ -293,6 +298,8 @@
uint16_t sequence_number;
// Size of the packet excluding RTP headers.
size_t payload_size;
+ // True if the packet was paced out by the pacer.
+ bool was_paced;
// Which probing cluster this packets belongs to.
int probe_cluster_id;
};
@@ -306,6 +313,7 @@
// must be set to 0.
virtual void AddPacket(uint16_t sequence_number,
size_t length,
+ bool was_paced,
int probe_cluster_id) = 0;
virtual void OnTransportFeedback(const rtcp::TransportFeedback& feedback) = 0;
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc
index 9b6b72ae..fe0e49f 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc
@@ -719,7 +719,7 @@
length, rtp_header)) {
if (transport_feedback_observer_)
transport_feedback_observer_->AddPacket(options.packet_id, length,
- probe_cluster_id);
+ true, probe_cluster_id);
}
}
@@ -980,7 +980,7 @@
if (UpdateTransportSequenceNumber(options.packet_id, buffer_to_send_ptr,
length, rtp_header)) {
if (transport_feedback_observer_)
- transport_feedback_observer_->AddPacket(options.packet_id, length,
+ transport_feedback_observer_->AddPacket(options.packet_id, length, true,
probe_cluster_id);
}
}
@@ -1111,7 +1111,7 @@
if (UpdateTransportSequenceNumber(options.packet_id, buffer, length,
rtp_header)) {
if (transport_feedback_observer_)
- transport_feedback_observer_->AddPacket(options.packet_id, length,
+ transport_feedback_observer_->AddPacket(options.packet_id, length, true,
PacketInfo::kNotAProbe);
}
}
diff --git a/webrtc/video/rtp_stream_receiver.cc b/webrtc/video/rtp_stream_receiver.cc
index 90e449c..57ae87c 100644
--- a/webrtc/video/rtp_stream_receiver.cc
+++ b/webrtc/video/rtp_stream_receiver.cc
@@ -310,7 +310,7 @@
}
remote_bitrate_estimator_->IncomingPacket(arrival_time_ms, payload_length,
- header);
+ header, true);
header.payload_type_frequency = kVideoPayloadTypeFrequency;
bool in_order = IsPacketInOrder(header);
diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc
index 943a045..d879fe8 100644
--- a/webrtc/voice_engine/channel.cc
+++ b/webrtc/voice_engine/channel.cc
@@ -75,11 +75,13 @@
// Implements TransportFeedbackObserver.
void AddPacket(uint16_t sequence_number,
size_t length,
+ bool was_paced,
int probe_cluster_id) override {
RTC_DCHECK(pacer_thread_.CalledOnValidThread());
rtc::CritScope lock(&crit_);
if (feedback_observer_)
- feedback_observer_->AddPacket(sequence_number, length, probe_cluster_id);
+ feedback_observer_->AddPacket(sequence_number, length, was_paced,
+ probe_cluster_id);
}
void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override {
RTC_DCHECK(network_thread_.CalledOnValidThread());