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

Unified Diff: webrtc/modules/video_coding/packet_buffer.cc

Issue 2399373002: Only advance |first_seq_num_| if packets are explicitly cleared from the PacketBuffer. (Closed)
Patch Set: Created 4 years, 2 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
Index: webrtc/modules/video_coding/packet_buffer.cc
diff --git a/webrtc/modules/video_coding/packet_buffer.cc b/webrtc/modules/video_coding/packet_buffer.cc
index bd0cf75548eeb2203de6f467762f30164aafa7a1..745ec6dbe7b09d0b3c5460505d1f00e13470819f 100644
--- a/webrtc/modules/video_coding/packet_buffer.cc
+++ b/webrtc/modules/video_coding/packet_buffer.cc
@@ -42,6 +42,7 @@ PacketBuffer::PacketBuffer(Clock* clock,
first_seq_num_(0),
last_seq_num_(0),
first_packet_received_(false),
+ has_cleared_to_(false),
data_buffer_(start_buffer_size),
sequence_buffer_(start_buffer_size),
received_frame_callback_(received_frame_callback) {
@@ -59,9 +60,16 @@ bool PacketBuffer::InsertPacket(const VCMPacket& packet) {
size_t index = seq_num % size_;
if (!first_packet_received_) {
- first_seq_num_ = seq_num - 1;
+ first_seq_num_ = seq_num;
last_seq_num_ = seq_num;
first_packet_received_ = true;
+ } else if (AheadOf(first_seq_num_, seq_num)) {
+ // If we have explicitly cleared past this packet then it's old,
+ // don't insert it.
+ if (has_cleared_to_)
+ return false;
+
+ first_seq_num_ = seq_num;
}
if (sequence_buffer_[index].used) {
@@ -106,19 +114,40 @@ bool PacketBuffer::InsertPacket(const VCMPacket& packet) {
void PacketBuffer::ClearTo(uint16_t seq_num) {
danilchap 2016/10/07 18:25:37 when this function is called? juts tests for now?
philipel 2016/10/18 12:22:19 For now, just in tests, but it will be used for th
rtc::CritScope lock(&crit_);
+
+ // If the packet buffer was cleared between a frame was created and returned.
+ if (!first_packet_received_)
+ return;
+
+ has_cleared_to_ = true;
size_t index = first_seq_num_ % size_;
danilchap 2016/10/07 18:25:37 may be move this statement inside while loop. no n
philipel 2016/10/18 12:22:19 Done.
- while (AheadOf<uint16_t>(seq_num, first_seq_num_ + 1)) {
- index = (index + 1) % size_;
- ++first_seq_num_;
+ while (AheadOrAt<uint16_t>(seq_num, first_seq_num_)) {
delete[] data_buffer_[index].dataPtr;
data_buffer_[index].dataPtr = nullptr;
sequence_buffer_[index].used = false;
+ index = (index + 1) % size_;
+ ++first_seq_num_;
}
}
+void PacketBuffer::Clear() {
+ rtc::CritScope lock(&crit_);
+ for (size_t i = 0; i < size_; ++i) {
+ if (sequence_buffer_[i].used)
+ delete[] data_buffer_[i].dataPtr;
+ sequence_buffer_[i].used = false;
+ }
+
+ first_packet_received_ = false;
+ has_cleared_to_ = false;
+}
+
bool PacketBuffer::ExpandBufferSize() {
- if (size_ == max_size_)
+ if (size_ == max_size_) {
+ LOG(LS_WARNING) << "PacketBuffer is already at max size (" << max_size_
+ << "), failed to increase size.";
return false;
+ }
size_t new_size = std::min(max_size_, 2 * size_);
std::vector<VCMPacket> new_data_buffer(new_size);
@@ -133,10 +162,11 @@ bool PacketBuffer::ExpandBufferSize() {
size_ = new_size;
sequence_buffer_ = std::move(new_sequence_buffer);
data_buffer_ = std::move(new_data_buffer);
+ LOG(LS_INFO) << "PacketBuffer size expanded to " << new_size;
return true;
}
-bool PacketBuffer::IsContinuous(uint16_t seq_num) const {
+bool PacketBuffer::PotentialNewFrame(uint16_t seq_num) const {
size_t index = seq_num % size_;
int prev_index = index > 0 ? index - 1 : size_ - 1;
@@ -144,13 +174,17 @@ bool PacketBuffer::IsContinuous(uint16_t seq_num) const {
return false;
if (sequence_buffer_[index].frame_created)
return false;
- if (sequence_buffer_[index].frame_begin)
+ if (sequence_buffer_[index].frame_begin &&
+ (!sequence_buffer_[prev_index].used ||
+ AheadOf(seq_num, sequence_buffer_[prev_index].seq_num))) {
return true;
+ }
if (!sequence_buffer_[prev_index].used)
return false;
if (sequence_buffer_[prev_index].seq_num !=
- static_cast<uint16_t>(seq_num - 1))
+ sequence_buffer_[index].seq_num - 1) {
danilchap 2016/10/07 18:25:37 add some tests to check seq_num = 0 wraps properly
philipel 2016/10/18 12:22:19 Done.
return false;
+ }
if (sequence_buffer_[prev_index].continuous)
return true;
@@ -159,7 +193,7 @@ bool PacketBuffer::IsContinuous(uint16_t seq_num) const {
void PacketBuffer::FindFrames(uint16_t seq_num) {
size_t index = seq_num % size_;
- while (IsContinuous(seq_num)) {
+ while (PotentialNewFrame(seq_num)) {
sequence_buffer_[index].continuous = true;
// If all packets of the frame is continuous, find the first packet of the
@@ -212,13 +246,6 @@ void PacketBuffer::ReturnFrame(RtpFrameObject* frame) {
index = (index + 1) % size_;
++seq_num;
}
-
- index = first_seq_num_ % size_;
- while (AheadOf<uint16_t>(last_seq_num_, first_seq_num_) &&
- !sequence_buffer_[index].used) {
- ++first_seq_num_;
- index = (index + 1) % size_;
- }
}
bool PacketBuffer::GetBitstream(const RtpFrameObject& frame,
@@ -254,14 +281,6 @@ VCMPacket* PacketBuffer::GetPacket(uint16_t seq_num) {
return &data_buffer_[index];
}
-void PacketBuffer::Clear() {
- rtc::CritScope lock(&crit_);
- for (size_t i = 0; i < size_; ++i)
- sequence_buffer_[i].used = false;
-
- first_packet_received_ = false;
-}
-
int PacketBuffer::AddRef() const {
return rtc::AtomicOps::Increment(&ref_count_);
}

Powered by Google App Engine
This is Rietveld 408576698