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

Unified Diff: webrtc/modules/pacing/paced_sender.cc

Issue 2994323002: Don't boost pacing rate after pause. (Closed)
Patch Set: Created 3 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/modules/pacing/paced_sender.h ('k') | webrtc/modules/pacing/paced_sender_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/modules/pacing/paced_sender.cc
diff --git a/webrtc/modules/pacing/paced_sender.cc b/webrtc/modules/pacing/paced_sender.cc
index bf1c6eceee2c98ffbcaee205ad416df06d0b3034..2442bf0723631cbd21e883ea146b49c0bdfe1728 100644
--- a/webrtc/modules/pacing/paced_sender.cc
+++ b/webrtc/modules/pacing/paced_sender.cc
@@ -55,6 +55,7 @@ struct Packet {
sequence_number(seq_number),
capture_time_ms(capture_time_ms),
enqueue_time_ms(enqueue_time_ms),
+ sum_paused_ms(0),
bytes(length_in_bytes),
retransmission(retransmission),
enqueue_order(enqueue_order) {}
@@ -62,8 +63,9 @@ struct Packet {
RtpPacketSender::Priority priority;
uint32_t ssrc;
uint16_t sequence_number;
- int64_t capture_time_ms;
- int64_t enqueue_time_ms;
+ int64_t capture_time_ms; // Absolute time of frame capture.
+ int64_t enqueue_time_ms; // Absolute time of pacer queue entry.
+ int64_t sum_paused_ms; // Sum of time spent in queue while pacer is paused.
size_t bytes;
bool retransmission;
uint64_t enqueue_order;
@@ -96,7 +98,8 @@ class PacketQueue {
: bytes_(0),
clock_(clock),
queue_time_sum_(0),
- time_last_updated_(clock_->TimeInMilliseconds()) {}
+ time_last_updated_(clock_->TimeInMilliseconds()),
+ paused_(false) {}
virtual ~PacketQueue() {}
void Push(const Packet& packet) {
@@ -126,7 +129,11 @@ class PacketQueue {
void FinalizePop(const Packet& packet) {
RemoveFromDupeSet(packet);
bytes_ -= packet.bytes;
- queue_time_sum_ -= (time_last_updated_ - packet.enqueue_time_ms);
+ int64_t packet_queue_time_ms = time_last_updated_ - packet.enqueue_time_ms;
+ RTC_DCHECK_LE(packet.sum_paused_ms, packet_queue_time_ms);
+ packet_queue_time_ms -= packet.sum_paused_ms;
+ RTC_DCHECK_LE(packet_queue_time_ms, queue_time_sum_);
+ queue_time_sum_ -= packet_queue_time_ms;
packet_list_.erase(packet.this_it);
RTC_DCHECK_EQ(packet_list_.size(), prio_queue_.size());
if (packet_list_.empty())
@@ -148,14 +155,34 @@ class PacketQueue {
void UpdateQueueTime(int64_t timestamp_ms) {
RTC_DCHECK_GE(timestamp_ms, time_last_updated_);
- int64_t delta = timestamp_ms - time_last_updated_;
- // Use packet packet_list_.size() not prio_queue_.size() here, as there
- // might be an outstanding element popped from prio_queue_ currently in the
- // SendPacket() call, while packet_list_ will always be correct.
- queue_time_sum_ += delta * packet_list_.size();
+ if (timestamp_ms == time_last_updated_)
+ return;
+
+ int64_t delta_ms = timestamp_ms - time_last_updated_;
+
+ if (paused_) {
+ // Increase per-packet accumulators of time spent in queue while paused,
+ // so that we can disregard that when subtracting main accumulator when
+ // popping packet from the queue.
+ for (auto& it : packet_list_) {
+ it.sum_paused_ms += delta_ms;
+ }
+ } else {
+ // Use packet packet_list_.size() not prio_queue_.size() here, as there
+ // might be an outstanding element popped from prio_queue_ currently in
+ // the SendPacket() call, while packet_list_ will always be correct.
+ queue_time_sum_ += delta_ms * packet_list_.size();
+ }
time_last_updated_ = timestamp_ms;
}
+ void SetPauseState(bool paused, int64_t timestamp_ms) {
+ if (paused_ == paused)
+ return;
+ UpdateQueueTime(timestamp_ms);
+ paused_ = paused;
+ }
+
int64_t AverageQueueTimeMs() const {
if (prio_queue_.empty())
return 0;
@@ -200,6 +227,7 @@ class PacketQueue {
const Clock* const clock_;
int64_t queue_time_sum_;
int64_t time_last_updated_;
+ bool paused_;
};
} // namespace paced_sender
@@ -243,6 +271,7 @@ void PacedSender::Pause() {
{
rtc::CritScope cs(&critsect_);
paused_ = true;
+ packets_->SetPauseState(true, clock_->TimeInMilliseconds());
}
// Tell the process thread to call our TimeUntilNextProcess() method to get
// a new (longer) estimate for when to call Process().
@@ -255,6 +284,7 @@ void PacedSender::Resume() {
{
rtc::CritScope cs(&critsect_);
paused_ = false;
+ packets_->SetPauseState(false, clock_->TimeInMilliseconds());
}
// Tell the process thread to call our TimeUntilNextProcess() method to
// refresh the estimate for when to call Process().
« no previous file with comments | « webrtc/modules/pacing/paced_sender.h ('k') | webrtc/modules/pacing/paced_sender_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698