Chromium Code Reviews| 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_); |
| } |